diff --git a/.github/workflows/bloat_check.yaml b/.github/workflows/bloat_check.yaml index 6ac96aebb7ed4c..a49cfbd58fa686 100644 --- a/.github/workflows/bloat_check.yaml +++ b/.github/workflows/bloat_check.yaml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 steps: - name: Checkout diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 895e7260d1ba8a..bcccb51a49f8c9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -43,7 +43,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -139,7 +139,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -308,7 +308,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -373,7 +373,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -492,7 +492,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/check-data-model-directory-updates.yaml b/.github/workflows/check-data-model-directory-updates.yaml index 7bd20c87e0e4ec..f0b18412e3025a 100644 --- a/.github/workflows/check-data-model-directory-updates.yaml +++ b/.github/workflows/check-data-model-directory-updates.yaml @@ -36,4 +36,28 @@ jobs: python3 scripts/dm_xml_ci_change_enforcement.py data_model/1.3 - name: Check for changes to 1.4 data_model directory without a SHA update run: | - python3 scripts/dm_xml_ci_change_enforcement.py data_model/1.4 \ No newline at end of file + python3 scripts/dm_xml_ci_change_enforcement.py data_model/1.4 + - name: Check for changes to 1.4.1 data_model directory without a SHA update + run: | + python3 scripts/dm_xml_ci_change_enforcement.py data_model/1.4.1 + + check-data_model-build-file: + name: Check that all data_model files are listed in the data_model_xmls.gni build file + runs-on: ubuntu-latest + container: + image: ghcr.io/project-chip/chip-build + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup pip modules we use + run: | + python3 -m venv out/venv + out/venv/bin/pip3 install \ + jinja2 + - name: Generate build file (data_model_xmls.gni) + run: out/venv/bin/python3 src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py + - name: Ensure git works in current working directory + run: git config --global --add safe.directory `pwd` + - name: Check for uncommited changes + run: | + git diff --exit-code HEAD -- src/python_testing/matter_testing_infrastructure/data_model_xmls.gni \ No newline at end of file diff --git a/.github/workflows/chef.yaml b/.github/workflows/chef.yaml index e6bcb180748cb3..b80aad17e2f7f2 100644 --- a/.github/workflows/chef.yaml +++ b/.github/workflows/chef.yaml @@ -36,7 +36,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 options: --user root steps: @@ -57,7 +57,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-esp32:98 + image: ghcr.io/project-chip/chip-build-esp32:104 options: --user root steps: @@ -78,7 +78,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nrf-platform:98 + image: ghcr.io/project-chip/chip-build-nrf-platform:104 options: --user root steps: @@ -99,7 +99,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-telink:98 + image: ghcr.io/project-chip/chip-build-telink:104 options: --user root steps: @@ -111,7 +111,7 @@ jobs: platform: telink # - name: Update Zephyr to specific revision (for developers purpose) # shell: bash - # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py c05c461b1119782cc839cf436fa04ec5e1fb2c8c" + # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py 52c23bb5bfa7b08fb2499fda8c34cbd3418e0c1d" - name: CI Examples Telink shell: bash run: | diff --git a/.github/workflows/doxygen.yaml b/.github/workflows/doxygen.yaml index 9cc5751ab310d3..21c0d452c1f7f9 100644 --- a/.github/workflows/doxygen.yaml +++ b/.github/workflows/doxygen.yaml @@ -84,7 +84,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-doxygen:98 + image: ghcr.io/project-chip/chip-build-doxygen:104 if: github.actor != 'restyled-io[bot]' diff --git a/.github/workflows/examples-ameba.yaml b/.github/workflows/examples-ameba.yaml index 121610d215123e..6bb87fd97257bb 100644 --- a/.github/workflows/examples-ameba.yaml +++ b/.github/workflows/examples-ameba.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ameba:98 + image: ghcr.io/project-chip/chip-build-ameba:104 options: --user root steps: diff --git a/.github/workflows/examples-asr.yaml b/.github/workflows/examples-asr.yaml index 5302926ed7fc97..a753d338c4c212 100644 --- a/.github/workflows/examples-asr.yaml +++ b/.github/workflows/examples-asr.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-asr:98 + image: ghcr.io/project-chip/chip-build-asr:104 options: --user root steps: diff --git a/.github/workflows/examples-bouffalolab.yaml b/.github/workflows/examples-bouffalolab.yaml index 6fcb047e98e3ec..2d1ec2d7a2cd2c 100644 --- a/.github/workflows/examples-bouffalolab.yaml +++ b/.github/workflows/examples-bouffalolab.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-bouffalolab:98 + image: ghcr.io/project-chip/chip-build-bouffalolab:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-cc13xx_26xx.yaml b/.github/workflows/examples-cc13xx_26xx.yaml index b879eb5025bdb5..35bdccbe274475 100644 --- a/.github/workflows/examples-cc13xx_26xx.yaml +++ b/.github/workflows/examples-cc13xx_26xx.yaml @@ -42,7 +42,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ti:98 + image: ghcr.io/project-chip/chip-build-ti:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-cc32xx.yaml b/.github/workflows/examples-cc32xx.yaml index 5516d4374641a7..cb874238157362 100644 --- a/.github/workflows/examples-cc32xx.yaml +++ b/.github/workflows/examples-cc32xx.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ti:98 + image: ghcr.io/project-chip/chip-build-ti:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml index c1b8253b336f24..855be84ced625f 100644 --- a/.github/workflows/examples-efr32.yaml +++ b/.github/workflows/examples-efr32.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-efr32:98 + image: ghcr.io/project-chip/chip-build-efr32:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-esp32.yaml b/.github/workflows/examples-esp32.yaml index 09f7141f340edd..b65df551436f92 100644 --- a/.github/workflows/examples-esp32.yaml +++ b/.github/workflows/examples-esp32.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-esp32:98 + image: ghcr.io/project-chip/chip-build-esp32:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -132,7 +132,7 @@ jobs: if: github.actor != 'restyled-io[bot]' && github.repository_owner == 'espressif' container: - image: ghcr.io/project-chip/chip-build-esp32:98 + image: ghcr.io/project-chip/chip-build-esp32:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-infineon.yaml b/.github/workflows/examples-infineon.yaml index 52bc9f9752340a..4cf54ff65960f7 100644 --- a/.github/workflows/examples-infineon.yaml +++ b/.github/workflows/examples-infineon.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-infineon:98 + image: ghcr.io/project-chip/chip-build-infineon:104 env: # TODO: this should probably be part of the dockerfile itself CY_TOOLS_PATHS: /opt/Tools/ModusToolbox/tools_3.2 diff --git a/.github/workflows/examples-linux-arm.yaml b/.github/workflows/examples-linux-arm.yaml index 0edd77681284de..7c576dd68cd993 100644 --- a/.github/workflows/examples-linux-arm.yaml +++ b/.github/workflows/examples-linux-arm.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-crosscompile:98 + image: ghcr.io/project-chip/chip-build-crosscompile:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-linux-imx.yaml b/.github/workflows/examples-linux-imx.yaml index a43aadee9dfac9..72458c39656c2e 100644 --- a/.github/workflows/examples-linux-imx.yaml +++ b/.github/workflows/examples-linux-imx.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-imx:98 + image: ghcr.io/project-chip/chip-build-imx:104 steps: - name: Checkout diff --git a/.github/workflows/examples-linux-standalone.yaml b/.github/workflows/examples-linux-standalone.yaml index 021640438b22a3..0e5a6d3e6ef876 100644 --- a/.github/workflows/examples-linux-standalone.yaml +++ b/.github/workflows/examples-linux-standalone.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-linux-tv-casting-app.yaml b/.github/workflows/examples-linux-tv-casting-app.yaml index 85ca839cb85651..392f7aadb440be 100644 --- a/.github/workflows/examples-linux-tv-casting-app.yaml +++ b/.github/workflows/examples-linux-tv-casting-app.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 steps: - name: Checkout diff --git a/.github/workflows/examples-mw320.yaml b/.github/workflows/examples-mw320.yaml index 9cec1c6f94d783..1b745f9ce6cd3c 100644 --- a/.github/workflows/examples-mw320.yaml +++ b/.github/workflows/examples-mw320.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-nrfconnect.yaml b/.github/workflows/examples-nrfconnect.yaml index 97034e77f3aa57..0f946882891aff 100644 --- a/.github/workflows/examples-nrfconnect.yaml +++ b/.github/workflows/examples-nrfconnect.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nrf-platform:98 + image: ghcr.io/project-chip/chip-build-nrf-platform:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -193,11 +193,12 @@ jobs: nrfconnect nrf7002dk_nrf5340_cpuapp all-clusters-app \ examples/all-clusters-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ /tmp/bloat_reports/ - # Disable native build until next release - # - name: Run unit tests for Zephyr native_posix_64 platform - # if: github.event_name == 'push' || steps.changed_paths.outputs.tests == 'true' || steps.changed_paths.outputs.nrfconnect == 'true' - # run: | - # scripts/run_in_build_env.sh "./scripts/build/build_examples.py --target nrf-native-posix-64-tests build" + - name: Run unit tests for Zephyr native_posix_64 platform + if: github.event_name == 'push' || steps.changed_paths.outputs.tests == 'true' || steps.changed_paths.outputs.nrfconnect == 'true' + run: | + # Temporarily fix link issue + sed -i '151s/ //' /opt/NordicSemiconductor/nrfconnect/zephyr/cmake/linker/ld/target.cmake + scripts/run_in_build_env.sh "./scripts/build/build_examples.py --target nrf-native-posix-64-tests build" - name: Uploading Failed Test Logs uses: actions/upload-artifact@v4 if: ${{ failure() && !env.ACT }} diff --git a/.github/workflows/examples-nuttx.yaml b/.github/workflows/examples-nuttx.yaml index 6fa6500abbf4fd..f32610349e11f2 100644 --- a/.github/workflows/examples-nuttx.yaml +++ b/.github/workflows/examples-nuttx.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nuttx:98 + image: ghcr.io/project-chip/chip-build-nuttx:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml index 870de18bda3a1a..adfeb2196e03ce 100644 --- a/.github/workflows/examples-nxp.yaml +++ b/.github/workflows/examples-nxp.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nxp:98 + image: ghcr.io/project-chip/chip-build-nxp:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: @@ -239,7 +239,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nxp-zephyr:98 + image: ghcr.io/project-chip/chip-build-nxp-zephyr:104 steps: - name: Checkout diff --git a/.github/workflows/examples-openiotsdk.yaml b/.github/workflows/examples-openiotsdk.yaml index a392c00720d698..d0a0a46d79463b 100644 --- a/.github/workflows/examples-openiotsdk.yaml +++ b/.github/workflows/examples-openiotsdk.yaml @@ -36,7 +36,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-openiotsdk:98 + image: ghcr.io/project-chip/chip-build-openiotsdk:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" options: --privileged diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml index 630e81eb8d2a86..adfd33920c5a30 100644 --- a/.github/workflows/examples-qpg.yaml +++ b/.github/workflows/examples-qpg.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-stm32.yaml b/.github/workflows/examples-stm32.yaml index 2682fc6ef3b915..387d6bba6e2307 100644 --- a/.github/workflows/examples-stm32.yaml +++ b/.github/workflows/examples-stm32.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-telink.yaml b/.github/workflows/examples-telink.yaml index 95fdb770933d07..22905124813572 100644 --- a/.github/workflows/examples-telink.yaml +++ b/.github/workflows/examples-telink.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-telink:98 + image: ghcr.io/project-chip/chip-build-telink:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -58,7 +58,7 @@ jobs: gh-context: ${{ toJson(github) }} # - name: Update Zephyr to specific revision (for developers purpose) - # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py c05c461b1119782cc839cf436fa04ec5e1fb2c8c" + # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py 52c23bb5bfa7b08fb2499fda8c34cbd3418e0c1d" - name: Build example Telink (B92 retention) Air Quality Sensor App # Run test for master and s07641069 PRs @@ -103,14 +103,14 @@ jobs: - name: clean out build output run: rm -rf ./out - - name: Build example Telink (B95) Bridge App + - name: Build example Telink (tl721x) Bridge App # Run test for master and all PRs run: | ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9258a-bridge' build" + "./scripts/build/build_examples.py --target 'telink-tl7218x-bridge' build" .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9258a bridge-app \ - out/telink-tlsr9258a-bridge/zephyr/zephyr.elf \ + telink tl7218x bridge-app \ + out/telink-tl7218x-bridge/zephyr/zephyr.elf \ /tmp/bloat_reports/ - name: clean out build output @@ -167,14 +167,14 @@ jobs: - name: clean out build output (keep tools) run: rm -rf ./out/telink* - - name: Build example Telink (tl321x) Lighting App with OTA (LZMA), Shell, Factory Data + - name: Build example Telink (tl321x) Lighting App with OTA, Shell, Factory Data # Run test for master and all PRs run: | ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tl3218x-light-ota-compress-lzma-shell-factory-data' build" + "./scripts/build/build_examples.py --target 'telink-tl3218x-light-ota-shell-factory-data' build" .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tl3218x light-app-ota-compress-lzma-shell-factory-data \ - out/telink-tl3218x-light-ota-compress-lzma-shell-factory-data/zephyr/zephyr.elf \ + telink tl3218x light-app-ota-shell-factory-data \ + out/telink-tl3218x-light-ota-shell-factory-data/zephyr/zephyr.elf \ /tmp/bloat_reports/ - name: clean out build output (keep tools) @@ -193,6 +193,19 @@ jobs: - name: clean out build output (keep tools) run: rm -rf ./out/telink* + - name: Build example Telink (tl721x retention) Light Switch App with OTA (LZMA), Factory Data + # Run test for master and all PRs + run: | + ./scripts/run_in_build_env.sh \ + "./scripts/build/build_examples.py --target 'telink-tl7218x_retention-light-switch-ota-compress-lzma-factory-data' build" + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + telink tl7218x_retention light-switch-app-ota-compress-lzma-factory-data \ + out/telink-tl7218x_retention-light-switch-ota-compress-lzma-factory-data/zephyr/zephyr.elf \ + /tmp/bloat_reports/ + + - name: clean out build output (keep tools) + run: rm -rf ./out/telink* + - name: Build example Telink (B92) Light Switch App with OTA (LZMA), Shell, Factory Data # Run test for master and all PRs run: | @@ -220,15 +233,15 @@ jobs: - name: clean out build output run: rm -rf ./out - - name: Build example Telink (B95) OTA Requestor App + - name: Build example Telink (tl321x) OTA Requestor App # Run test for master and s07641069 PRs if: github.event.pull_request.number == null || github.event.pull_request.head.repo.full_name == 's07641069/connectedhomeip' run: | ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9258a-ota-requestor' build" + "./scripts/build/build_examples.py --target 'telink-tl3218x-ota-requestor' build" .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9258a ota-requestor-app \ - out/telink-tlsr9258a-ota-requestor/zephyr/zephyr.elf \ + telink tl3218x ota-requestor-app \ + out/telink-tl3218x-ota-requestor/zephyr/zephyr.elf \ /tmp/bloat_reports/ - name: clean out build output diff --git a/.github/workflows/full-android.yaml b/.github/workflows/full-android.yaml index 0e116e8062b03a..c0a2692b0beb1b 100644 --- a/.github/workflows/full-android.yaml +++ b/.github/workflows/full-android.yaml @@ -33,13 +33,13 @@ jobs: name: Run env: - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64/ + JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64/ runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-android:98 + image: ghcr.io/project-chip/chip-build-android:108 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/fuzzing-build.yaml b/.github/workflows/fuzzing-build.yaml index 5bc8c6c6f01cc1..8a1ffbc248bb3a 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:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/java-tests.yaml b/.github/workflows/java-tests.yaml index 87122ced0e47d3..ad95d3dec7ad03 100644 --- a/.github/workflows/java-tests.yaml +++ b/.github/workflows/java-tests.yaml @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-java:98 + image: ghcr.io/project-chip/chip-build-java:104 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 3abc726c30ad00..6d5a272c0e1e49 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -114,7 +114,6 @@ jobs: --known-failure app/util/config.h \ --known-failure app/util/DataModelHandler.cpp \ --known-failure app/util/DataModelHandler.h \ - --known-failure app/util/ember-global-attribute-access-interface.h \ --known-failure app/util/ember-io-storage.h \ --known-failure app/util/endpoint-config-api.h \ --known-failure app/util/generic-callbacks.h \ @@ -133,7 +132,6 @@ jobs: # for them. Keeping them as a list as they still need review ... # --known-failure app/util/attribute-table.cpp \ # --known-failure app/util/ember-io-storage.cpp \ - # --known-failure app/util/ember-global-attribute-access-interface.cpp \ # --known-failure app/util/attribute-storage.cpp \ - name: Check for matter lint errors if: always() diff --git a/.github/workflows/minimal-build.yaml b/.github/workflows/minimal-build.yaml index fa9bff4a0735a3..c921662e1b4bc3 100644 --- a/.github/workflows/minimal-build.yaml +++ b/.github/workflows/minimal-build.yaml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-minimal:98 + image: ghcr.io/project-chip/chip-build-minimal:104 steps: - name: Checkout @@ -56,7 +56,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-minimal:98 + image: ghcr.io/project-chip/chip-build-minimal:104 steps: - name: Checkout diff --git a/.github/workflows/qemu.yaml b/.github/workflows/qemu.yaml index c498eb9016cab4..8624b06bbd5c11 100644 --- a/.github/workflows/qemu.yaml +++ b/.github/workflows/qemu.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' && github.repository_owner == 'espressif' container: - image: ghcr.io/project-chip/chip-build-esp32-qemu:98 + image: ghcr.io/project-chip/chip-build-esp32-qemu:104 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml index c513764852d1a4..bfa311bf17f7e0 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:98 + image: ghcr.io/project-chip/chip-build-esp32:104 steps: - name: Checkout @@ -64,7 +64,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-efr32:98 + image: ghcr.io/project-chip/chip-build-efr32:104 steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/smoketest-android.yaml b/.github/workflows/smoketest-android.yaml index 9d98d0faaca4b7..5712f3427dc848 100644 --- a/.github/workflows/smoketest-android.yaml +++ b/.github/workflows/smoketest-android.yaml @@ -31,13 +31,13 @@ jobs: name: Smoke Run - Android env: - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64/ + JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64/ runs-on: ubuntu-latest if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-android:98 + image: ghcr.io/project-chip/chip-build-android:108 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7b5286ebefa7c3..1ac9f82f88374d 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -50,7 +50,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" @@ -461,7 +461,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0" @@ -546,6 +546,22 @@ jobs: scripts/run_in_python_env.sh out/venv 'src/python_testing/execute_python_tests.py --env-file /tmp/test_env.yaml --search-directory src/python_testing' scripts/run_in_python_env.sh out/venv 'scripts/tests/TestTimeSyncTrustedTimeSourceRunner.py --all-clusters out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app' + - name: Execute Jupyter Notebooks + run: | + scripts/run_in_build_env.sh './scripts/build_python.sh --jupyter-lab --install_virtual_env out/venv' + ./scripts/run_in_build_env.sh \ + "./scripts/build/build_examples.py \ + --target linux-x64-all-clusters-ipv6only-no-ble-no-wifi-clang-test \ + build \ + --copy-artifacts-to objdir-clone \ + " + scripts/run_in_python_env.sh out/venv \ + "jupyter execute docs/development_controllers/chip-repl/Matter_REPL_Intro.ipynb \ + docs/development_controllers/chip-repl/Matter_Basic_Interactions.ipynb \ + docs/development_controllers/chip-repl/Matter_Access_Control.ipynb \ + docs/development_controllers/chip-repl/Matter_Multi_Fabric_Commissioning.ipynb \ + " + - name: Uploading core files uses: actions/upload-artifact@v4 if: ${{ failure() && !env.ACT }} diff --git a/.github/workflows/unit_integration_test.yaml b/.github/workflows/unit_integration_test.yaml index 8a24ae45728ad8..0b0860afe7f995 100644 --- a/.github/workflows/unit_integration_test.yaml +++ b/.github/workflows/unit_integration_test.yaml @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/zap_regeneration.yaml b/.github/workflows/zap_regeneration.yaml index 9baec065c4fde7..d899b05b8a7cb8 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:98 + image: ghcr.io/project-chip/chip-build:104 defaults: run: shell: sh diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml index 51752e3fac8f0d..f03aa04605b2af 100644 --- a/.github/workflows/zap_templates.yaml +++ b/.github/workflows/zap_templates.yaml @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-20.04 container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 defaults: run: shell: sh diff --git a/.gitmodules b/.gitmodules index 4eca51b5cf03f9..e2163ae52ce266 100644 --- a/.gitmodules +++ b/.gitmodules @@ -207,7 +207,7 @@ platforms = mw320 [submodule "third_party/silabs/matter_support"] path = third_party/silabs/matter_support - url = https://github.com/SiliconLabs/sdk_support.git + url = https://github.com/SiliconLabsSoftware/matter_support.git branch = main platforms = silabs,silabs_docker [submodule "third_party/silabs/simplicity_sdk"] diff --git a/config/telink/chip-module/Kconfig.defaults b/config/telink/chip-module/Kconfig.defaults index e50aa413b90fa6..baafafa38a525d 100644 --- a/config/telink/chip-module/Kconfig.defaults +++ b/config/telink/chip-module/Kconfig.defaults @@ -206,7 +206,7 @@ endif # BT # Cut down the ram cost by matter's change,it can keep ramcode (driver). # No need load the ramcode every time in thread mode (retention mode). # If the ram is not enough , can change it back , initial setting is n. -if BOARD_TLSR9528A_RETENTION || BOARD_TLSR9258A_RETENTION || BOARD_TLSR9518ADK80D_RETENTION +if BOARD_TLSR9528A_RETENTION || BOARD_TLSR9518ADK80D_RETENTION config SOC_SERIES_RISCV_TELINK_B9X_NON_RETENTION_RAM_CODE default n if PM @@ -218,9 +218,21 @@ config PWM endif +if BOARD_TL7218X_RETENTION || BOARD_TL3218X_RETENTION || BOARD_TL3218X +config SOC_SERIES_RISCV_TELINK_TLX_NON_RETENTION_RAM_CODE + default n if PM + +config TELINK_TLX_MATTER_RETENTION_LAYOUT + default y if PM || BOARD_TL3218X + +config PWM + default n if PM + +endif + # Board non-retention config if BOARD_TLSR9118BDK40D || BOARD_TLSR9118BDK40D_V1 || \ - BOARD_TLSR9528A || BOARD_TLSR9258A || BOARD_TLSR9518ADK80D || BOARD_TL3218X || BOARD_TL7218X + BOARD_TLSR9528A || BOARD_TLSR9518ADK80D || BOARD_TL3218X || BOARD_TL7218X config PWM default y endif diff --git a/data_model/1.4.1/clusters/ACL-Cluster.xml b/data_model/1.4.1/clusters/ACL-Cluster.xml new file mode 100644 index 00000000000000..730be018f3cf4d --- /dev/null +++ b/data_model/1.4.1/clusters/ACL-Cluster.xml @@ -0,0 +1,396 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/AccountLogin.xml b/data_model/1.4.1/clusters/AccountLogin.xml new file mode 100644 index 00000000000000..370c4d621c24d2 --- /dev/null +++ b/data_model/1.4.1/clusters/AccountLogin.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/AdminCommissioningCluster.xml b/data_model/1.4.1/clusters/AdminCommissioningCluster.xml new file mode 100644 index 00000000000000..6a2f84956cfc80 --- /dev/null +++ b/data_model/1.4.1/clusters/AdminCommissioningCluster.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/AirQuality.xml b/data_model/1.4.1/clusters/AirQuality.xml new file mode 100644 index 00000000000000..62a0842d15e027 --- /dev/null +++ b/data_model/1.4.1/clusters/AirQuality.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/AlarmBase.xml b/data_model/1.4.1/clusters/AlarmBase.xml new file mode 100644 index 00000000000000..c967ee0f8acc06 --- /dev/null +++ b/data_model/1.4.1/clusters/AlarmBase.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ApplicationBasic.xml b/data_model/1.4.1/clusters/ApplicationBasic.xml new file mode 100644 index 00000000000000..00eb9493bc46bc --- /dev/null +++ b/data_model/1.4.1/clusters/ApplicationBasic.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ApplicationLauncher.xml b/data_model/1.4.1/clusters/ApplicationLauncher.xml new file mode 100644 index 00000000000000..2fc3ea8b62fec7 --- /dev/null +++ b/data_model/1.4.1/clusters/ApplicationLauncher.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/AudioOutput.xml b/data_model/1.4.1/clusters/AudioOutput.xml new file mode 100644 index 00000000000000..f5a6ddaf9021ef --- /dev/null +++ b/data_model/1.4.1/clusters/AudioOutput.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/BallastConfiguration.xml b/data_model/1.4.1/clusters/BallastConfiguration.xml new file mode 100644 index 00000000000000..d7b8ff210e2738 --- /dev/null +++ b/data_model/1.4.1/clusters/BallastConfiguration.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/BasicInformationCluster.xml b/data_model/1.4.1/clusters/BasicInformationCluster.xml new file mode 100644 index 00000000000000..68daa48f5787b7 --- /dev/null +++ b/data_model/1.4.1/clusters/BasicInformationCluster.xml @@ -0,0 +1,386 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Binding-Cluster.xml b/data_model/1.4.1/clusters/Binding-Cluster.xml new file mode 100644 index 00000000000000..52717cfb055e58 --- /dev/null +++ b/data_model/1.4.1/clusters/Binding-Cluster.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/BooleanState.xml b/data_model/1.4.1/clusters/BooleanState.xml new file mode 100644 index 00000000000000..399547dae13b40 --- /dev/null +++ b/data_model/1.4.1/clusters/BooleanState.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/BooleanStateConfiguration.xml b/data_model/1.4.1/clusters/BooleanStateConfiguration.xml new file mode 100644 index 00000000000000..6ba5d22f57edc2 --- /dev/null +++ b/data_model/1.4.1/clusters/BooleanStateConfiguration.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Channel.xml b/data_model/1.4.1/clusters/Channel.xml new file mode 100644 index 00000000000000..2106b4da0dc751 --- /dev/null +++ b/data_model/1.4.1/clusters/Channel.xml @@ -0,0 +1,537 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ColorControl.xml b/data_model/1.4.1/clusters/ColorControl.xml new file mode 100644 index 00000000000000..f284f5a33156f4 --- /dev/null +++ b/data_model/1.4.1/clusters/ColorControl.xml @@ -0,0 +1,1364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/CommissionerControlCluster.xml b/data_model/1.4.1/clusters/CommissionerControlCluster.xml new file mode 100644 index 00000000000000..21609b36c1737a --- /dev/null +++ b/data_model/1.4.1/clusters/CommissionerControlCluster.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ConcentrationMeasurement.xml b/data_model/1.4.1/clusters/ConcentrationMeasurement.xml new file mode 100644 index 00000000000000..4a699cce0b7a27 --- /dev/null +++ b/data_model/1.4.1/clusters/ConcentrationMeasurement.xml @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ContentAppObserver.xml b/data_model/1.4.1/clusters/ContentAppObserver.xml new file mode 100644 index 00000000000000..18869d47740b71 --- /dev/null +++ b/data_model/1.4.1/clusters/ContentAppObserver.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ContentControl.xml b/data_model/1.4.1/clusters/ContentControl.xml new file mode 100644 index 00000000000000..2829734206adbf --- /dev/null +++ b/data_model/1.4.1/clusters/ContentControl.xml @@ -0,0 +1,517 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ContentLauncher.xml b/data_model/1.4.1/clusters/ContentLauncher.xml new file mode 100644 index 00000000000000..de973bf559aa7c --- /dev/null +++ b/data_model/1.4.1/clusters/ContentLauncher.xml @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Descriptor-Cluster.xml b/data_model/1.4.1/clusters/Descriptor-Cluster.xml new file mode 100644 index 00000000000000..782bf997e79463 --- /dev/null +++ b/data_model/1.4.1/clusters/Descriptor-Cluster.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DeviceEnergyManagement.xml b/data_model/1.4.1/clusters/DeviceEnergyManagement.xml new file mode 100644 index 00000000000000..dfd44de70fb576 --- /dev/null +++ b/data_model/1.4.1/clusters/DeviceEnergyManagement.xml @@ -0,0 +1,711 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DiagnosticLogsCluster.xml b/data_model/1.4.1/clusters/DiagnosticLogsCluster.xml new file mode 100644 index 00000000000000..af7becd66e8d19 --- /dev/null +++ b/data_model/1.4.1/clusters/DiagnosticLogsCluster.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DiagnosticsEthernet.xml b/data_model/1.4.1/clusters/DiagnosticsEthernet.xml new file mode 100644 index 00000000000000..20f5032ca9fab1 --- /dev/null +++ b/data_model/1.4.1/clusters/DiagnosticsEthernet.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DiagnosticsGeneral.xml b/data_model/1.4.1/clusters/DiagnosticsGeneral.xml new file mode 100644 index 00000000000000..f2c39ceb4243a8 --- /dev/null +++ b/data_model/1.4.1/clusters/DiagnosticsGeneral.xml @@ -0,0 +1,415 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DiagnosticsSoftware.xml b/data_model/1.4.1/clusters/DiagnosticsSoftware.xml new file mode 100644 index 00000000000000..6d5958bf1b798b --- /dev/null +++ b/data_model/1.4.1/clusters/DiagnosticsSoftware.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DiagnosticsThread.xml b/data_model/1.4.1/clusters/DiagnosticsThread.xml new file mode 100644 index 00000000000000..9804217b0818a3 --- /dev/null +++ b/data_model/1.4.1/clusters/DiagnosticsThread.xml @@ -0,0 +1,762 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DiagnosticsWiFi.xml b/data_model/1.4.1/clusters/DiagnosticsWiFi.xml new file mode 100644 index 00000000000000..f2bda597ccde9b --- /dev/null +++ b/data_model/1.4.1/clusters/DiagnosticsWiFi.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DishwasherAlarm.xml b/data_model/1.4.1/clusters/DishwasherAlarm.xml new file mode 100644 index 00000000000000..6aace5dbe2a3b9 --- /dev/null +++ b/data_model/1.4.1/clusters/DishwasherAlarm.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/DoorLock.xml b/data_model/1.4.1/clusters/DoorLock.xml new file mode 100644 index 00000000000000..d1986c4bd6208d --- /dev/null +++ b/data_model/1.4.1/clusters/DoorLock.xml @@ -0,0 +1,2400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/EcosystemInformationCluster.xml b/data_model/1.4.1/clusters/EcosystemInformationCluster.xml new file mode 100644 index 00000000000000..615c6092e85f17 --- /dev/null +++ b/data_model/1.4.1/clusters/EcosystemInformationCluster.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ElectricalEnergyMeasurement.xml b/data_model/1.4.1/clusters/ElectricalEnergyMeasurement.xml new file mode 100644 index 00000000000000..fc56b5171700f8 --- /dev/null +++ b/data_model/1.4.1/clusters/ElectricalEnergyMeasurement.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ElectricalPowerMeasurement.xml b/data_model/1.4.1/clusters/ElectricalPowerMeasurement.xml new file mode 100644 index 00000000000000..1dcc420d7a8f2d --- /dev/null +++ b/data_model/1.4.1/clusters/ElectricalPowerMeasurement.xml @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/EnergyEVSE.xml b/data_model/1.4.1/clusters/EnergyEVSE.xml new file mode 100644 index 00000000000000..bb5423f59f4242 --- /dev/null +++ b/data_model/1.4.1/clusters/EnergyEVSE.xml @@ -0,0 +1,645 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/EnergyPreference.xml b/data_model/1.4.1/clusters/EnergyPreference.xml new file mode 100644 index 00000000000000..4296fb628cf3ff --- /dev/null +++ b/data_model/1.4.1/clusters/EnergyPreference.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/FanControl.xml b/data_model/1.4.1/clusters/FanControl.xml new file mode 100644 index 00000000000000..d9339163bc93f5 --- /dev/null +++ b/data_model/1.4.1/clusters/FanControl.xml @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/FlowMeasurement.xml b/data_model/1.4.1/clusters/FlowMeasurement.xml new file mode 100644 index 00000000000000..9650eecf30649f --- /dev/null +++ b/data_model/1.4.1/clusters/FlowMeasurement.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/GeneralCommissioningCluster.xml b/data_model/1.4.1/clusters/GeneralCommissioningCluster.xml new file mode 100644 index 00000000000000..0bb551beb5866f --- /dev/null +++ b/data_model/1.4.1/clusters/GeneralCommissioningCluster.xml @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Group-Key-Management-Cluster.xml b/data_model/1.4.1/clusters/Group-Key-Management-Cluster.xml new file mode 100644 index 00000000000000..4a295ec404b5f9 --- /dev/null +++ b/data_model/1.4.1/clusters/Group-Key-Management-Cluster.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Groups.xml b/data_model/1.4.1/clusters/Groups.xml new file mode 100644 index 00000000000000..121ec51a0a8c13 --- /dev/null +++ b/data_model/1.4.1/clusters/Groups.xml @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ICDManagement.xml b/data_model/1.4.1/clusters/ICDManagement.xml new file mode 100644 index 00000000000000..37ec4c5d6356e6 --- /dev/null +++ b/data_model/1.4.1/clusters/ICDManagement.xml @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Identify.xml b/data_model/1.4.1/clusters/Identify.xml new file mode 100644 index 00000000000000..fb9b009d1353a8 --- /dev/null +++ b/data_model/1.4.1/clusters/Identify.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/IlluminanceMeasurement.xml b/data_model/1.4.1/clusters/IlluminanceMeasurement.xml new file mode 100644 index 00000000000000..2bfd018952deaf --- /dev/null +++ b/data_model/1.4.1/clusters/IlluminanceMeasurement.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/JointFabricDatastoreCluster.xml b/data_model/1.4.1/clusters/JointFabricDatastoreCluster.xml new file mode 100644 index 00000000000000..e6eecc50b23321 --- /dev/null +++ b/data_model/1.4.1/clusters/JointFabricDatastoreCluster.xml @@ -0,0 +1,582 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/JointFabricPKICluster.xml b/data_model/1.4.1/clusters/JointFabricPKICluster.xml new file mode 100644 index 00000000000000..0f9d09ad159015 --- /dev/null +++ b/data_model/1.4.1/clusters/JointFabricPKICluster.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/KeypadInput.xml b/data_model/1.4.1/clusters/KeypadInput.xml new file mode 100644 index 00000000000000..db05639b0a5bfe --- /dev/null +++ b/data_model/1.4.1/clusters/KeypadInput.xml @@ -0,0 +1,367 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Label-Cluster-FixedLabelCluster.xml b/data_model/1.4.1/clusters/Label-Cluster-FixedLabelCluster.xml new file mode 100644 index 00000000000000..9e21318ad6e13a --- /dev/null +++ b/data_model/1.4.1/clusters/Label-Cluster-FixedLabelCluster.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Label-Cluster-LabelCluster.xml b/data_model/1.4.1/clusters/Label-Cluster-LabelCluster.xml new file mode 100644 index 00000000000000..617e9b2bd30350 --- /dev/null +++ b/data_model/1.4.1/clusters/Label-Cluster-LabelCluster.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Label-Cluster-UserLabelCluster.xml b/data_model/1.4.1/clusters/Label-Cluster-UserLabelCluster.xml new file mode 100644 index 00000000000000..10abf4c48a24a5 --- /dev/null +++ b/data_model/1.4.1/clusters/Label-Cluster-UserLabelCluster.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/LaundryDryerControls.xml b/data_model/1.4.1/clusters/LaundryDryerControls.xml new file mode 100644 index 00000000000000..5a57711de3801b --- /dev/null +++ b/data_model/1.4.1/clusters/LaundryDryerControls.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/LaundryWasherControls.xml b/data_model/1.4.1/clusters/LaundryWasherControls.xml new file mode 100644 index 00000000000000..29dfaee22caff7 --- /dev/null +++ b/data_model/1.4.1/clusters/LaundryWasherControls.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/LevelControl.xml b/data_model/1.4.1/clusters/LevelControl.xml new file mode 100644 index 00000000000000..fc6fc7a8f12a67 --- /dev/null +++ b/data_model/1.4.1/clusters/LevelControl.xml @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/LocalizationConfiguration.xml b/data_model/1.4.1/clusters/LocalizationConfiguration.xml new file mode 100644 index 00000000000000..f3fd79c0195a0f --- /dev/null +++ b/data_model/1.4.1/clusters/LocalizationConfiguration.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/LocalizationTimeFormat.xml b/data_model/1.4.1/clusters/LocalizationTimeFormat.xml new file mode 100644 index 00000000000000..71f73196ae2d24 --- /dev/null +++ b/data_model/1.4.1/clusters/LocalizationTimeFormat.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/LocalizationUnit.xml b/data_model/1.4.1/clusters/LocalizationUnit.xml new file mode 100644 index 00000000000000..b68d951c6fa993 --- /dev/null +++ b/data_model/1.4.1/clusters/LocalizationUnit.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/LowPower.xml b/data_model/1.4.1/clusters/LowPower.xml new file mode 100644 index 00000000000000..f4a143080e3977 --- /dev/null +++ b/data_model/1.4.1/clusters/LowPower.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/MediaInput.xml b/data_model/1.4.1/clusters/MediaInput.xml new file mode 100644 index 00000000000000..2a26d6952dd276 --- /dev/null +++ b/data_model/1.4.1/clusters/MediaInput.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/MediaPlayback.xml b/data_model/1.4.1/clusters/MediaPlayback.xml new file mode 100644 index 00000000000000..915592895f2134 --- /dev/null +++ b/data_model/1.4.1/clusters/MediaPlayback.xml @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Messages.xml b/data_model/1.4.1/clusters/Messages.xml new file mode 100644 index 00000000000000..916f99505d7d1e --- /dev/null +++ b/data_model/1.4.1/clusters/Messages.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/MicrowaveOvenControl.xml b/data_model/1.4.1/clusters/MicrowaveOvenControl.xml new file mode 100644 index 00000000000000..8f790fa31d3242 --- /dev/null +++ b/data_model/1.4.1/clusters/MicrowaveOvenControl.xml @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ModeBase.xml b/data_model/1.4.1/clusters/ModeBase.xml new file mode 100644 index 00000000000000..d17938ea7f4da4 --- /dev/null +++ b/data_model/1.4.1/clusters/ModeBase.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ModeSelect.xml b/data_model/1.4.1/clusters/ModeSelect.xml new file mode 100644 index 00000000000000..6d5dfb5e74fa2d --- /dev/null +++ b/data_model/1.4.1/clusters/ModeSelect.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_DeviceEnergyManagement.xml b/data_model/1.4.1/clusters/Mode_DeviceEnergyManagement.xml new file mode 100644 index 00000000000000..85195ebb669c4b --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_DeviceEnergyManagement.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_Dishwasher.xml b/data_model/1.4.1/clusters/Mode_Dishwasher.xml new file mode 100644 index 00000000000000..c3cb5d3a0cea3c --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_Dishwasher.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_EVSE.xml b/data_model/1.4.1/clusters/Mode_EVSE.xml new file mode 100644 index 00000000000000..5bae945025506d --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_EVSE.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_LaundryWasher.xml b/data_model/1.4.1/clusters/Mode_LaundryWasher.xml new file mode 100644 index 00000000000000..e20a182d3adec9 --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_LaundryWasher.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_MicrowaveOven.xml b/data_model/1.4.1/clusters/Mode_MicrowaveOven.xml new file mode 100644 index 00000000000000..2b778183d0b7c2 --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_MicrowaveOven.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_Oven.xml b/data_model/1.4.1/clusters/Mode_Oven.xml new file mode 100644 index 00000000000000..8b4f16843cfa0b --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_Oven.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_RVCClean.xml b/data_model/1.4.1/clusters/Mode_RVCClean.xml new file mode 100644 index 00000000000000..ba0b115bfd4532 --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_RVCClean.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_RVCRun.xml b/data_model/1.4.1/clusters/Mode_RVCRun.xml new file mode 100644 index 00000000000000..f47b1da3b9a262 --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_RVCRun.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_Refrigerator.xml b/data_model/1.4.1/clusters/Mode_Refrigerator.xml new file mode 100644 index 00000000000000..dc6893bf4404ef --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_Refrigerator.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Mode_WaterHeater.xml b/data_model/1.4.1/clusters/Mode_WaterHeater.xml new file mode 100644 index 00000000000000..17dee3127b51b2 --- /dev/null +++ b/data_model/1.4.1/clusters/Mode_WaterHeater.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/NetworkCommissioningCluster.xml b/data_model/1.4.1/clusters/NetworkCommissioningCluster.xml new file mode 100644 index 00000000000000..6082d4bad6488d --- /dev/null +++ b/data_model/1.4.1/clusters/NetworkCommissioningCluster.xml @@ -0,0 +1,596 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OTAProvider.xml b/data_model/1.4.1/clusters/OTAProvider.xml new file mode 100644 index 00000000000000..b9d2a147f2e520 --- /dev/null +++ b/data_model/1.4.1/clusters/OTAProvider.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OTARequestor.xml b/data_model/1.4.1/clusters/OTARequestor.xml new file mode 100644 index 00000000000000..bd9bf65a577763 --- /dev/null +++ b/data_model/1.4.1/clusters/OTARequestor.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OccupancySensing.xml b/data_model/1.4.1/clusters/OccupancySensing.xml new file mode 100644 index 00000000000000..2cd2b3b827f4cf --- /dev/null +++ b/data_model/1.4.1/clusters/OccupancySensing.xml @@ -0,0 +1,466 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OnOff.xml b/data_model/1.4.1/clusters/OnOff.xml new file mode 100644 index 00000000000000..a58d4fcdf653c1 --- /dev/null +++ b/data_model/1.4.1/clusters/OnOff.xml @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OperationalCredentialCluster.xml b/data_model/1.4.1/clusters/OperationalCredentialCluster.xml new file mode 100644 index 00000000000000..bcd709d8789493 --- /dev/null +++ b/data_model/1.4.1/clusters/OperationalCredentialCluster.xml @@ -0,0 +1,401 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OperationalState.xml b/data_model/1.4.1/clusters/OperationalState.xml new file mode 100644 index 00000000000000..dc2a1ca60e9360 --- /dev/null +++ b/data_model/1.4.1/clusters/OperationalState.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OperationalState_Oven.xml b/data_model/1.4.1/clusters/OperationalState_Oven.xml new file mode 100644 index 00000000000000..aec8f7d3f26e2c --- /dev/null +++ b/data_model/1.4.1/clusters/OperationalState_Oven.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/OperationalState_RVC.xml b/data_model/1.4.1/clusters/OperationalState_RVC.xml new file mode 100644 index 00000000000000..3950183f254ca6 --- /dev/null +++ b/data_model/1.4.1/clusters/OperationalState_RVC.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/PowerSourceCluster.xml b/data_model/1.4.1/clusters/PowerSourceCluster.xml new file mode 100644 index 00000000000000..e24b63b8a16c1a --- /dev/null +++ b/data_model/1.4.1/clusters/PowerSourceCluster.xml @@ -0,0 +1,872 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/PowerSourceConfigurationCluster.xml b/data_model/1.4.1/clusters/PowerSourceConfigurationCluster.xml new file mode 100644 index 00000000000000..11794842114c8e --- /dev/null +++ b/data_model/1.4.1/clusters/PowerSourceConfigurationCluster.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/PowerTopology.xml b/data_model/1.4.1/clusters/PowerTopology.xml new file mode 100644 index 00000000000000..8cd5f530b255e4 --- /dev/null +++ b/data_model/1.4.1/clusters/PowerTopology.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/PressureMeasurement.xml b/data_model/1.4.1/clusters/PressureMeasurement.xml new file mode 100644 index 00000000000000..c9d657a1df8d82 --- /dev/null +++ b/data_model/1.4.1/clusters/PressureMeasurement.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ProxyConfiguration-Cluster.xml b/data_model/1.4.1/clusters/ProxyConfiguration-Cluster.xml new file mode 100644 index 00000000000000..7b634b338aee50 --- /dev/null +++ b/data_model/1.4.1/clusters/ProxyConfiguration-Cluster.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ProxyDiscovery-Cluster.xml b/data_model/1.4.1/clusters/ProxyDiscovery-Cluster.xml new file mode 100644 index 00000000000000..9c2cc8522f37f9 --- /dev/null +++ b/data_model/1.4.1/clusters/ProxyDiscovery-Cluster.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/PumpConfigurationControl.xml b/data_model/1.4.1/clusters/PumpConfigurationControl.xml new file mode 100644 index 00000000000000..48f1369788600b --- /dev/null +++ b/data_model/1.4.1/clusters/PumpConfigurationControl.xml @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/RefrigeratorAlarm.xml b/data_model/1.4.1/clusters/RefrigeratorAlarm.xml new file mode 100644 index 00000000000000..98ee14fb7e4c46 --- /dev/null +++ b/data_model/1.4.1/clusters/RefrigeratorAlarm.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ResourceMonitoring.xml b/data_model/1.4.1/clusters/ResourceMonitoring.xml new file mode 100644 index 00000000000000..51833b13d88757 --- /dev/null +++ b/data_model/1.4.1/clusters/ResourceMonitoring.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Scenes.xml b/data_model/1.4.1/clusters/Scenes.xml new file mode 100644 index 00000000000000..d96355f6a719f7 --- /dev/null +++ b/data_model/1.4.1/clusters/Scenes.xml @@ -0,0 +1,450 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ServiceArea.xml b/data_model/1.4.1/clusters/ServiceArea.xml new file mode 100644 index 00000000000000..6b571761772b25 --- /dev/null +++ b/data_model/1.4.1/clusters/ServiceArea.xml @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/SmokeCOAlarm.xml b/data_model/1.4.1/clusters/SmokeCOAlarm.xml new file mode 100644 index 00000000000000..838f0b2e69d4b1 --- /dev/null +++ b/data_model/1.4.1/clusters/SmokeCOAlarm.xml @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Switch.xml b/data_model/1.4.1/clusters/Switch.xml new file mode 100644 index 00000000000000..f3b53e3ee12809 --- /dev/null +++ b/data_model/1.4.1/clusters/Switch.xml @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/TargetNavigator.xml b/data_model/1.4.1/clusters/TargetNavigator.xml new file mode 100644 index 00000000000000..e7e53bcddb91e1 --- /dev/null +++ b/data_model/1.4.1/clusters/TargetNavigator.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/TemperatureControl.xml b/data_model/1.4.1/clusters/TemperatureControl.xml new file mode 100644 index 00000000000000..a8557ebf6f4913 --- /dev/null +++ b/data_model/1.4.1/clusters/TemperatureControl.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/TemperatureMeasurement.xml b/data_model/1.4.1/clusters/TemperatureMeasurement.xml new file mode 100644 index 00000000000000..64dd11fd1ad6d5 --- /dev/null +++ b/data_model/1.4.1/clusters/TemperatureMeasurement.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/Thermostat.xml b/data_model/1.4.1/clusters/Thermostat.xml new file mode 100644 index 00000000000000..257171beeb90c2 --- /dev/null +++ b/data_model/1.4.1/clusters/Thermostat.xml @@ -0,0 +1,1360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ThermostatUserInterfaceConfiguration.xml b/data_model/1.4.1/clusters/ThermostatUserInterfaceConfiguration.xml new file mode 100644 index 00000000000000..4a348bbe81abd8 --- /dev/null +++ b/data_model/1.4.1/clusters/ThermostatUserInterfaceConfiguration.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ThreadBorderRouterManagement.xml b/data_model/1.4.1/clusters/ThreadBorderRouterManagement.xml new file mode 100644 index 00000000000000..0f553e31f39be1 --- /dev/null +++ b/data_model/1.4.1/clusters/ThreadBorderRouterManagement.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ThreadNetworkDirectory.xml b/data_model/1.4.1/clusters/ThreadNetworkDirectory.xml new file mode 100644 index 00000000000000..550c7c9db0d48f --- /dev/null +++ b/data_model/1.4.1/clusters/ThreadNetworkDirectory.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/TimeSync.xml b/data_model/1.4.1/clusters/TimeSync.xml new file mode 100644 index 00000000000000..4911656beda88f --- /dev/null +++ b/data_model/1.4.1/clusters/TimeSync.xml @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ValidProxies-Cluster.xml b/data_model/1.4.1/clusters/ValidProxies-Cluster.xml new file mode 100644 index 00000000000000..678a71824401a6 --- /dev/null +++ b/data_model/1.4.1/clusters/ValidProxies-Cluster.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/ValveConfigurationControl.xml b/data_model/1.4.1/clusters/ValveConfigurationControl.xml new file mode 100644 index 00000000000000..14c16a48ff0b84 --- /dev/null +++ b/data_model/1.4.1/clusters/ValveConfigurationControl.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/WakeOnLAN.xml b/data_model/1.4.1/clusters/WakeOnLAN.xml new file mode 100644 index 00000000000000..1998e34aac3d88 --- /dev/null +++ b/data_model/1.4.1/clusters/WakeOnLAN.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/WaterContentMeasurement.xml b/data_model/1.4.1/clusters/WaterContentMeasurement.xml new file mode 100644 index 00000000000000..e77741f1265a80 --- /dev/null +++ b/data_model/1.4.1/clusters/WaterContentMeasurement.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/WaterHeaterManagement.xml b/data_model/1.4.1/clusters/WaterHeaterManagement.xml new file mode 100644 index 00000000000000..38901b77f6a91b --- /dev/null +++ b/data_model/1.4.1/clusters/WaterHeaterManagement.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/WiFiNetworkManagement.xml b/data_model/1.4.1/clusters/WiFiNetworkManagement.xml new file mode 100644 index 00000000000000..e79ed03b364052 --- /dev/null +++ b/data_model/1.4.1/clusters/WiFiNetworkManagement.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/WindowCovering.xml b/data_model/1.4.1/clusters/WindowCovering.xml new file mode 100644 index 00000000000000..0f1026b5a94472 --- /dev/null +++ b/data_model/1.4.1/clusters/WindowCovering.xml @@ -0,0 +1,740 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/bridge-clusters-ActionsCluster.xml b/data_model/1.4.1/clusters/bridge-clusters-ActionsCluster.xml new file mode 100644 index 00000000000000..8eae552fd2681d --- /dev/null +++ b/data_model/1.4.1/clusters/bridge-clusters-ActionsCluster.xml @@ -0,0 +1,401 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml b/data_model/1.4.1/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml new file mode 100644 index 00000000000000..357b468f20f102 --- /dev/null +++ b/data_model/1.4.1/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/clusters/cluster_ids.json b/data_model/1.4.1/clusters/cluster_ids.json new file mode 100644 index 00000000000000..7850a064e28211 --- /dev/null +++ b/data_model/1.4.1/clusters/cluster_ids.json @@ -0,0 +1,121 @@ +{ + "3": "Identify", + "4": "Groups", + "6": "On/Off", + "8": "Level Control", + "29": "Descriptor", + "30": "Binding", + "31": "Access Control", + "37": "Actions", + "40": "Basic Information", + "41": "OTA Software Update Provider", + "42": "OTA Software Update Requestor", + "43": "Localization Configuration", + "44": "Time Format Localization", + "45": "Unit Localization", + "46": "Power Source Configuration", + "47": "Power Source", + "48": "General Commissioning", + "49": "Network Commissioning", + "50": "Diagnostic Logs", + "51": "General Diagnostics", + "52": "Software Diagnostics", + "53": "Thread Network Diagnostics", + "54": "Wi-Fi Network Diagnostics", + "55": "Ethernet Network Diagnostics", + "56": "Time Synchronization", + "57": "Bridged Device Basic Information", + "59": "Switch", + "60": "Administrator Commissioning", + "62": "Operational Credentials", + "63": "Group Key Management", + "64": "Fixed Label", + "65": "User Label", + "66": "Proxy Configuration", + "67": "Proxy Discovery", + "68": "Valid Proxies", + "69": "Boolean State", + "70": "ICD Management", + "72": "Oven Cavity Operational State", + "73": "Oven Mode", + "74": "Laundry Dryer Controls", + "80": "Mode Select", + "81": "Laundry Washer Mode", + "82": "Refrigerator And Temperature Controlled Cabinet Mode", + "83": "Laundry Washer Controls", + "84": "RVC Run Mode", + "85": "RVC Clean Mode", + "86": "Temperature Control", + "87": "Refrigerator Alarm", + "89": "Dishwasher Mode", + "91": "Air Quality", + "92": "Smoke CO Alarm", + "93": "Dishwasher Alarm", + "94": "Microwave Oven Mode", + "95": "Microwave Oven Control", + "96": "Operational State", + "97": "RVC Operational State", + "98": "Scenes Management", + "113": "HEPA Filter Monitoring", + "114": "Activated Carbon Filter Monitoring", + "121": "Water Tank Level Monitoring", + "128": "Boolean State Configuration", + "129": "Valve Configuration and Control", + "144": "Electrical Power Measurement", + "145": "Electrical Energy Measurement", + "148": "Water Heater Management", + "151": "Messages", + "152": "Device Energy Management", + "153": "Energy EVSE", + "155": "Energy Preference", + "156": "Power Topology", + "157": "Energy EVSE Mode", + "158": "Water Heater Mode", + "159": "Device Energy Management Mode", + "257": "Door Lock", + "258": "Window Covering", + "336": "Service Area", + "512": "Pump Configuration and Control", + "513": "Thermostat", + "514": "Fan Control", + "516": "Thermostat User Interface Configuration", + "768": "Color Control", + "769": "Ballast Configuration", + "1024": "Illuminance Measurement", + "1026": "Temperature Measurement", + "1027": "Pressure Measurement", + "1028": "Flow Measurement", + "1029": "Relative Humidity Measurement", + "1030": "Occupancy Sensing", + "1036": "Carbon Monoxide Concentration Measurement", + "1037": "Carbon Dioxide Concentration Measurement", + "1043": "Nitrogen Dioxide Concentration Measurement", + "1045": "Ozone Concentration Measurement", + "1066": "PM2.5 Concentration Measurement", + "1067": "Formaldehyde Concentration Measurement", + "1068": "PM1 Concentration Measurement", + "1069": "PM10 Concentration Measurement", + "1070": "Total Volatile Organic Compounds Concentration Measurement", + "1071": "Radon Concentration Measurement", + "1105": "Wi-Fi Network Management", + "1106": "Thread Border Router Management", + "1107": "Thread Network Directory", + "1283": "Wake On LAN", + "1284": "Channel", + "1285": "Target Navigator", + "1286": "Media Playback", + "1287": "Media Input", + "1288": "Low Power", + "1289": "Keypad Input", + "1290": "Content Launcher", + "1291": "Audio Output", + "1292": "Application Launcher", + "1293": "Application Basic", + "1294": "Account Login", + "1295": "Content Control", + "1296": "Content App Observer", + "1872": "Ecosystem Information", + "1873": "Commissioner Control", + "1874": "Joint Fabric Datastore", + "1875": "Joint Fabric PKI" +} diff --git a/data_model/1.4.1/device_types/Aggregator.xml b/data_model/1.4.1/device_types/Aggregator.xml new file mode 100644 index 00000000000000..76e872f300cf41 --- /dev/null +++ b/data_model/1.4.1/device_types/Aggregator.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/AirPurifier.xml b/data_model/1.4.1/device_types/AirPurifier.xml new file mode 100644 index 00000000000000..b8aac8b4445167 --- /dev/null +++ b/data_model/1.4.1/device_types/AirPurifier.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/AirQualitySensor.xml b/data_model/1.4.1/device_types/AirQualitySensor.xml new file mode 100644 index 00000000000000..97df65166d42fc --- /dev/null +++ b/data_model/1.4.1/device_types/AirQualitySensor.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/BaseDeviceType.xml b/data_model/1.4.1/device_types/BaseDeviceType.xml new file mode 100644 index 00000000000000..306da33a72530b --- /dev/null +++ b/data_model/1.4.1/device_types/BaseDeviceType.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/BasicVideoPlayer.xml b/data_model/1.4.1/device_types/BasicVideoPlayer.xml new file mode 100644 index 00000000000000..9f33fedddf59ec --- /dev/null +++ b/data_model/1.4.1/device_types/BasicVideoPlayer.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/BatteryStorage.xml b/data_model/1.4.1/device_types/BatteryStorage.xml new file mode 100644 index 00000000000000..6351fd3eaf5c5c --- /dev/null +++ b/data_model/1.4.1/device_types/BatteryStorage.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/BridgedNode.xml b/data_model/1.4.1/device_types/BridgedNode.xml new file mode 100644 index 00000000000000..a459834e59e0a5 --- /dev/null +++ b/data_model/1.4.1/device_types/BridgedNode.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/CastingVideoClient.xml b/data_model/1.4.1/device_types/CastingVideoClient.xml new file mode 100644 index 00000000000000..24f535da7f2efc --- /dev/null +++ b/data_model/1.4.1/device_types/CastingVideoClient.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/CastingVideoPlayer.xml b/data_model/1.4.1/device_types/CastingVideoPlayer.xml new file mode 100644 index 00000000000000..934717e7609127 --- /dev/null +++ b/data_model/1.4.1/device_types/CastingVideoPlayer.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ColorDimmerSwitch.xml b/data_model/1.4.1/device_types/ColorDimmerSwitch.xml new file mode 100644 index 00000000000000..5a4c7af4edb035 --- /dev/null +++ b/data_model/1.4.1/device_types/ColorDimmerSwitch.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ColorTemperatureLight.xml b/data_model/1.4.1/device_types/ColorTemperatureLight.xml new file mode 100644 index 00000000000000..ddd435ade1f885 --- /dev/null +++ b/data_model/1.4.1/device_types/ColorTemperatureLight.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ContactSensor.xml b/data_model/1.4.1/device_types/ContactSensor.xml new file mode 100644 index 00000000000000..88e82576edaff0 --- /dev/null +++ b/data_model/1.4.1/device_types/ContactSensor.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ContentApp.xml b/data_model/1.4.1/device_types/ContentApp.xml new file mode 100644 index 00000000000000..95f74796d7cc99 --- /dev/null +++ b/data_model/1.4.1/device_types/ContentApp.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ControlBridge.xml b/data_model/1.4.1/device_types/ControlBridge.xml new file mode 100644 index 00000000000000..be36b89991ea95 --- /dev/null +++ b/data_model/1.4.1/device_types/ControlBridge.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/CookSurface.xml b/data_model/1.4.1/device_types/CookSurface.xml new file mode 100644 index 00000000000000..35bdc0c3b92014 --- /dev/null +++ b/data_model/1.4.1/device_types/CookSurface.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Cooktop.xml b/data_model/1.4.1/device_types/Cooktop.xml new file mode 100644 index 00000000000000..e780e390cd8a01 --- /dev/null +++ b/data_model/1.4.1/device_types/Cooktop.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/DeviceEnergyManagement.xml b/data_model/1.4.1/device_types/DeviceEnergyManagement.xml new file mode 100644 index 00000000000000..fe221e6305c7c8 --- /dev/null +++ b/data_model/1.4.1/device_types/DeviceEnergyManagement.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/DimmableLight.xml b/data_model/1.4.1/device_types/DimmableLight.xml new file mode 100644 index 00000000000000..f6e4f0f7b5b69e --- /dev/null +++ b/data_model/1.4.1/device_types/DimmableLight.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/DimmablePlug-InUnit.xml b/data_model/1.4.1/device_types/DimmablePlug-InUnit.xml new file mode 100644 index 00000000000000..a9ea86df3f0e5e --- /dev/null +++ b/data_model/1.4.1/device_types/DimmablePlug-InUnit.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/DimmerSwitch.xml b/data_model/1.4.1/device_types/DimmerSwitch.xml new file mode 100644 index 00000000000000..b4ff8be95f1412 --- /dev/null +++ b/data_model/1.4.1/device_types/DimmerSwitch.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Dishwasher.xml b/data_model/1.4.1/device_types/Dishwasher.xml new file mode 100644 index 00000000000000..f64ece8036297d --- /dev/null +++ b/data_model/1.4.1/device_types/Dishwasher.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/DoorLock.xml b/data_model/1.4.1/device_types/DoorLock.xml new file mode 100644 index 00000000000000..8c42604ec86b39 --- /dev/null +++ b/data_model/1.4.1/device_types/DoorLock.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/DoorLockController.xml b/data_model/1.4.1/device_types/DoorLockController.xml new file mode 100644 index 00000000000000..1ac00447f120cc --- /dev/null +++ b/data_model/1.4.1/device_types/DoorLockController.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/EVSE.xml b/data_model/1.4.1/device_types/EVSE.xml new file mode 100644 index 00000000000000..2f7c30d3fc6878 --- /dev/null +++ b/data_model/1.4.1/device_types/EVSE.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ElectricalSensor.xml b/data_model/1.4.1/device_types/ElectricalSensor.xml new file mode 100644 index 00000000000000..c97dcf9516a489 --- /dev/null +++ b/data_model/1.4.1/device_types/ElectricalSensor.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ExtendedColorLight.xml b/data_model/1.4.1/device_types/ExtendedColorLight.xml new file mode 100644 index 00000000000000..1962407075052d --- /dev/null +++ b/data_model/1.4.1/device_types/ExtendedColorLight.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ExtractorHood.xml b/data_model/1.4.1/device_types/ExtractorHood.xml new file mode 100644 index 00000000000000..18b46b3b262f66 --- /dev/null +++ b/data_model/1.4.1/device_types/ExtractorHood.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Fan.xml b/data_model/1.4.1/device_types/Fan.xml new file mode 100644 index 00000000000000..81fed1fc3ee9cb --- /dev/null +++ b/data_model/1.4.1/device_types/Fan.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/FlowSensor.xml b/data_model/1.4.1/device_types/FlowSensor.xml new file mode 100644 index 00000000000000..1ae86913829c60 --- /dev/null +++ b/data_model/1.4.1/device_types/FlowSensor.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/GenericSwitch.xml b/data_model/1.4.1/device_types/GenericSwitch.xml new file mode 100644 index 00000000000000..ac2e2b91284d14 --- /dev/null +++ b/data_model/1.4.1/device_types/GenericSwitch.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/HeatPump.xml b/data_model/1.4.1/device_types/HeatPump.xml new file mode 100644 index 00000000000000..d0227ffca0791f --- /dev/null +++ b/data_model/1.4.1/device_types/HeatPump.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/HumiditySensor.xml b/data_model/1.4.1/device_types/HumiditySensor.xml new file mode 100644 index 00000000000000..7a2a8c61e5bf78 --- /dev/null +++ b/data_model/1.4.1/device_types/HumiditySensor.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/JointFabricAdmin.xml b/data_model/1.4.1/device_types/JointFabricAdmin.xml new file mode 100644 index 00000000000000..b9fa8752ebe7b5 --- /dev/null +++ b/data_model/1.4.1/device_types/JointFabricAdmin.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/LaundryDryer.xml b/data_model/1.4.1/device_types/LaundryDryer.xml new file mode 100644 index 00000000000000..7c51ba553107c6 --- /dev/null +++ b/data_model/1.4.1/device_types/LaundryDryer.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/LaundryWasher.xml b/data_model/1.4.1/device_types/LaundryWasher.xml new file mode 100644 index 00000000000000..41d440039a07bc --- /dev/null +++ b/data_model/1.4.1/device_types/LaundryWasher.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/LightSensor.xml b/data_model/1.4.1/device_types/LightSensor.xml new file mode 100644 index 00000000000000..d2b2d3a9ca58d7 --- /dev/null +++ b/data_model/1.4.1/device_types/LightSensor.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/MicrowaveOven.xml b/data_model/1.4.1/device_types/MicrowaveOven.xml new file mode 100644 index 00000000000000..e02cf7afdc5fed --- /dev/null +++ b/data_model/1.4.1/device_types/MicrowaveOven.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ModeSelectDeviceType.xml b/data_model/1.4.1/device_types/ModeSelectDeviceType.xml new file mode 100644 index 00000000000000..28c7ff3e9ad11c --- /dev/null +++ b/data_model/1.4.1/device_types/ModeSelectDeviceType.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/MountedDimmableLoadControl.xml b/data_model/1.4.1/device_types/MountedDimmableLoadControl.xml new file mode 100644 index 00000000000000..48f496ceeeddce --- /dev/null +++ b/data_model/1.4.1/device_types/MountedDimmableLoadControl.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/MountedOnOffControl.xml b/data_model/1.4.1/device_types/MountedOnOffControl.xml new file mode 100644 index 00000000000000..f1e6828b85d3ac --- /dev/null +++ b/data_model/1.4.1/device_types/MountedOnOffControl.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/NetworkInfraManager.xml b/data_model/1.4.1/device_types/NetworkInfraManager.xml new file mode 100644 index 00000000000000..c99c05e1e32fbc --- /dev/null +++ b/data_model/1.4.1/device_types/NetworkInfraManager.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/OccupancySensor.xml b/data_model/1.4.1/device_types/OccupancySensor.xml new file mode 100644 index 00000000000000..7600fe0ed8db2e --- /dev/null +++ b/data_model/1.4.1/device_types/OccupancySensor.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/OnOffLight.xml b/data_model/1.4.1/device_types/OnOffLight.xml new file mode 100644 index 00000000000000..345eacdedbed9f --- /dev/null +++ b/data_model/1.4.1/device_types/OnOffLight.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/OnOffLightSwitch.xml b/data_model/1.4.1/device_types/OnOffLightSwitch.xml new file mode 100644 index 00000000000000..0fcbf09a806076 --- /dev/null +++ b/data_model/1.4.1/device_types/OnOffLightSwitch.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/OnOffPlug-inUnit.xml b/data_model/1.4.1/device_types/OnOffPlug-inUnit.xml new file mode 100644 index 00000000000000..4fed5e744ef154 --- /dev/null +++ b/data_model/1.4.1/device_types/OnOffPlug-inUnit.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/OnOffSensor.xml b/data_model/1.4.1/device_types/OnOffSensor.xml new file mode 100644 index 00000000000000..832e44d5daf809 --- /dev/null +++ b/data_model/1.4.1/device_types/OnOffSensor.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/OtaProvider.xml b/data_model/1.4.1/device_types/OtaProvider.xml new file mode 100644 index 00000000000000..4dfe9013b5c05d --- /dev/null +++ b/data_model/1.4.1/device_types/OtaProvider.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/OtaRequestor.xml b/data_model/1.4.1/device_types/OtaRequestor.xml new file mode 100644 index 00000000000000..d2fd3b460b3b8a --- /dev/null +++ b/data_model/1.4.1/device_types/OtaRequestor.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Oven.xml b/data_model/1.4.1/device_types/Oven.xml new file mode 100644 index 00000000000000..1c012d05489ace --- /dev/null +++ b/data_model/1.4.1/device_types/Oven.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/PowerSource.xml b/data_model/1.4.1/device_types/PowerSource.xml new file mode 100644 index 00000000000000..f00ae14434b786 --- /dev/null +++ b/data_model/1.4.1/device_types/PowerSource.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/PressureSensor.xml b/data_model/1.4.1/device_types/PressureSensor.xml new file mode 100644 index 00000000000000..c86c0c504eb030 --- /dev/null +++ b/data_model/1.4.1/device_types/PressureSensor.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Pump.xml b/data_model/1.4.1/device_types/Pump.xml new file mode 100644 index 00000000000000..13fbf2212189a2 --- /dev/null +++ b/data_model/1.4.1/device_types/Pump.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/PumpController.xml b/data_model/1.4.1/device_types/PumpController.xml new file mode 100644 index 00000000000000..e71ab5325e50b5 --- /dev/null +++ b/data_model/1.4.1/device_types/PumpController.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/RainSensor.xml b/data_model/1.4.1/device_types/RainSensor.xml new file mode 100644 index 00000000000000..5d10d2683644e0 --- /dev/null +++ b/data_model/1.4.1/device_types/RainSensor.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Refrigerator.xml b/data_model/1.4.1/device_types/Refrigerator.xml new file mode 100644 index 00000000000000..852dc6effd9fd8 --- /dev/null +++ b/data_model/1.4.1/device_types/Refrigerator.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/RoboticVacuumCleaner.xml b/data_model/1.4.1/device_types/RoboticVacuumCleaner.xml new file mode 100644 index 00000000000000..ed0ce08fdd9580 --- /dev/null +++ b/data_model/1.4.1/device_types/RoboticVacuumCleaner.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/RoomAirConditioner.xml b/data_model/1.4.1/device_types/RoomAirConditioner.xml new file mode 100644 index 00000000000000..20b5767ca56adb --- /dev/null +++ b/data_model/1.4.1/device_types/RoomAirConditioner.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/RootNodeDeviceType.xml b/data_model/1.4.1/device_types/RootNodeDeviceType.xml new file mode 100644 index 00000000000000..fd8f2bf654bb91 --- /dev/null +++ b/data_model/1.4.1/device_types/RootNodeDeviceType.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/SecondaryNetworkInterface.xml b/data_model/1.4.1/device_types/SecondaryNetworkInterface.xml new file mode 100644 index 00000000000000..ed65a5b0051687 --- /dev/null +++ b/data_model/1.4.1/device_types/SecondaryNetworkInterface.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/SmokeCOAlarm.xml b/data_model/1.4.1/device_types/SmokeCOAlarm.xml new file mode 100644 index 00000000000000..cd247953c946d7 --- /dev/null +++ b/data_model/1.4.1/device_types/SmokeCOAlarm.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/SolarPower.xml b/data_model/1.4.1/device_types/SolarPower.xml new file mode 100644 index 00000000000000..25345c27890fce --- /dev/null +++ b/data_model/1.4.1/device_types/SolarPower.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Speaker.xml b/data_model/1.4.1/device_types/Speaker.xml new file mode 100644 index 00000000000000..11fd3ea3e57df3 --- /dev/null +++ b/data_model/1.4.1/device_types/Speaker.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/TemperatureControlledCabinet.xml b/data_model/1.4.1/device_types/TemperatureControlledCabinet.xml new file mode 100644 index 00000000000000..b8e1b9a8fa1dc7 --- /dev/null +++ b/data_model/1.4.1/device_types/TemperatureControlledCabinet.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/TemperatureSensor.xml b/data_model/1.4.1/device_types/TemperatureSensor.xml new file mode 100644 index 00000000000000..ccc6d143a15f9c --- /dev/null +++ b/data_model/1.4.1/device_types/TemperatureSensor.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/Thermostat.xml b/data_model/1.4.1/device_types/Thermostat.xml new file mode 100644 index 00000000000000..11b495b88fca6c --- /dev/null +++ b/data_model/1.4.1/device_types/Thermostat.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/ThreadBorderRouter.xml b/data_model/1.4.1/device_types/ThreadBorderRouter.xml new file mode 100644 index 00000000000000..5dc3d06ade928f --- /dev/null +++ b/data_model/1.4.1/device_types/ThreadBorderRouter.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/VideoRemoteControl.xml b/data_model/1.4.1/device_types/VideoRemoteControl.xml new file mode 100644 index 00000000000000..2b920feb6a3c68 --- /dev/null +++ b/data_model/1.4.1/device_types/VideoRemoteControl.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/WaterFreezeDetector.xml b/data_model/1.4.1/device_types/WaterFreezeDetector.xml new file mode 100644 index 00000000000000..614bf30050d979 --- /dev/null +++ b/data_model/1.4.1/device_types/WaterFreezeDetector.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/WaterHeater.xml b/data_model/1.4.1/device_types/WaterHeater.xml new file mode 100644 index 00000000000000..2647c010fc059b --- /dev/null +++ b/data_model/1.4.1/device_types/WaterHeater.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/WaterLeakDetector.xml b/data_model/1.4.1/device_types/WaterLeakDetector.xml new file mode 100644 index 00000000000000..683b841adc4593 --- /dev/null +++ b/data_model/1.4.1/device_types/WaterLeakDetector.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/WaterValve.xml b/data_model/1.4.1/device_types/WaterValve.xml new file mode 100644 index 00000000000000..57f88a717c2a9c --- /dev/null +++ b/data_model/1.4.1/device_types/WaterValve.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/WindowCovering.xml b/data_model/1.4.1/device_types/WindowCovering.xml new file mode 100644 index 00000000000000..75b97cae6173f1 --- /dev/null +++ b/data_model/1.4.1/device_types/WindowCovering.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/device_types/WindowCoveringController.xml b/data_model/1.4.1/device_types/WindowCoveringController.xml new file mode 100644 index 00000000000000..56c17bfe51eb65 --- /dev/null +++ b/data_model/1.4.1/device_types/WindowCoveringController.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/1.4.1/scraper_version b/data_model/1.4.1/scraper_version new file mode 100644 index 00000000000000..03d9cee03ac4d6 --- /dev/null +++ b/data_model/1.4.1/scraper_version @@ -0,0 +1 @@ +alchemy version: 1.5.2 (4717a32) diff --git a/data_model/1.4.1/spec_sha b/data_model/1.4.1/spec_sha new file mode 100644 index 00000000000000..5bd0bb1e31ecb6 --- /dev/null +++ b/data_model/1.4.1/spec_sha @@ -0,0 +1 @@ +2ca6342695e11a91f72370a52c590034e257bdb2 diff --git a/data_model/1.4.1/spec_tag b/data_model/1.4.1/spec_tag new file mode 100644 index 00000000000000..347f5833ee6db7 --- /dev/null +++ b/data_model/1.4.1/spec_tag @@ -0,0 +1 @@ +1.4.1 diff --git a/docs/development_controllers/chip-repl/Matter_Access_Control.ipynb b/docs/development_controllers/chip-repl/Matter_Access_Control.ipynb index 4d0d1853af206e..bc89e6d875a02c 100644 --- a/docs/development_controllers/chip-repl/Matter_Access_Control.ipynb +++ b/docs/development_controllers/chip-repl/Matter_Access_Control.ipynb @@ -4,6 +4,10 @@ "cell_type": "markdown", "id": "e8b2f5eb", "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, "tags": [] }, "source": [ @@ -39,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "id": "59352193-6c8f-4bda-9a3c-d84317b63c30", "metadata": { "tags": [] @@ -47,16 +51,13 @@ "outputs": [ { "data": { - "text/html": [ - "
0\n",
-       "
\n" - ], "text/plain": [ - "\u001b[1;36m0\u001b[0m\n" + "0" ] }, + "execution_count": 1, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -85,64 +86,63 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "id": "bad327b7-c78a-4c46-b224-077fe7539ee1", "metadata": {}, "outputs": [ - { - "data": { - "text/html": [ - "
──────────────────────────────────────── Matter REPL ────────────────────────────────────────\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[92m──────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ────────────────────────────────────────\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "text/html": [ "
\n",
-       "            \n",
-       "    \n",
-       "            Welcome to the Matter Python REPL!\n",
-       "    \n",
-       "            For help, please type matterhelp()\n",
-       "    \n",
-       "            To get more information on a particular object/class, you can pass\n",
-       "            that into matterhelp() as well.\n",
-       "    \n",
-       "            \n",
+       " Replacing  store path ./credentials/development/paa-root-certs with \n",
+       "/home/root/repos/connectedhomeip/credentials/development/paa-root-certs\n",
+       "Note that you are still running from \n",
+       "/home/root/repos/connectedhomeip/docs/development_controllers/chip-repl so other relative\n",
+       "paths may be off.\n",
+       "                    \n",
        "
\n" ], "text/plain": [ "\n", - " \n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", - "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m \u001b[0m\n" + "\u001b[1m Replacing \u001b[0m store path .\u001b[35m/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m with \n", + "\u001b[35m/home/root/repos/connectedhomeip/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m\n", + "Note that you are still running from \n", + "\u001b[35m/home/root/repos/connectedhomeip/docs/development_controllers/\u001b[0m\u001b[95mchip-repl\u001b[0m so other relative\n", + "paths may be off.\n", + " \n" ] }, "metadata": {}, "output_type": "display_data" }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1738153365.139353][2283552:2283552] CHIP:CTL: Setting attestation nonce to random value\n", + "[1738153365.139578][2283552:2283552] CHIP:CTL: Setting CSR nonce to random value\n", + "[1738153365.151683][2283552:2283552] CHIP:DL: NVS set: chip-factory/unique-id = \"107DC5BE4DC63F48\"\n", + "[1738153365.152834][2283552:2283552] CHIP:DL: NVS set: chip-factory/vendor-id = 65521 (0xFFF1)\n", + "[1738153365.154302][2283552:2283552] CHIP:DL: NVS set: chip-factory/product-id = 32769 (0x8001)\n", + "[1738153365.155697][2283552:2283552] CHIP:DL: NVS set: chip-counters/reboot-count = 1 (0x1)\n", + "[1738153365.157205][2283552:2283552] CHIP:DL: NVS set: chip-counters/total-operational-hours = 0 (0x0)\n", + "[1738153365.158744][2283552:2283552] CHIP:DL: NVS set: chip-counters/boot-reason = 0 (0x0)\n", + "[1738153365.160171][2283552:2283552] CHIP:DL: NVS set: chip-config/regulatory-location = 0 (0x0)\n", + "[1738153365.161859][2283552:2283552] CHIP:DL: NVS set: chip-config/location-capability = 2 (0x2)\n", + "[1738153365.162176][2283552:2283552] CHIP:DL: Got Ethernet interface: enp2s0\n", + "[1738153365.162304][2283552:2283552] CHIP:DL: Found the primary Ethernet interface:enp2s0\n", + "[1738153365.162434][2283552:2283552] CHIP:DL: Got WiFi interface: wlp3s0\n", + "[1738153365.162584][2283552:2283552] CHIP:DL: Found the primary WiFi interface:wlp3s0\n" + ] + }, { "data": { "text/html": [ - "
─────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "
─────────────────────────────────────────────────── Matter REPL ───────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\u001b[92m─────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" + "\u001b[92m─────────────────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ───────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -152,12 +152,30 @@ "data": { "text/html": [ "
\n",
+       "            \n",
+       "\n",
+       "            Welcome to the Matter Python REPL!\n",
+       "\n",
+       "            For help, please type matterhelp()\n",
        "\n",
+       "            To get more information on a particular object/class, you can pass\n",
+       "            that into matterhelp() as well.\n",
+       "\n",
+       "            \n",
        "
\n" ], "text/plain": [ "\n", - "\n" + " \n", + "\n", + "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", + "\n", + "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", + "\n", + "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", + "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", + "\n", + "\u001b[1;34m \u001b[0m\n" ] }, "metadata": {}, @@ -166,48 +184,38 @@ { "data": { "text/html": [ - "
Restoring FabricAdmin from storage to manage FabricId 1, FabricIndex 1...\n",
+       "
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mRestoring FabricAdmin from storage to manage FabricId \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m, FabricIndex \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + "\u001b[92m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "New FabricAdmin: FabricId: 1(1)\n" + "2025-01-29 13:22:45 ThinkPad chip.storage[2283552] ERROR [Errno 2] No such file or directory: '/tmp/repl-storage.json'\n", + "2025-01-29 13:22:45 ThinkPad chip.storage[2283552] CRITICAL Could not load configuration from /tmp/repl-storage.json - resetting configuration...\n", + "2025-01-29 13:22:45 ThinkPad chip.storage[2283552] WARNING No valid SDK configuration present - clearing out configuration\n", + "2025-01-29 13:22:45 ThinkPad chip.storage[2283552] WARNING No valid REPL configuration present - clearing out configuration\n" ] }, - { - "data": { - "text/html": [ - "
\n",
-       "Fabric Admins have been loaded and are available at fabricAdmins\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[34mFabric Admins have been loaded and are available at \u001b[0m\u001b[31mfabricAdmins\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "text/html": [ "
\n",
        "\n",
+       "The following objects have been created:\n",
        "
\n" ], "text/plain": [ "\n", - "\n" + "\n", + "\u001b[34mThe following objects have been created:\u001b[0m\n" ] }, "metadata": {}, @@ -216,37 +224,36 @@ { "data": { "text/html": [ - "
Creating default device controller on fabric 1...\n",
+       "
        certificateAuthorityManager:    Manages a list of CertificateAuthority instances.\n",
+       "        caList:                         The list of CertificateAuthority instances.\n",
+       "        caList[n].adminList[m]:         A specific FabricAdmin object at index m for the nth CertificateAuthority \n",
+       "instance.\n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mCreating default device controller on fabric \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + " \u001b[31mcertificateAuthorityManager\u001b[0m\u001b[34m: \u001b[0m\u001b[34mManages a list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34mThe list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mn\u001b[0m\u001b[1;31m]\u001b[0m\u001b[31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mm\u001b[0m\u001b[1;31m]\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34mA specific FabricAdmin object at index m for the nth CertificateAuthority \u001b[0m\n", + "\u001b[34minstance.\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Allocating new controller with FabricId: 1(1), NodeId: 1\n" - ] - }, { "data": { "text/html": [ "
\n",
        "\n",
-       "Default CHIP Device Controller has been initialized to manage fabricAdmins[0], and is \n",
-       "available as devCtrl\n",
+       "Default CHIP Device Controller (NodeId: 112233): has been initialized to manage caList[0].adminList[0] (FabricId = \n",
+       "1), and is available as devCtrl\n",
        "
\n" ], "text/plain": [ "\n", "\n", - "\u001b[34mDefault CHIP Device Controller has been initialized to manage \u001b[0m\u001b[1;31mfabricAdmins\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m, and is \u001b[0m\n", - "\u001b[1;34mavailable as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" + "\u001b[34mDefault CHIP Device Controller \u001b[0m\u001b[1;34m(\u001b[0m\u001b[34mNodeId: \u001b[0m\u001b[1;34m112233\u001b[0m\u001b[1;34m)\u001b[0m\u001b[34m: has been initialized to manage \u001b[0m\u001b[1;31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m \u001b[0m\u001b[1;34m(\u001b[0m\u001b[1;34mFabricId = \u001b[0m\n", + "\u001b[1;34m1\u001b[0m\u001b[1;34m)\u001b[0m\u001b[1;34m, and is available as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" ] }, "metadata": {}, @@ -254,10 +261,10 @@ } ], "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path}" + "%reset -f\n", + "import importlib.util\n", + "spec = importlib.util.find_spec('chip.ChipReplStartup')\n", + "%run {spec.origin}" ] }, { @@ -280,7 +287,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "id": "52ccd8c6", "metadata": {}, "outputs": [], @@ -290,11 +297,14 @@ "os.system('pkill -f chip-all-clusters-app')\n", "time.sleep(1)\n", "\n", - "# The location of the all-clusters-app in the cloud playground is one level higher - adjust for this by testing for file presence.\n", - "if (os.path.isfile('../../../out/debug/chip-all-clusters-app')):\n", - " appPath = '../../../out/debug/chip-all-clusters-app'\n", + "CI_APP_PATH = '../../../out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-clang-test/chip-all-clusters-app'\n", + "LOCAL_APP_PATH = '../../../out/linux-x64-all-clusters/chip-all-clusters-app'\n", + "\n", + "# Check if the app built by GitHub Actions is present. Otherwise use the standard all-clusters-app \n", + "if (os.path.isfile(CI_APP_PATH)):\n", + " appPath = CI_APP_PATH\n", "else:\n", - " appPath = '../../../../out/debug/chip-all-clusters-app'\n", + " appPath = LOCAL_APP_PATH\n", "\n", "process = subprocess.Popen(appPath, stdout=subprocess.DEVNULL)\n", "time.sleep(1)" @@ -307,48 +317,40 @@ "source": [ "### Commission Target\n", "\n", - "Commission the target with a NodeId of 1." + "Commission the target with a NodeId of 2." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 4, "id": "5e964fe3", "metadata": { "tags": [] }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-01-29 16:01:43 johnsj-macbookpro1.roam.corp.google.com chip.SC[9915] ERROR The device does not support GetClock_RealTimeMS() API. This will eventually result in CASE session setup failures.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Node address has been updated\n", - "Commissioning complete\n" - ] - }, { "data": { "text/html": [ - "
True\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
-       "\u001b[3;92mTrue\u001b[0m\n"
+       "\u001b[1;36m2\u001b[0m"
       ]
      },
+     "execution_count": 4,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "devCtrl.CommissionIP(b'127.0.0.1', 20202021, 2)"
+    "await devCtrl.CommissionOnNetwork(2, 20202021)"
    ]
   },
   {
@@ -366,172 +368,292 @@
    "id": "372ae9a4",
    "metadata": {},
    "source": [
-    "(For now) normally after commissioning there would be at least a single admin entry, but currently the ACL will be empty, so add that entry manually. This step will be removed later when it’s no longer necessary."
+    "During Commissioning, an ACL that assigns Administer rights to the commissioner(i.e. chip-repl) was automatically installed on the commissionee."
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 5,
    "id": "058504b3",
-   "metadata": {},
+   "metadata": {
+    "scrolled": true
+   },
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.OperationalCredentials'>: OperationalCredentials(\n",
-       "│   │   │   NOCs=[\n",
-       "│   │   │   │   NOCStruct(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   noc=b'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x01$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x11\\x02$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\x19\\x1ef\\xaa\\x8d_A\\x19\\x9f\\xee\\xa1\\x1fn\\x82\\xb6}(\\xd6\\x00\\'\\xeb\\x80Y\\xf9\\xd7\\xa8\\xbe\\x98\\xce\\xba4v\\xa0\\xa0\\xa9\\xbaUO)?\\xbb\\xe0\\xa4\\x12r\\x0cb\\xe0\\xc8\\xa7r\\xe3\\xd5\\x8e\\x159\\xc6\\xaf\\xc8\\xbc\\xb4\\x8b\\xf9E7\\n5\\x01(\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x14\\x1f\\x87b\\xe9`2\\x03C{o`\\x9e\\x14\\xe3\\x8c\\x0b\\x83\\xcd\\x10Z0\\x05\\x14p\\xfc\\xf9\\nFI\\xba9\\xb6SH\\xcb\\xd0meg\\n\\t\\\\=\\x180\\x0b@\\xd3\\x03x<\\x0f\\xdc\\xceBl\\x01\\xfb[Kly+\\xd4\\xab\\xa08\\xd3f \\xa5\\xb9\\xb4aP\\xce|\\xee\"to\\x17\\xc1m\\xcfQ\\x10pq=7\\r\\xf6\\xe4\\x89+\\xcb\\x98\\xa9\\x176T\\x82\\x83\\x8d\\x04#\\xa2\\xd3\\xf2\\xb6\\x18',\n",
-       "│   │   │   │   │   icac=b'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x13\\x01$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04,\\x0c\\x82d\\xa8\\xd8-o\\x860Q\\xeb\\x8d\\x87\\xe6x\\x9e\\x0b\\xf8\\xc91\\xa9\\xc5\\x01nxB\\x17h\\xbc\\x98]\\xc9&\\x19\\x9f\\xde\\x97&\\x80M\\xca\\x8b\\xa1\\xa0g\\xfd\\xae}\\x12\\x8a\\x98\\x08\\x86k\\xc7=\\xc3\\xea\\x0e\\xb0\\xf0p\\x057\\n5\\x01)\\x01\\x18$\\x02`0\\x04\\x14p\\xfc\\xf9\\nFI\\xba9\\xb6SH\\xcb\\xd0meg\\n\\t\\\\=0\\x05\\x14~\\xf0\\n\\'\\'\\x89\\xc26\\xa8\\xdaz\\xbeCv\\xb2\\x7fn\\xca^\\xb5\\x180\\x0b@\\x11\\xa5\\xf9\\x80\\x1a\\x9c\\xe5\\xbf\\x1e\\xb3\\n\\x83\\x0eW6!\\x0f\\xb0,\\xa7\\xdb\\xb0\\xe3B\\xdc\\\\\\xec\\xbb\\x02\\xc2\\x04\\xd9\\x0c\\xa7\\xdfj\\x1a\\x15]\\x18\\x08\\xdfFz%)b\\xfa\\x9b\\xca\\x99\\xccY\\x01\\xa7}\\xf1|\\xe6\\xfe\\xf0*\\x10W\\x18'\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   fabricsList=[\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\xa2\\x88}\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98',\n",
-       "│   │   │   │   │   vendorId=31968,\n",
-       "│   │   │   │   │   fabricId=1,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label=''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   supportedFabrics=16,\n",
-       "│   │   │   commissionedFabrics=1,\n",
-       "│   │   │   trustedRootCertificates=[\n",
-       "│   │   │   │   b'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x14\\x00$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xa2\\x88}\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x987\\n5\\x01)\\x01\\x18$\\x02`0\\x04\\x14~\\xf0\\n\\'\\'\\x89\\xc26\\xa8\\xdaz\\xbeCv\\xb2\\x7fn\\xca^\\xb50\\x05\\x14~\\xf0\\n\\'\\'\\x89\\xc26\\xa8\\xdaz\\xbeCv\\xb2\\x7fn\\xca^\\xb5\\x180\\x0b@3;\\xd5n\\xa0\\xb1O\\xecI:\\x9cM\\xf4u\\x12a\\x96\\x1d\\x13\\x19\\xa4D\\xb3v&_o.(\\xcbs\\xeb\\xc0\\xc4\\xb80\\xc2\\xecF4\\xfbV\\'\\xf7X\\xe2A\\xaa\\xa5l\\r5\\xba\\xbd\\xa4I&C\\xff\\xed\\xd8\\xa8_\\x06\\x18'\n",
-       "│   │   │   ],\n",
-       "│   │   │   currentFabricIndex=1,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=None,\n",
-       "│   │   │   clusterRevision=1\n",
-       "│   │   )\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mOperationalCredentials\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mNOCs\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNOCStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnoc\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x01$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x11\\x02$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\x19\\x1ef\\xaa\\x8d_A\\x19\\x9f\\xee\\xa1\\x1fn\\x82\\xb6\u001b[0m\u001b[32m}\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\xd6\\x00\\'\\xeb\\x80Y\\xf9\\xd7\\xa8\\xbe\\x98\\xce\\xba4v\\xa0\\xa0\\xa9\\xbaUO\u001b[0m\u001b[32m)\u001b[0m\u001b[32m?\\xbb\\xe0\\xa4\\x12r\\x0cb\\xe0\\xc8\\xa7r\\xe3\\xd5\\x8e\\x159\\xc6\\xaf\\xc8\\xbc\\xb4\\x8b\\xf9E7\\n5\\x01\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x14\\x1f\\x87b\\xe9`2\\x03C\u001b[0m\u001b[32m{\u001b[0m\u001b[32mo`\\x9e\\x14\\xe3\\x8c\\x0b\\x83\\xcd\\x10Z0\\x05\\x14p\\xfc\\xf9\\nFI\\xba9\\xb6SH\\xcb\\xd0meg\\n\\t\\\\=\\x180\\x0b@\\xd3\\x03x<\\x0f\\xdc\\xceBl\\x01\\xfb\u001b[0m\u001b[32m[\u001b[0m\u001b[32mKly+\\xd4\\xab\\xa08\\xd3f \\xa5\\xb9\\xb4aP\\xce|\\xee\"to\\x17\\xc1m\\xcfQ\\\u001b[0m\u001b[32mx10pq\u001b[0m\u001b[32m=\u001b[0m\u001b[32m7\u001b[0m\u001b[32m\\r\\xf6\\xe4\\x89+\\xcb\\x98\\xa9\\x176T\\x82\\x83\\x8d\\x04#\\xa2\\xd3\\xf2\\xb6\\x18'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33micac\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x13\\x01$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04,\\x0c\\x82d\\xa8\\xd8-o\\x860Q\\xeb\\x8d\\x87\\xe6x\\x9e\\x0b\\xf8\\xc91\\xa9\\xc5\\x01nxB\\x17h\\xbc\\x98\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xc9&\\x19\\x9f\\xde\\x97&\\x80M\\xca\\x8b\\xa1\\xa0g\\xfd\\xae\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\x12\\x8a\\x98\\x08\\x86k\\\u001b[0m\u001b[32mxc7\u001b[0m\u001b[32m=\\xc3\\xea\\x0e\\xb0\\xf0p\\x057\\n5\\x01\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x01\\x18$\\x02`0\\x04\\x14p\\xfc\\xf9\\nFI\\xba9\\xb6SH\\xcb\\xd0meg\\n\\t\\\\=0\\x05\\x14~\\xf0\\n\\'\\'\\x89\\xc26\\xa8\\xdaz\\xbeCv\\xb2\\x7fn\\xca^\\xb5\\x180\\x0b@\\x11\\xa5\\xf9\\x80\\x1a\\x9c\\xe5\\xbf\\x1e\\xb3\\n\\x83\\x0eW6!\\x0f\\xb0,\\xa7\\xdb\\xb0\\xe3B\\xdc\\\\\\xec\\xbb\\x02\\xc2\\x04\\xd9\\x0c\\xa7\\xdfj\\x1a\\x15\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\x18\\x08\\xdfFz%\u001b[0m\u001b[32m)\u001b[0m\u001b[32mb\\xfa\\x9b\\xca\\x99\\xccY\\x01\\xa7\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xf1|\\xe6\\xfe\\xf0*\\x10W\\x18'\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;35mOperationalCredentials\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3950260077\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mNOCs\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNOCStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnoc\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x02\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x15\\x01$\\x11\\x02\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xbe1\\xb2Q\\xd2\\xc2\\x1fn\\x9b\\xc1\\xe5\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\x188\\xca\\x08B\\x05MOu\\xd0\\xb4\\xbb\\x9d\\xeaS\\xa6\\xb0\\xb7\\xc8\\x90\\xd2\\x0b\\xc2I\\xa1\\x1e\\xee\\x92\\xa9P\\x02\\xc2\\xe8~p\\x07\\xb7\\x86&\\x01\\x15\\xcdl\\x838\\x8f\\x12s_\\xd6\\x8d77\\n5\\x01\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x14D\\x99T\\xc8\\\\Q\\xb4\\x10cD\\x9dC\u001b[0m\u001b[32m>\u001b[0m\u001b[32mn\"5\\xf5
\n" + ], + "text/plain": [] + }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "\n", + "\u001b[1m{\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m318338779\u001b[0m\u001b[39m,\u001b[0m\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n", + "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n", + "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n", + "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=\u001b[0m,\n", + "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ │ │ │ │ │ \u001b[0m\u001b[1;36m112233\u001b[0m\n", + "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", + "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m,\n", + "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n", + "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", + "\u001b[1m}\u001b[0m" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "await devCtrl.ReadAttribute(2, [ (0, Clusters.OperationalCredentials)], True)" + "data = await devCtrl.ReadAttribute(2, [ (0, Clusters.AccessControl.Attributes.Acl) ] )\n", + "data" ] }, { "cell_type": "code", - "execution_count": 5, - "id": "af2d1fd0", + "execution_count": 7, + "id": "ae25b644-abc6-4de6-b098-5fbde2409dc4", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
\n",
-       "[\n",
-       "AccessControlEntry(\n",
-       "│   │   fabricIndex=1,\n",
-       "│   │   privilege=<Privilege.kAdminister: 5>,\n",
-       "│   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   subjects=[\n",
-       "│   │   │   1\n",
-       "│   │   ],\n",
-       "│   │   targets=Null\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAccessControlEntryPrivilegeEnum.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m112233\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "acl = data[0][chip.clusters.Objects.AccessControl][chip.clusters.Objects.AccessControl.Attributes.Acl]\n",
+    "acl"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0fef25ad-0b5e-447d-ac36-8e24dee1fd35",
+   "metadata": {},
+   "source": [
+    "### Installing a CASE ACL"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "605f44c4-6abe-4a7b-87e4-9b1e677f9cfe",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
      "metadata": {},
      "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "\n",
+       "\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAccessControlEntryPrivilegeEnum.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m112233\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[35mNull\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[35mNull\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[1m]\u001b[0m"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "acl = [ Clusters.AccessControl.Structs.AccessControlEntryStruct(\n",
+    "acl.append(Clusters.AccessControl.Structs.AccessControlEntryStruct(\n",
     "    fabricIndex = 1,\n",
-    "    privilege = Clusters.AccessControl.Enums.AccessControlEntryPrivilegeEnum.kAdminister,\n",
+    "    privilege = Clusters.AccessControl.Enums.AccessControlEntryPrivilegeEnum.kOperate,\n",
     "    authMode = Clusters.AccessControl.Enums.AccessControlEntryAuthModeEnum.kCase,\n",
-    "    subjects = [ 1 ] ) \n",
-    "]\n",
-    "\n",
+    "    targets = [ Clusters.AccessControl.Structs.AccessControlTargetStruct(\n",
+    "        endpoint = 1,\n",
+    "    ) ] ) )\n",
     "acl"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
-   "id": "bfb94ff7",
+   "execution_count": 9,
+   "id": "66cce24d-c1d4-434c-ab1a-d391b1b8e660",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "[\n",
-       "AttributeStatus(\n",
-       "│   │   Path=AttributePath(\n",
-       "│   │   │   EndpointId=0,\n",
-       "│   │   │   ClusterId=31,\n",
-       "│   │   │   AttributeId=0\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
@@ -543,11 +665,12 @@
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 9,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -556,211 +679,188 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
-   "id": "5ab2bffe",
+   "execution_count": 10,
+   "id": "64f7f5e3-64d1-4b2b-a777-e07f5ef86681",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.AccessControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.Acl'>: [\n",
-       "│   │   │   │   AccessControlEntry(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   privilege=<Privilege.kAdminister: 5>,\n",
-       "│   │   │   │   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   │   │   │   subjects=[\n",
-       "│   │   │   │   │   │   1\n",
-       "│   │   │   │   │   ],\n",
-       "│   │   │   │   │   targets=Null\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ]\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.Acl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m318338782\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m112233\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[35mNull\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[35mNull\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 10,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "data = await devCtrl.ReadAttribute(2, [ (0, Clusters.AccessControl.Attributes.Acl) ] )\n",
-    "data"
+    "await devCtrl.ReadAttribute(2, [ (0, Clusters.AccessControl.Attributes.Acl ) ] )"
    ]
   },
   {
-   "cell_type": "code",
-   "execution_count": 8,
-   "id": "ae25b644-abc6-4de6-b098-5fbde2409dc4",
+   "cell_type": "markdown",
+   "id": "92ae8e3a-7c2b-4e92-a673-a5bdb24d6f61",
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "
\n",
-       "[\n",
-       "AccessControlEntry(\n",
-       "│   │   fabricIndex=1,\n",
-       "│   │   privilege=<Privilege.kAdminister: 5>,\n",
-       "│   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   subjects=[\n",
-       "│   │   │   1\n",
-       "│   │   ],\n",
-       "│   │   targets=Null\n",
-       ")\n",
-       "]\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ - "acl = data[0][chip.clusters.Objects.AccessControl][chip.clusters.Objects.AccessControl.Attributes.Acl]\n", - "acl" + "### Installing a Group ACL" ] }, { "cell_type": "code", - "execution_count": 9, - "id": "605f44c4-6abe-4a7b-87e4-9b1e677f9cfe", + "execution_count": 11, + "id": "144996b2-c029-42f0-931d-536bc5d889f7", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
\n",
-       "[\n",
-       "AccessControlEntry(\n",
-       "│   │   fabricIndex=1,\n",
-       "│   │   privilege=<Privilege.kAdminister: 5>,\n",
-       "│   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   subjects=[\n",
-       "│   │   │   1\n",
-       "│   │   ],\n",
-       "│   │   targets=Null\n",
-       "),\n",
-       "AccessControlEntry(\n",
-       "│   │   fabricIndex=1,\n",
-       "│   │   privilege=<Privilege.kOperate: 3>,\n",
-       "│   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   subjects=Null,\n",
-       "│   │   targets=[\n",
-       "│   │   │   Target(\n",
-       "│   │   │   │   cluster=Null,\n",
-       "│   │   │   │   endpoint=1,\n",
-       "│   │   │   │   deviceType=Null\n",
-       "│   │   │   )\n",
-       "│   │   ]\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAccessControlEntryPrivilegeEnum.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m112233\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m123\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m456\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kOperate:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m3\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[35mNull\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;35mTarget\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[1;36m6\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[35mNull\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[35mNull\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[1;36m8\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 11,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "acl.append(Clusters.AccessControl.Structs.AccessControlEntryStruct(\n",
-    "    fabricIndex = 1,\n",
-    "    privilege = Clusters.AccessControl.Enums.AccessControlEntryPrivilegeEnum.kOperate,\n",
-    "    authMode = Clusters.AccessControl.Enums.AccessControlEntryAuthModeEnum.kCase,\n",
-    "    targets = [ Clusters.AccessControl.Structs.AccessControlTargetStruct(\n",
+    "acl.append( Clusters.AccessControl.Structs.AccessControlEntryStruct(\n",
+    "    privilege = Clusters.AccessControl.Enums.AccessControlEntryPrivilegeEnum.kManage,\n",
+    "    authMode = Clusters.AccessControl.Enums.AccessControlEntryAuthModeEnum.kGroup,\n",
+    "    subjects = [ 123, 456 ],\n",
+    "    targets = [\n",
+    "      Clusters.AccessControl.Structs.AccessControlTargetStruct(\n",
+    "        cluster = Clusters.OnOff.id,\n",
+    "      ),\n",
+    "      Clusters.AccessControl.Structs.AccessControlTargetStruct(\n",
     "        endpoint = 1,\n",
-    "    ) ] ) )\n",
+    "      ),\n",
+    "      Clusters.AccessControl.Structs.AccessControlTargetStruct(\n",
+    "        cluster = Clusters.LevelControl.id,\n",
+    "        endpoint = 2,\n",
+    "      ) ] ) )\n",
     "acl"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
-   "id": "66cce24d-c1d4-434c-ab1a-d391b1b8e660",
+   "execution_count": 12,
+   "id": "678d0076-64eb-4d5c-a778-18331f579d38",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "[\n",
-       "AttributeStatus(\n",
-       "│   │   Path=AttributePath(\n",
-       "│   │   │   EndpointId=0,\n",
-       "│   │   │   ClusterId=31,\n",
-       "│   │   │   AttributeId=0\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
@@ -772,95 +872,100 @@
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 12,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "await devCtrl.WriteAttribute(2, [ (0, Clusters.AccessControl.Attributes.Acl( acl ) ) ] )"
+    "await devCtrl.WriteAttribute(2, [ (0, Clusters.AccessControl.Attributes.Acl( acl ) ) ] ) "
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
-   "id": "64f7f5e3-64d1-4b2b-a777-e07f5ef86681",
+   "execution_count": 13,
+   "id": "202a2f97-33f7-47b6-9e34-730a32a2d454",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.AccessControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.Acl'>: [\n",
-       "│   │   │   │   AccessControlEntry(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   privilege=<Privilege.kAdminister: 5>,\n",
-       "│   │   │   │   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   │   │   │   subjects=[\n",
-       "│   │   │   │   │   │   1\n",
-       "│   │   │   │   │   ],\n",
-       "│   │   │   │   │   targets=Null\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   AccessControlEntry(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   privilege=<Privilege.kOperate: 3>,\n",
-       "│   │   │   │   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   │   │   │   subjects=Null,\n",
-       "│   │   │   │   │   targets=[\n",
-       "│   │   │   │   │   │   Target(\n",
-       "│   │   │   │   │   │   │   cluster=Null,\n",
-       "│   │   │   │   │   │   │   endpoint=1,\n",
-       "│   │   │   │   │   │   │   deviceType=Null\n",
-       "│   │   │   │   │   │   )\n",
-       "│   │   │   │   │   ]\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ]\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.Acl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m318338786\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m112233\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m123\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m456\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kOperate:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m3\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[35mNull\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mTarget\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[1;36m6\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[35mNull\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[35mNull\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mAccessControlTargetStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mcluster\u001b[0m=\u001b[1;36m8\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mendpoint\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[35mNull\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 13,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -870,9 +975,9 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "matter-env",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
-   "name": "matter-env"
+   "name": "python3"
   },
   "language_info": {
    "codemirror_mode": {
@@ -884,7 +989,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.2+chromium.10"
+   "version": "3.10.12"
   }
  },
  "nbformat": 4,
diff --git a/docs/development_controllers/chip-repl/Matter_Basic_Interactions.ipynb b/docs/development_controllers/chip-repl/Matter_Basic_Interactions.ipynb
index bc021aec730fa9..17762732b20714 100644
--- a/docs/development_controllers/chip-repl/Matter_Basic_Interactions.ipynb
+++ b/docs/development_controllers/chip-repl/Matter_Basic_Interactions.ipynb
@@ -74,17 +74,187 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 2,
    "id": "bad327b7-c78a-4c46-b224-077fe7539ee1",
    "metadata": {
     "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "
\n",
+       " Replacing  store path ./credentials/development/paa-root-certs with \n",
+       "/home/root/repos/connectedhomeip/credentials/development/paa-root-certs\n",
+       "Note that you are still running from \n",
+       "/home/root/repos/connectedhomeip/docs/development_controllers/chip-repl so other relative\n",
+       "paths may be off.\n",
+       "                    \n",
+       "
\n" + ], + "text/plain": [ + "\n", + "\u001b[1m Replacing \u001b[0m store path .\u001b[35m/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m with \n", + "\u001b[35m/home/root/repos/connectedhomeip/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m\n", + "Note that you are still running from \n", + "\u001b[35m/home/root/repos/connectedhomeip/docs/development_controllers/\u001b[0m\u001b[95mchip-repl\u001b[0m so other relative\n", + "paths may be off.\n", + " \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1738154311.062905][2316259:2316259] CHIP:CTL: Setting attestation nonce to random value\n", + "[1738154311.063127][2316259:2316259] CHIP:CTL: Setting CSR nonce to random value\n", + "[1738154311.081622][2316259:2316259] CHIP:DL: NVS set: chip-factory/unique-id = \"D70822CB195AF636\"\n", + "[1738154311.082937][2316259:2316259] CHIP:DL: NVS set: chip-factory/vendor-id = 65521 (0xFFF1)\n", + "[1738154311.084099][2316259:2316259] CHIP:DL: NVS set: chip-factory/product-id = 32769 (0x8001)\n", + "[1738154311.085092][2316259:2316259] CHIP:DL: NVS set: chip-counters/reboot-count = 1 (0x1)\n", + "[1738154311.086920][2316259:2316259] CHIP:DL: NVS set: chip-counters/total-operational-hours = 0 (0x0)\n", + "[1738154311.087817][2316259:2316259] CHIP:DL: NVS set: chip-counters/boot-reason = 0 (0x0)\n", + "[1738154311.088738][2316259:2316259] CHIP:DL: NVS set: chip-config/regulatory-location = 0 (0x0)\n", + "[1738154311.089714][2316259:2316259] CHIP:DL: NVS set: chip-config/location-capability = 2 (0x2)\n", + "[1738154311.089954][2316259:2316259] CHIP:DL: Got Ethernet interface: enp2s0\n", + "[1738154311.090062][2316259:2316259] CHIP:DL: Found the primary Ethernet interface:enp2s0\n", + "[1738154311.090187][2316259:2316259] CHIP:DL: Got WiFi interface: wlp3s0\n", + "[1738154311.090318][2316259:2316259] CHIP:DL: Found the primary WiFi interface:wlp3s0\n" + ] + }, + { + "data": { + "text/html": [ + "
─────────────────────────────────────────────────── Matter REPL ───────────────────────────────────────────────────\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[92m─────────────────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ───────────────────────────────────────────────────\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "            \n",
+       "\n",
+       "            Welcome to the Matter Python REPL!\n",
+       "\n",
+       "            For help, please type matterhelp()\n",
+       "\n",
+       "            To get more information on a particular object/class, you can pass\n",
+       "            that into matterhelp() as well.\n",
+       "\n",
+       "            \n",
+       "
\n" + ], + "text/plain": [ + "\n", + " \n", + "\n", + "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", + "\n", + "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", + "\n", + "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", + "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", + "\n", + "\u001b[1;34m \u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[92m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-01-29 13:38:31 ThinkPad chip.storage[2316259] ERROR [Errno 2] No such file or directory: '/tmp/repl-storage.json'\n", + "2025-01-29 13:38:31 ThinkPad chip.storage[2316259] CRITICAL Could not load configuration from /tmp/repl-storage.json - resetting configuration...\n", + "2025-01-29 13:38:31 ThinkPad chip.storage[2316259] WARNING No valid SDK configuration present - clearing out configuration\n", + "2025-01-29 13:38:31 ThinkPad chip.storage[2316259] WARNING No valid REPL configuration present - clearing out configuration\n" + ] + }, + { + "data": { + "text/html": [ + "
\n",
+       "\n",
+       "The following objects have been created:\n",
+       "
\n" + ], + "text/plain": [ + "\n", + "\n", + "\u001b[34mThe following objects have been created:\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
        certificateAuthorityManager:    Manages a list of CertificateAuthority instances.\n",
+       "        caList:                         The list of CertificateAuthority instances.\n",
+       "        caList[n].adminList[m]:         A specific FabricAdmin object at index m for the nth CertificateAuthority \n",
+       "instance.\n",
+       "
\n" + ], + "text/plain": [ + " \u001b[31mcertificateAuthorityManager\u001b[0m\u001b[34m: \u001b[0m\u001b[34mManages a list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34mThe list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mn\u001b[0m\u001b[1;31m]\u001b[0m\u001b[31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mm\u001b[0m\u001b[1;31m]\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34mA specific FabricAdmin object at index m for the nth CertificateAuthority \u001b[0m\n", + "\u001b[34minstance.\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "\n",
+       "Default CHIP Device Controller (NodeId: 112233): has been initialized to manage caList[0].adminList[0] (FabricId = \n",
+       "1), and is available as devCtrl\n",
+       "
\n" + ], + "text/plain": [ + "\n", + "\n", + "\u001b[34mDefault CHIP Device Controller \u001b[0m\u001b[1;34m(\u001b[0m\u001b[34mNodeId: \u001b[0m\u001b[1;34m112233\u001b[0m\u001b[1;34m)\u001b[0m\u001b[34m: has been initialized to manage \u001b[0m\u001b[1;31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m \u001b[0m\u001b[1;34m(\u001b[0m\u001b[1;34mFabricId = \u001b[0m\n", + "\u001b[1;34m1\u001b[0m\u001b[1;34m)\u001b[0m\u001b[1;34m, and is available as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path}" + "%reset -f\n", + "import importlib.util\n", + "spec = importlib.util.find_spec('chip.ChipReplStartup')\n", + "%run {spec.origin}" ] }, { @@ -107,26 +277,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "043ade5d-6f01-4cbc-8d60-57d605946ada", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
\n",
-       "SimpleStruct(\n",
-       "a=20,\n",
-       "b=True,\n",
-       "c=<SimpleEnum.kValueA: 1>,\n",
-       "d=b'1234',\n",
-       "e=30,\n",
-       "f=0,\n",
-       "g=23.234,\n",
-       "h=0.0\n",
-       ")\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n",
@@ -137,12 +303,14 @@
        "\u001b[2;32m│   \u001b[0m\u001b[33me\u001b[0m=\u001b[1;36m30\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m23\u001b[0m\u001b[1;36m.234\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n",
-       "\u001b[1m)\u001b[0m\n"
+       "\u001b[2;32m│   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[33mi\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[1m)\u001b[0m"
       ]
      },
+     "execution_count": 3,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -167,30 +335,35 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 4,
    "id": "d52b1adc-7723-4be8-80c0-f7f262398d39",
-   "metadata": {},
+   "metadata": {
+    "scrolled": true
+   },
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "TestAddArguments(\n",
-       "arg1=0,\n",
-       "arg2=0\n",
-       ")\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1;35mTestAddArguments\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1;36m0\u001b[0m\n",
-       "\u001b[1m)\u001b[0m\n"
+       "\u001b[1m)\u001b[0m"
       ]
      },
+     "execution_count": 4,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -207,74 +380,76 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "id": "c55de6c7-da4e-488e-bafb-32781ee088a8",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
╭──────── <class 'chip.clusters.Objects.UnitTesting.Commands.TestAddArguments'> ─────────╮\n",
-       " def TestCluster.Commands.TestAddArguments(arg1: 'uint' = 0, arg2: 'uint' = 0) -> None: \n",
-       "                                                                                        \n",
-       " TestAddArguments(arg1: 'uint' = 0, arg2: 'uint' = 0)                                   \n",
-       "                                                                                        \n",
-       "                  arg1 = 0                                                              \n",
-       "                  arg2 = 0                                                              \n",
-       "            cluster_id = 1295                                                           \n",
-       "            command_id = 4                                                              \n",
-       "            descriptor = ClusterObjectDescriptor(                                       \n",
-       "                             Fields=[                                                   \n",
-       "                                 ClusterObjectFieldDescriptor(                          \n",
-       "                                     Label='arg1',                                      \n",
-       "                                     Tag=0,                                             \n",
-       "                                     Type=<class 'chip.tlv.uint'>                       \n",
-       "                                 ),                                                     \n",
-       "                                 ClusterObjectFieldDescriptor(                          \n",
-       "                                     Label='arg2',                                      \n",
-       "                                     Tag=1,                                             \n",
-       "                                     Type=<class 'chip.tlv.uint'>                       \n",
-       "                                 )                                                      \n",
-       "                             ]                                                          \n",
-       "                         )                                                              \n",
-       "             is_client = True                                                           \n",
-       " must_use_timed_invoke = False                                                          \n",
-       "              FromDict = def FromDict(data: dict):                                      \n",
-       "               FromTLV = def FromTLV(data: bytes):                                      \n",
-       "                 ToTLV = def ToTLV(self):                                               \n",
-       "╰────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
╭───────────────────── <class 'chip.clusters.Objects.UnitTesting.Commands.TestAddArguments'> ─────────────────────╮\n",
+       " class UnitTesting.Commands.TestAddArguments(arg1: 'uint' = 0, arg2: 'uint' = 0) -> None:                        \n",
+       "                                                                                                                 \n",
+       " TestAddArguments(arg1: 'uint' = 0, arg2: 'uint' = 0)                                                            \n",
+       "                                                                                                                 \n",
+       "                  arg1 = 0                                                                                       \n",
+       "                  arg2 = 0                                                                                       \n",
+       "            cluster_id = 4294048773                                                                              \n",
+       "            command_id = 4                                                                                       \n",
+       "            descriptor = ClusterObjectDescriptor(                                                                \n",
+       "                             Fields=[                                                                            \n",
+       "                                 ClusterObjectFieldDescriptor(                                                   \n",
+       "                                     Label='arg1',                                                               \n",
+       "                                     Tag=0,                                                                      \n",
+       "                                     Type=<class 'chip.tlv.uint'>                                                \n",
+       "                                 ),                                                                              \n",
+       "                                 ClusterObjectFieldDescriptor(                                                   \n",
+       "                                     Label='arg2',                                                               \n",
+       "                                     Tag=1,                                                                      \n",
+       "                                     Type=<class 'chip.tlv.uint'>                                                \n",
+       "                                 )                                                                               \n",
+       "                             ]                                                                                   \n",
+       "                         )                                                                                       \n",
+       "             is_client = True                                                                                    \n",
+       " must_use_timed_invoke = False                                                                                   \n",
+       "         response_type = 'TestAddArgumentsResponse'                                                              \n",
+       "              FromDict = def FromDict(data: dict):                                                               \n",
+       "               FromTLV = def FromTLV(data: bytes):                                                               \n",
+       "                 ToTLV = def ToTLV(self):                                                                        \n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ - "\u001b[34m╭─\u001b[0m\u001b[34m─────── \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Commands.TestAddArguments'\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m ────────\u001b[0m\u001b[34m─╮\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;96mdef \u001b[0m\u001b[1;31mTestCluster.Commands.TestAddArguments\u001b[0m\u001b[1m(\u001b[0marg1: \u001b[32m'uint'\u001b[0m = \u001b[1;36m0\u001b[0m, arg2: \u001b[32m'uint'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m -> \u001b[3;35mNone\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;35mTestAddArguments\u001b[0m\u001b[1;36m(\u001b[0m\u001b[36marg1: \u001b[0m\u001b[32m'uint'\u001b[0m\u001b[36m = \u001b[0m\u001b[1;36m0\u001b[0m\u001b[36m, arg2: \u001b[0m\u001b[32m'uint'\u001b[0m\u001b[36m = \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;36m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33marg1\u001b[0m = \u001b[1;36m0\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33marg2\u001b[0m = \u001b[1;36m0\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mcluster_id\u001b[0m = \u001b[1;36m1295\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mcommand_id\u001b[0m = \u001b[1;36m4\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mdescriptor\u001b[0m = \u001b[1;35mClusterObjectDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mFields\u001b[0m=\u001b[1m[\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;35mClusterObjectFieldDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mLabel\u001b[0m=\u001b[32m'arg1'\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mTag\u001b[0m=\u001b[1;36m0\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mType\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.tlv.uint'\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;35mClusterObjectFieldDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mLabel\u001b[0m=\u001b[32m'arg2'\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mTag\u001b[0m=\u001b[1;36m1\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mType\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.tlv.uint'\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m]\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mis_client\u001b[0m = \u001b[3;92mTrue\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mmust_use_timed_invoke\u001b[0m = \u001b[3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mFromDict\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mFromDict\u001b[0m\u001b[1m(\u001b[0mdata: dict\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mFromTLV\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mFromTLV\u001b[0m\u001b[1m(\u001b[0mdata: bytes\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mToTLV\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mToTLV\u001b[0m\u001b[1m(\u001b[0mself\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" + "\u001b[34m╭─\u001b[0m\u001b[34m────────────────────\u001b[0m\u001b[34m \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Commands.TestAddArguments'\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m \u001b[0m\u001b[34m────────────────────\u001b[0m\u001b[34m─╮\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;96mclass \u001b[0m\u001b[1;31mUnitTesting.Commands.TestAddArguments\u001b[0m\u001b[1m(\u001b[0marg1: \u001b[32m'uint'\u001b[0m = \u001b[1;36m0\u001b[0m, arg2: \u001b[32m'uint'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m -> \u001b[3;35mNone\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;35mTestAddArguments\u001b[0m\u001b[1;36m(\u001b[0m\u001b[36marg1: \u001b[0m\u001b[32m'uint'\u001b[0m\u001b[36m = \u001b[0m\u001b[1;36m0\u001b[0m\u001b[36m, arg2: \u001b[0m\u001b[32m'uint'\u001b[0m\u001b[36m = \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;36m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33marg1\u001b[0m = \u001b[1;36m0\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33marg2\u001b[0m = \u001b[1;36m0\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcluster_id\u001b[0m = \u001b[1;36m4294048773\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcommand_id\u001b[0m = \u001b[1;36m4\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mdescriptor\u001b[0m = \u001b[1;35mClusterObjectDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[33mFields\u001b[0m=\u001b[1m[\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;35mClusterObjectFieldDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[33mLabel\u001b[0m=\u001b[32m'arg1'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[33mTag\u001b[0m=\u001b[1;36m0\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[33mType\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.tlv.uint'\u001b[0m\u001b[39m>\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[39m \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[39m \u001b[0m\u001b[1;35mClusterObjectFieldDescriptor\u001b[0m\u001b[1;39m(\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[39m \u001b[0m\u001b[33mLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'arg2'\u001b[0m\u001b[39m,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[39m \u001b[0m\u001b[33mTag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[39m \u001b[0m\u001b[33mType\u001b[0m\u001b[39m=\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1m]\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mis_client\u001b[0m = \u001b[3;92mTrue\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mmust_use_timed_invoke\u001b[0m = \u001b[3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mresponse_type\u001b[0m = \u001b[32m'TestAddArgumentsResponse'\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mFromDict\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mFromDict\u001b[0m\u001b[1m(\u001b[0mdata: dict\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mFromTLV\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mFromTLV\u001b[0m\u001b[1m(\u001b[0mdata: bytes\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mToTLV\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mToTLV\u001b[0m\u001b[1m(\u001b[0mself\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" ] }, "metadata": {}, @@ -299,30 +474,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "eb2563ac-0315-45ed-9984-308d4376ca94", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
\n",
-       "NullablesAndOptionalsStruct(\n",
-       "nullableInt=Null,\n",
-       "optionalInt=None,\n",
-       "nullableOptionalInt=None,\n",
-       "nullableString=Null,\n",
-       "optionalString=None,\n",
-       "nullableOptionalString=None,\n",
-       "nullableStruct=Null,\n",
-       "optionalStruct=None,\n",
-       "nullableOptionalStruct=None,\n",
-       "nullableList=Null,\n",
-       "optionalList=None,\n",
-       "nullableOptionalList=None\n",
-       ")\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1;35mNullablesAndOptionalsStruct\u001b[0m\u001b[1m(\u001b[0m\n",
@@ -338,11 +505,12 @@
        "\u001b[2;32m│   \u001b[0m\u001b[33mnullableList\u001b[0m=\u001b[35mNull\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33moptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33mnullableOptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
-       "\u001b[1m)\u001b[0m\n"
+       "\u001b[1m)\u001b[0m"
       ]
      },
+     "execution_count": 6,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -363,22 +531,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "id": "75de30fc-666c-4610-9d86-25fb9d0e4f82",
    "metadata": {},
    "outputs": [
     {
-     "data": {
-      "text/html": [
-       "
None\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[3;35mNone\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] } ], "source": [ @@ -397,26 +559,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "677ce9b4-99f3-4c0e-8f78-d123eb3190b5", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
\n",
-       "SimpleStruct(\n",
-       "a=0,\n",
-       "b=False,\n",
-       "c=0,\n",
-       "d=b'',\n",
-       "e='',\n",
-       "f=0,\n",
-       "g=0.0,\n",
-       "h=0.0\n",
-       ")\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n",
@@ -427,12 +585,14 @@
        "\u001b[2;32m│   \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n",
-       "\u001b[1m)\u001b[0m\n"
+       "\u001b[2;32m│   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[33mi\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[1m)\u001b[0m"
       ]
      },
+     "execution_count": 8,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -477,23 +637,25 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 9,
    "id": "52ccd8c6",
    "metadata": {},
    "outputs": [],
    "source": [
     "import time, os\n",
     "import subprocess\n",
-    "\n",
-    "# So that the all-clusters-app won't boot with stale prior state.    \n",
     "os.system('pkill -f chip-all-clusters-app')\n",
+    "time.sleep(1)\n",
     "\n",
-    "# The location of the all-clusters-app in the cloud playground is one level higher - adjust for this by testing for file presence.\n",
-    "if (os.path.isfile('../../../out/debug/chip-all-clusters-app')):\n",
-    "    appPath = '../../../out/debug/chip-all-clusters-app'\n",
+    "CI_APP_PATH = '../../../out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-clang-test/chip-all-clusters-app'\n",
+    "LOCAL_APP_PATH = '../../../out/linux-x64-all-clusters/chip-all-clusters-app'\n",
+    "\n",
+    "# Check if the app built by GitHub Actions is present. Otherwise use the standard all-clusters-app \n",
+    "if (os.path.isfile(CI_APP_PATH)):\n",
+    "    appPath = CI_APP_PATH\n",
     "else:\n",
-    "    appPath = '../../../../out/debug/chip-all-clusters-app'\n",
-    "    \n",
+    "    appPath = LOCAL_APP_PATH\n",
+    "\n",
     "process = subprocess.Popen(appPath, stdout=subprocess.DEVNULL)\n",
     "time.sleep(1)"
    ]
@@ -508,80 +670,87 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 10,
    "id": "67fa53b3",
    "metadata": {
+    "scrolled": true,
     "tags": []
    },
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "[\n",
-       "CommissionableNode(\n",
-       "│   │   (To Be Commissioned By)='caIndex(1)/fabricId(0x0000000000000001)/nodeId(0x000000000001B669)',\n",
-       "│   │   CommissionableNode(\n",
-       "│   │   │   instanceName='B2D5B11D799BB1E0',\n",
-       "│   │   │   hostName='DCA63289ABCD0000',\n",
-       "│   │   │   port=5540,\n",
-       "│   │   │   longDiscriminator=3840,\n",
-       "│   │   │   vendorId=65521,\n",
-       "│   │   │   productId=32769,\n",
-       "│   │   │   commissioningMode=1,\n",
-       "│   │   │   deviceType=0,\n",
-       "│   │   │   deviceName='',\n",
-       "│   │   │   pairingInstruction='',\n",
-       "│   │   │   pairingHint=33,\n",
-       "│   │   │   mrpRetryIntervalIdle=5000,\n",
-       "│   │   │   mrpRetryIntervalActive=300,\n",
-       "│   │   │   supportsTcp=True,\n",
-       "│   │   │   addresses=[\n",
-       "│   │   │   │   'fd1e:1a94:d591:6914:dea6:32ff:fe89:abcd',\n",
-       "│   │   │   │   'fe80::dea6:32ff:fe89:abcd',\n",
-       "│   │   │   │   '172.16.243.198'\n",
-       "│   │   │   ]\n",
-       "│   │   )\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;35mCommissionableNode\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m(\u001b[0mTo Be Commissioned By\u001b[1m)\u001b[0m=\u001b[32m'caIndex\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/fabricId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x0000000000000001\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/nodeId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x000000000001B669\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1;35mCommissionableNode\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33minstanceName\u001b[0m=\u001b[32m'B2D5B11D799BB1E0'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mhostName\u001b[0m=\u001b[32m'DCA63289ABCD0000'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mport\u001b[0m=\u001b[1;36m5540\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mlongDiscriminator\u001b[0m=\u001b[1;36m3840\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mproductId\u001b[0m=\u001b[1;36m32769\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mcommissioningMode\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mdeviceName\u001b[0m=\u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mpairingInstruction\u001b[0m=\u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mpairingHint\u001b[0m=\u001b[1;36m33\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mmrpRetryIntervalIdle\u001b[0m=\u001b[1;36m5000\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mmrpRetryIntervalActive\u001b[0m=\u001b[1;36m300\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33msupportsTcp\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33maddresses\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'fd1e:1a94:d591:6914:dea6:32ff:fe89:abcd'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'fe80::dea6:32ff:fe89:abcd'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'192.168.2.1'\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33minstanceName\u001b[0m=\u001b[32m'1B7688F69BBA2270'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mhostName\u001b[0m=\u001b[32m'88A4C203D2100000'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mport\u001b[0m=\u001b[1;36m5540\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mlongDiscriminator\u001b[0m=\u001b[1;36m3840\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mproductId\u001b[0m=\u001b[1;36m32769\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mcommissioningMode\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[1;36m257\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mdeviceName\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mpairingInstruction\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mpairingHint\u001b[0m=\u001b[1;36m33\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mmrpRetryIntervalIdle\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mmrpRetryIntervalActive\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mmrpRetryActiveThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msupportsTcpClient\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msupportsTcpServer\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33misICDOperatingAsLIT\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33maddresses\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[32m'fe80::fa3c:14ea:6d21:1b06'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[32m'192.168.50.108'\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mrotatingId\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m,\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mCommissionableNode\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m(\u001b[0mTo Be Commissioned By\u001b[1m)\u001b[0m=\u001b[32m'caIndex\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/fabricId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x0000000000000001\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/nodeId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x000000000001B669\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33minstanceName\u001b[0m=\u001b[32m'1B7688F69BBA2270'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mhostName\u001b[0m=\u001b[32m'88A4C203D2100000'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mport\u001b[0m=\u001b[1;36m5540\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mlongDiscriminator\u001b[0m=\u001b[1;36m3840\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mproductId\u001b[0m=\u001b[1;36m32769\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mcommissioningMode\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[1;36m257\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mdeviceName\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mpairingInstruction\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mpairingHint\u001b[0m=\u001b[1;36m33\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mmrpRetryIntervalIdle\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mmrpRetryIntervalActive\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mmrpRetryActiveThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msupportsTcpClient\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33msupportsTcpServer\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33misICDOperatingAsLIT\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33maddresses\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[32m'172.17.0.1'\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mrotatingId\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 10,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "devices = devCtrl.DiscoverCommissionableNodes(filterType=chip.discovery.FilterType.LONG_DISCRIMINATOR, filter=3840, stopOnFirst=True, timeoutSecond=2)\n",
+    "devices = await devCtrl.DiscoverCommissionableNodes(filterType=chip.discovery.FilterType.LONG_DISCRIMINATOR, filter=3840, stopOnFirst=True, timeoutSecond=2)\n",
     "devices"
    ]
   },
@@ -597,14 +766,35 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 11,
    "id": "2a7a7c40",
    "metadata": {
     "tags": []
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "\u001b[1;36m2\u001b[0m"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "devices[0].Commission(233, 20202021)"
+    "await devices[0].Commission(2, 20202021)"
    ]
   },
   {
@@ -622,48 +812,25 @@
    "source": [
     "#### Commission Target (Locally Launched App)\n",
     "\n",
-    "Commission the target with a NodeId of 1."
+    "Commission the target with a NodeId of 2.\n",
+    "\n",
+    "> **WARNING**: The device can only be commissioned once. Repeating the commissioning process will result in Errors.\n",
+    "The line `%%script true` has been added to bypass execution errors and allow the notebook to run automatically.\n",
+    ">
If you wish to test the behaviour of the function, remove `%%script true`" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "id": "5e964fe3", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-01-29 15:34:45 johnsj-macbookpro1.roam.corp.google.com chip.SC[10607] ERROR The device does not support GetClock_RealTimeMS() API. This will eventually result in CASE session setup failures.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Node address has been updated\n", - "Commissioning complete\n" - ] - }, - { - "data": { - "text/html": [ - "
True\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[3;92mTrue\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "devCtrl.CommissionIP(b'127.0.0.1', 20202021, 2)" + "%%script true\n", + "\n", + "await devCtrl.CommissionOnNetwork(2, 20202021)" ] }, { @@ -682,14 +849,16 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "a1e762ad-b272-4a9c-959c-6fc1543d9631", "metadata": { "tags": [] }, "outputs": [], "source": [ - "devCtrl.CommissionThread(3840, 20202021, 2, b'\\x01\\x03\\xff')" + "%%script true\n", + "\n", + "await devCtrl.CommissionThread(3840, 20202021, 2, b'\\x01\\x03\\xff')" ] }, { @@ -701,21 +870,23 @@ "source": [ "#### Commission Target (BLE + WiFi)\n", "\n", - "To commission a Wifi-based target over BLE, ensure your BLE stack is up on your host and available as `hci0` on Linux. You can confirm this by running `hciconfig -a`. You'll also need Wifi credentials to join the Thread network.\n", + "To commission a Wifi-based target over BLE, ensure your BLE stack is up on your host and available as `hci0` on Linux. You can confirm this by running `hciconfig -a`. You'll also need Wifi credentials to join the WiFi network.\n", "\n", "> NOTE: MacOS Monterey is currently not supported due to issues with its BLE stack." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "3b552280-8586-4b5d-acde-c7806e882f23", "metadata": { "tags": [] }, "outputs": [], "source": [ - "devCtrl.CommissionWiFi(3840, 20202021, 2, 'MyWifiSsid', 'MyWifiPassword')" + "%%script true\n", + "\n", + "await devCtrl.CommissionWiFi(3840, 20202021, 2, 'MyWifiSsid', 'MyWifiPassword')" ] }, { @@ -746,7 +917,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 15, "id": "bed38512-91f8-4d4e-b6e1-b30749137bbd", "metadata": {}, "outputs": [], @@ -782,25 +953,21 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 16, "id": "2935f13b-ca16-4f9c-b320-8896c8465278", "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
InteractionModelError(<Status.Failure: 1>)\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.Failure:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "InteractionModelError(, 255)\n" + ] } ], "source": [ + "from pprint import pprint\n", + "\n", "try:\n", " await devCtrl.SendCommand(2, 100, Clusters.OnOff.Commands.On())\n", "except Exception as e:\n", @@ -827,7 +994,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 17, "id": "33f34d12-79f4-4230-836b-2e66ea839440", "metadata": { "tags": [] @@ -836,17 +1003,15 @@ { "data": { "text/html": [ - "
\n",
-       "TestListInt8UReverseResponse(\n",
-       "arg1=[\n",
-       "│   │   7,\n",
-       "│   │   5,\n",
-       "│   │   3,\n",
-       "│   │   1\n",
-       "]\n",
-       ")\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1;35mTestListInt8UReverseResponse\u001b[0m\u001b[1m(\u001b[0m\n",
@@ -856,11 +1021,12 @@
        "\u001b[2;32m│   │   \u001b[0m\u001b[1;36m3\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m]\u001b[0m\n",
-       "\u001b[1m)\u001b[0m\n"
+       "\u001b[1m)\u001b[0m"
       ]
      },
+     "execution_count": 17,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -889,36 +1055,37 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 18,
    "id": "7167af96-43b1-4524-8712-592e3ede6114",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.UnitTesting'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int16u'>: 0\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m439497020\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1;36m0\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 18,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -928,28 +1095,33 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 19,
    "id": "b6c3bf1f-3247-4f8d-ac42-1b5ebc59cb44",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "<class 'chip.clusters.Objects.UnitTesting.Attributes.Int16u'>: 0\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[2;32m│   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Attribute.DataVersion'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;36m439497020\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[39m\u001b[0m: \u001b[1;36m0\u001b[0m\n",
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 19,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -958,22 +1130,29 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 20,
    "id": "a2cafa5e-6c0e-42b9-bac0-8a1770306718",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
0\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
-       "\u001b[1;36m0\u001b[0m\n"
+       "\u001b[1;36m0\u001b[0m"
       ]
      },
+     "execution_count": 20,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -992,38 +1171,38 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 21,
    "id": "8e2cb85c-9fa4-4f2e-bd71-aea54988274d",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.UnitTesting'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Boolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int16u'>: 0\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Boolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m439497020\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1;36m0\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 21,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -1042,48 +1221,64 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 22,
    "id": "043cb3ac-3346-45f1-bcd3-803ea33dc3c0",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2475301757\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: Null\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 22,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -1100,70 +1295,97 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 23,
    "id": "15d7a880-9ddd-4619-9e42-3fd8895d80e1",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   }\n",
-       "},\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2475301757\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1656272886\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 23,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -1180,102 +1402,262 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 24,
    "id": "accb9351-c8e0-4a4e-86d9-784b35903144",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   1030\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'>: 2\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3994102238\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m128\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2171024504\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mHoldTimeLimitsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m300\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeDefault\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m10\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1658710865\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4220563284\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m374163796\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'B3'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1270857495\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m47\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m98\u001b[0m\u001b[39m,\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1030\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m256\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1656272886\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 24,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -1292,2059 +1674,4939 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 25,
    "id": "6fff453d-59a4-4dba-878f-1c65c7b1958b",
    "metadata": {
     "scrolled": true,
     "tags": []
    },
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 0, Attribute = , got IM Error: InteractionModelError: UnsupportedRead (0x8f)\n",
-      "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 1, Attribute = , got IM Error: InteractionModelError: UnsupportedRead (0x8f)\n",
-      "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 1, Attribute = , got IM Error: InteractionModelError: InvalidDataType (0x8d)\n",
-      "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 1, Attribute = , got IM Error: InteractionModelError: Failure (0x1)\n"
-     ]
-    },
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.Identify'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyType'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=22,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   3,\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   30,\n",
-       "│   │   │   │   31,\n",
-       "│   │   │   │   40,\n",
-       "│   │   │   │   42,\n",
-       "│   │   │   │   43,\n",
-       "│   │   │   │   44,\n",
-       "│   │   │   │   46,\n",
-       "│   │   │   │   48,\n",
-       "│   │   │   │   49,\n",
-       "│   │   │   │   50,\n",
-       "│   │   │   │   51,\n",
-       "│   │   │   │   52,\n",
-       "│   │   │   │   53,\n",
-       "│   │   │   │   54,\n",
-       "│   │   │   │   55,\n",
-       "│   │   │   │   60,\n",
-       "│   │   │   │   62,\n",
-       "│   │   │   │   63,\n",
-       "│   │   │   │   64,\n",
-       "│   │   │   │   65,\n",
-       "│   │   │   │   1029\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [\n",
-       "│   │   │   │   41\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [\n",
-       "│   │   │   │   1,\n",
-       "│   │   │   │   2\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Binding'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Binding.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AccessControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.Acl'>: [\n",
-       "│   │   │   │   AccessControlEntry(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   privilege=<Privilege.kAdminister: 5>,\n",
-       "│   │   │   │   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   │   │   │   subjects=[\n",
-       "│   │   │   │   │   │   1\n",
-       "│   │   │   │   │   ],\n",
-       "│   │   │   │   │   targets=Null\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.Extension'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Basic'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.InteractionModelVersion'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.VendorName'>: 'TEST_VENDOR',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.VendorID'>: 9050,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductName'>: 'TEST_PRODUCT',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductID'>: 65279,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.NodeLabel'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.Location'>: 'XX',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.HardwareVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.HardwareVersionString'>: 'TEST_VERSION',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.SoftwareVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.SoftwareVersionString'>: 'prerelease',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ManufacturingDate'>: '20210614123456ZZ',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.PartNumber'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductURL'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductLabel'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.SerialNumber'>: 'TEST_SN',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.LocalConfigDisabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.Reachable'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.UniqueID'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.DefaultOTAProviders'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdatePossible'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateState'>: <UpdateStateEnum.kUnknown: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateStateProgress'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.LocalizationConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.LocalizationConfiguration.Attributes.ActiveLocale'>: 'en-US',\n",
-       "│   │   │   <class 'chip.clusters.Objects.LocalizationConfiguration.Attributes.SupportedLocales'>: [\n",
-       "│   │   │   │   'Test',\n",
-       "│   │   │   │   'en-US',\n",
-       "│   │   │   │   'de-DE',\n",
-       "│   │   │   │   'fr-FR',\n",
-       "│   │   │   │   'en-GB',\n",
-       "│   │   │   │   'es-ES',\n",
-       "│   │   │   │   'zh-CN',\n",
-       "│   │   │   │   'it-IT',\n",
-       "│   │   │   │   'ja-JP'\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.LocalizationConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.TimeFormatLocalization'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.HourFormat'>: <HourFormat.k12hr: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.ActiveCalendarType'>: <CalendarType.kBuddhist: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.SupportedCalendarTypes'>: [\n",
-       "│   │   │   │   <CalendarType.kBuddhist: 0>,\n",
-       "│   │   │   │   <CalendarType.kChinese: 1>,\n",
-       "│   │   │   │   <CalendarType.kCoptic: 2>,\n",
-       "│   │   │   │   <CalendarType.kEthiopian: 3>,\n",
-       "│   │   │   │   <CalendarType.kGregorian: 4>,\n",
-       "│   │   │   │   <CalendarType.kHebrew: 5>,\n",
-       "│   │   │   │   <CalendarType.kIndian: 6>,\n",
-       "│   │   │   │   <CalendarType.kIslamic: 7>,\n",
-       "│   │   │   │   <CalendarType.kJapanese: 8>,\n",
-       "│   │   │   │   <CalendarType.kKorean: 9>,\n",
-       "│   │   │   │   <CalendarType.kPersian: 10>,\n",
-       "│   │   │   │   <CalendarType.kTaiwanese: 11>\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PowerSourceConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSourceConfiguration.Attributes.Sources'>: [\n",
-       "│   │   │   │   1\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSourceConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.GeneralCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.Breadcrumb'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.BasicCommissioningInfoList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.RegulatoryConfig'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.LocationCapability'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.FeatureMap'>: 6,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.NetworkCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.UnsupportedRead: 143>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'>: <NetworkCommissioningStatusEnum.kSuccess: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.GeneralDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.NetworkInterfaces'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.RebootCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.UpTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.TotalOperationalHours'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.BootReasons'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveHardwareFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveRadioFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveNetworkFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.SoftwareDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ThreadMetrics'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapFree'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapUsed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapHighWatermark'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.FeatureMap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Channel'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RoutingRole'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NetworkName'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PanId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ExtendedPanId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.MeshLocalPrefix'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OverrunCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NeighborTableList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouteTableList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Weighting'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DataVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.StableDataVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRouterId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DetachedRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChildRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouterRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.AttachAttemptCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionIdChangeCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.BetterPartitionAttachAttemptCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ParentChangeCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxTotalCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxUnicastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBroadcastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckRequestedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxNoAckRequestedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataPollCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconRequestCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxOtherCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxRetryCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDirectMaxRetryExpiryCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxIndirectMaxRetryExpiryCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrCcaCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrAbortCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrBusyChannelCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxTotalCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxUnicastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBroadcastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataPollCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconRequestCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxOtherCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxAddressFilteredCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDestAddrFilteredCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDuplicatedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrNoFrameCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrUnknownNeighborCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrInvalidSrcAddrCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrSecCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrFcsCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrOtherCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveTimestamp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PendingTimestamp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Delay'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.SecurityPolicy'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChannelMask'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OperationalDatasetComponents'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveNetworkFaultsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.FeatureMap'>: 15,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Bssid'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.SecurityType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.WiFiVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ChannelNumber'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Rssi'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconLostCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastTxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastTxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.CurrentMaxRate'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.OverrunCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.FeatureMap'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PHYRate'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FullDuplex'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketTxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TxErrCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CollisionCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.OverrunCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CarrierDetect'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TimeSinceReset'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FeatureMap'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AdministratorCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.WindowStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminFabricIndex'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminVendorId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OperationalCredentials'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.NOCs'>: [\n",
-       "│   │   │   │   NOCStruct(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   noc=b'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x01$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x11\\x02$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xbc8\\x9d2\\xe7\\xe6\\x0f\\x12\\xcb\\x0fYb\\x8f\\xa6zc\\xa1\\xb2y\\x18\\xc3~\\x98\\xee\\xa9r\\xd3\\x18\\xe9@\\xf9\\x17B\\xa6\\xed\\x11\\x92\\xc2\\xe2k&\\x88m\\r^`\\x10\\xc3|\\xdd\\xb4)\\r\\x11\\xcc\\xd1p\\x9bwN)H)\\x187\\n5\\x01(\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x14B8k q\\xd8Lv\\x85^A;\\xceyC\\xa4\\xe9|\\xc1\\x120\\x05\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83]\\xa5-\\x97jG\\xdb\\x87\\x180\\x0b@4\\n\\xcd\\x15+\\xa9n}s\\xbb$u\\x12\\xec\"B\\x00\\x98\\x1fD\\xd4\\xb7\\xcc\\xbb\\xd3\\x17*\\xfa\\xd3\\x8atX]\\xca\\xec\\xaf:[$o|\\xc6\"z\\x15\\xb4d\\x144\\x11i\\xa4\\xaa7\\xce\\x9f\\xc5l\\x11\\xe7I\\x87L\\x88\\x18',\n",
-       "│   │   │   │   │   icac=b'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x13\\x01$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xf2\\xc0\\x10\\xe9=c\\x9e\\xed.\\xaaQj\\x0ca\\xd8\\x1f\\xfb:\\xf2\\x92$\\x04hc><\\xb2\\xc9R>\\xfe\\x1f\\x121\\xf2\\xaf5 \\xc4\\r\\xd3=\\xd0\\xae\\xbe\\xb4\\x85\\x8dI\\xfa`Z\\xaeI\\xfe*>\\xb1\\x88:,Rs\\xb57\\n5\\x01)\\x01\\x18$\\x02`0\\x04\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83]\\xa5-\\x97jG\\xdb\\x870\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@\\x91\\x1cY!4-\\\\\\xc1hC[q\\xa8\\x85\\x00\\xa7\\xdd\\xd8\\x1fAM\\xca-6\\xf5 \\x89\\x85k\\x05;\\x15\\xd0\\x83A>D\\xe9\\x9e\\xc1]\\xbb\\xcd\\x8c\\x83\\xbbm\\xab\\xf9\\x8a\\xdb\\x9df\\x11\\x05\\x98hC\\x8f\\xcd\\xad\\n7\\x9e\\x18'\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'>: [\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa',\n",
-       "│   │   │   │   │   vendorId=60064,\n",
-       "│   │   │   │   │   fabricId=1,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label=''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.SupportedFabrics'>: 16,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.CommissionedFabrics'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.TrustedRootCertificates'>: [\n",
-       "│   │   │   │   b'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x14\\x00$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa7\\n5\\x01)\\x01\\x18$\\x02`0\\x04\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd50\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@J\\xa5\\xdb\\xec9\\xd3i\\xbf\\xa84\\xbc(r\\xfb\\xf9\\x95X\\x00\\xf1\\x1f\\xd5#\\x14x\\xbeT}\\xda\\xe1\\x15\\x94\\x92\\xdb\\xc8\\xccI0\\xc5\\xe2\\x1ev0h\\x10N\\xdd\\x8b\\xd7\\x94\\x90]\\xd4\\x8f\\x08>\\x8b\\xc8j\\x05\\xbeb\\xed\\xd5\\xe0\\x18'\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.CurrentFabricIndex'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.GroupKeyManagement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupKeyMap'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupTable'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupsPerFabric'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupKeysPerFabric'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.FixedLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.UserLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   }\n",
-       "},\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.Identify'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyType'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Scenes'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.SceneCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.CurrentScene'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.CurrentGroup'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.SceneValid'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.NameSupport'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchActions'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.LevelControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.CurrentLevel'>: 254,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.RemainingTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MinLevel'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MaxLevel'>: 254,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.CurrentFrequency'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MinFrequency'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MaxFrequency'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.Options'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OnOffTransitionTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OnLevel'>: 254,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OnTransitionTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OffTransitionTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.DefaultMoveRate'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.StartUpCurrentLevel'>: Null,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.FeatureMap'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.ClusterRevision'>: 5\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BinaryInputBasic'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.OutOfService'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.PresentValue'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.StatusFlags'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   3,\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   5,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   7,\n",
-       "│   │   │   │   8,\n",
-       "│   │   │   │   15,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   30,\n",
-       "│   │   │   │   37,\n",
-       "│   │   │   │   47,\n",
-       "│   │   │   │   49,\n",
-       "│   │   │   │   57,\n",
-       "│   │   │   │   59,\n",
-       "│   │   │   │   64,\n",
-       "│   │   │   │   65,\n",
-       "│   │   │   │   69,\n",
-       "│   │   │   │   80,\n",
-       "│   │   │   │   257,\n",
-       "│   │   │   │   258,\n",
-       "│   │   │   │   259,\n",
-       "│   │   │   │   512,\n",
-       "│   │   │   │   513,\n",
-       "│   │   │   │   516,\n",
-       "│   │   │   │   768,\n",
-       "│   │   │   │   1024,\n",
-       "│   │   │   │   1026,\n",
-       "│   │   │   │   1027,\n",
-       "│   │   │   │   1028,\n",
-       "│   │   │   │   1029,\n",
-       "│   │   │   │   1030,\n",
-       "│   │   │   │   1280,\n",
-       "│   │   │   │   1283,\n",
-       "│   │   │   │   1284,\n",
-       "│   │   │   │   1285,\n",
-       "│   │   │   │   1286,\n",
-       "│   │   │   │   1287,\n",
-       "│   │   │   │   1288,\n",
-       "│   │   │   │   1289,\n",
-       "│   │   │   │   1290,\n",
-       "│   │   │   │   1291,\n",
-       "│   │   │   │   1292,\n",
-       "│   │   │   │   1293,\n",
-       "│   │   │   │   1294,\n",
-       "│   │   │   │   1295,\n",
-       "│   │   │   │   2820\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Binding'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Binding.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Actions'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.ActionList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.EndpointList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.SetupUrl'>: 'https://example.com',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PowerSource'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.Status'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.Order'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.Description'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryVoltage'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryPercentRemaining'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryTimeRemaining'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeLevel'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.ActiveBatteryFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeState'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.NetworkCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.UnsupportedRead: 143>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'>: <NetworkCommissioningStatusEnum.kSuccess: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BridgedDeviceBasicInformation'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BridgedDeviceBasicInformation.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Switch'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.NumberOfPositions'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.CurrentPosition'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.MultiPressMax'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.FixedLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.UserLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BooleanState'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BooleanState.Attributes.StateValue'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BooleanState.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ModeSelect'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.CurrentMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.SupportedModes'>: [\n",
-       "│   │   │   │   ModeOptionStruct(\n",
-       "│   │   │   │   │   label='Black',\n",
-       "│   │   │   │   │   mode=0,\n",
-       "│   │   │   │   │   semanticTag=0\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   ModeOptionStruct(\n",
-       "│   │   │   │   │   label='Cappuccino',\n",
-       "│   │   │   │   │   mode=4,\n",
-       "│   │   │   │   │   semanticTag=0\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   ModeOptionStruct(\n",
-       "│   │   │   │   │   label='Espresso',\n",
-       "│   │   │   │   │   mode=7,\n",
-       "│   │   │   │   │   semanticTag=0\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.OnMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.StartUpMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.Description'>: 'Coffee',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.DoorLock'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.LockState'>: <DlLockState.kUnlocked: 2>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.LockType'>: <DlLockType.kDeadBolt: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.ActuatorEnabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DoorState'>: <DlDoorState.kDoorOpen: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DoorOpenEvents'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DoorClosedEvents'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.OpenPeriod'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfTotalUsersSupported'>: 10,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfPINUsersSupported'>: 10,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfWeekDaySchedulesSupportedPerUser'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfYearDaySchedulesSupportedPerUser'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfHolidaySchedulesSupported'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.MaxPINCodeLength'>: 6,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.MinPINCodeLength'>: 6,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.CredentialRulesSupport'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.Language'>: 'en',\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.AutoRelockTime'>: 96,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.SoundVolume'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.OperatingMode'>: <DlOperatingMode.kNormal: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.SupportedOperatingModes'>: 65526,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DefaultConfigurationRegister'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.EnableOneTouchLocking'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.EnableInsideStatusLED'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.EnablePrivacyModeButton'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.WrongCodeEntryLimit'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.UserCodeTemporaryDisableTime'>: 10,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.RequirePINforRemoteOperation'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.WindowCovering'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.Type'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLift'>: 32767,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTilt'>: 32767,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.ConfigStatus'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercentage'>: 50,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercentage'>: 50,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.OperationalStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionLiftPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionTiltPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.EndProductType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitLift'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitLift'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitTilt'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitTilt'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.Mode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.SafetyStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.ClusterRevision'>: 5\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BarrierControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierMovingState'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierSafetyStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierCapabilities'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierPosition'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxSpeed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxFlow'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinCompPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxCompPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstSpeed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstSpeed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstFlow'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstFlow'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstTemp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstTemp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.PumpStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveOperationMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveControlMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Capacity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Speed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeRunningHours'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Power'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeEnergyConsumed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.OperationMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ControlMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.AlarmMask'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Thermostat'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.LocalTemperature'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMinHeatSetpointLimit'>: 700,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMaxHeatSetpointLimit'>: 3000,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMinCoolSetpointLimit'>: 1600,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMaxCoolSetpointLimit'>: 3200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.OccupiedCoolingSetpoint'>: 2600,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.OccupiedHeatingSetpoint'>: 2000,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MinHeatSetpointLimit'>: 700,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MaxHeatSetpointLimit'>: 3000,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MinCoolSetpointLimit'>: 1600,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MaxCoolSetpointLimit'>: 3200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MinSetpointDeadBand'>: 25,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.ControlSequenceOfOperation'>: 4,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.SystemMode'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.StartOfWeek'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.NumberOfWeeklyTransitions'>: 7,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.NumberOfDailyTransitions'>: 4,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.FeatureMap'>: 11,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.TemperatureDisplayMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.KeypadLockout'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ScheduleProgrammingVisibility'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ColorControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentHue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentSaturation'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.RemainingTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentX'>: 24939,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentY'>: 24701,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.DriftCompensation'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CompensationText'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorTemperature'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorMode'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorControlOptions'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.NumberOfPrimaries'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary1X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary1Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary1Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary2X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary2Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary2Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary3X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary3Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary3Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary4X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary4Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary4Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary5X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary5Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary5Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary6X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary6Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary6Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.WhitePointX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.WhitePointY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointRX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointRY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointRIntensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointGX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointGY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointGIntensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointBX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointBY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointBIntensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.EnhancedCurrentHue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.EnhancedColorMode'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopActive'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopDirection'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopTime'>: 25,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStartEnhancedHue'>: 8960,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStoredEnhancedHue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorCapabilities'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMin'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMax'>: 65279,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CoupleColorTempToLevelMinMireds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.StartUpColorTemperatureMireds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.IlluminanceMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MinMeasuredValue'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MaxMeasuredValue'>: 65534,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.LightSensorType'>: Null,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.TemperatureMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.MeasuredValue'>: -32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.MinMeasuredValue'>: -32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.MaxMeasuredValue'>: -32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PressureMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.FlowMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.IasZone'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneState'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneType'>: 541,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.IasCieAddress'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneId'>: 255,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.WakeOnLan'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.WakeOnLan.Attributes.WakeOnLanMacAddress'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.WakeOnLan.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Channel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Channel.Attributes.ChannelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Channel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.TargetNavigator'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TargetNavigator.Attributes.TargetNavigatorList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TargetNavigator.Attributes.CurrentNavigatorTarget'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TargetNavigator.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.MediaPlayback'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackState'>: <PlaybackStateEnum.kPlaying: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.StartTime'>: 255,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.Duration'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackSpeed'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeEnd'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeStart'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.MediaInput'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaInput.Attributes.MediaInputList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaInput.Attributes.CurrentMediaInput'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaInput.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.LowPower'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.LowPower.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.KeypadInput'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.KeypadInput.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ContentLauncher'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ContentLauncher.Attributes.AcceptHeaderList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ContentLauncher.Attributes.SupportedStreamingProtocols'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ContentLauncher.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AudioOutput'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AudioOutput.Attributes.AudioOutputList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.AudioOutput.Attributes.CurrentAudioOutput'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AudioOutput.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ApplicationLauncher'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationLauncher.Attributes.ApplicationLauncherList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationLauncher.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ApplicationBasic'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.VendorName'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.VendorId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationName'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ProductId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationStatus'>: <ApplicationStatusEnum.kStopped: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationVersion'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.AllowedVendorList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AccountLogin'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccountLogin.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.UnitTesting'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Boolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Bitmap8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Bitmap16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Bitmap32'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Bitmap64'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int8u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int16u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int24u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int32u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int40u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int48u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int56u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int64u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int8s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int16s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int24s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int32s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int40s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int48s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int56s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int64s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Enum8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Enum16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.FloatSingle'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.FloatDouble'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.OctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ListInt8u'>: [\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ListOctetString'>: [\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b''\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ListStructOctetString'>: [\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.LongOctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.CharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.LongCharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.EpochUs'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.EpochS'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.VendorId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ListNullablesAndOptionalsStruct'>: [\n",
-       "│   │   │   │   NullablesAndOptionalsStruct(\n",
-       "│   │   │   │   │   nullableInt=Null,\n",
-       "│   │   │   │   │   optionalInt=None,\n",
-       "│   │   │   │   │   nullableOptionalInt=None,\n",
-       "│   │   │   │   │   nullableString=Null,\n",
-       "│   │   │   │   │   optionalString=None,\n",
-       "│   │   │   │   │   nullableOptionalString=None,\n",
-       "│   │   │   │   │   nullableStruct=Null,\n",
-       "│   │   │   │   │   optionalStruct=None,\n",
-       "│   │   │   │   │   nullableOptionalStruct=None,\n",
-       "│   │   │   │   │   nullableList=Null,\n",
-       "│   │   │   │   │   optionalList=None,\n",
-       "│   │   │   │   │   nullableOptionalList=None\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.EnumAttr'>: <SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.StructAttr'>: SimpleStruct(\n",
-       "│   │   │   │   a=0,\n",
-       "│   │   │   │   b=False,\n",
-       "│   │   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   │   d=b'',\n",
-       "│   │   │   │   e='',\n",
-       "│   │   │   │   f=0,\n",
-       "│   │   │   │   g=0.0,\n",
-       "│   │   │   │   h=0.0\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt8u'>: 70,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt8s'>: -20,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt16u'>: 200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt16s'>: -100,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ListLongOctetString'>: [\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ListFabricScoped'>: [\n",
-       "│   │   │   │   TestFabricScoped(\n",
-       "│   │   │   │   │   fabricIndex=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.TimedWriteBoolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.GeneralErrorBoolean'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.InvalidDataType: 141>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ClusterErrorBoolean'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.Failure: 1>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableBoolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap32'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap64'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt8u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt16u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt24u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt32u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt40u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt48u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt56u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt64u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt8s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt16s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt24s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt32s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt40s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt48s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt56s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableInt64s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableEnum8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableEnum16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableFloatSingle'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableFloatDouble'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableOctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableCharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableEnumAttr'>: <SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableStruct'>: Null,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt8u'>: 70,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt8s'>: -20,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt16u'>: 200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt16s'>: -100,\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ElectricalMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.MeasurementType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.TotalActivePower'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltage'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMin'>: 32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMax'>: 32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrent'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMin'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMax'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePower'>: -1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMin'>: -1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMax'>: -1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ClusterRevision'>: 3\n",
-       "│   │   }\n",
-       "},\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   1030\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'>: 2\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m22\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m30\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m40\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m42\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m43\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m44\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m46\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m48\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m49\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m50\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m51\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m52\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m53\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m54\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m55\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m60\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m62\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m63\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1029\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m41\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.Acl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.Extension'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.InteractionModelVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.VendorName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_VENDOR'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.VendorID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m9050\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_PRODUCT'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65279\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.NodeLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.Location'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'XX'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.HardwareVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.HardwareVersionString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_VERSION'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.SoftwareVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.SoftwareVersionString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'prerelease'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ManufacturingDate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'20210614123456ZZ'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.PartNumber'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductURL'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.SerialNumber'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_SN'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.LocalConfigDisabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.Reachable'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.UniqueID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.DefaultOTAProviders'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdatePossible'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mUpdateStateEnum.kUnknown:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateStateProgress'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration.Attributes.ActiveLocale'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'en-US'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration.Attributes.SupportedLocales'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'Test'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'en-US'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'de-DE'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'fr-FR'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'en-GB'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'es-ES'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'zh-CN'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'it-IT'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'ja-JP'\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.HourFormat'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mHourFormat.k12hr:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.ActiveCalendarType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kBuddhist:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.SupportedCalendarTypes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kBuddhist:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kChinese:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kCoptic:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kEthiopian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m3\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kGregorian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m4\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kHebrew:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kIndian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m6\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kIslamic:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m7\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kJapanese:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m8\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kKorean:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m9\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kPersian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kTaiwanese:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m11\u001b[0m\u001b[1m>\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSourceConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSourceConfiguration.Attributes.Sources'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSourceConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.Breadcrumb'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.BasicCommissioningInfoList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.RegulatoryConfig'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.LocationCapability'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m6\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.UnsupportedRead:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m143\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mNetworkCommissioningStatusEnum.kSuccess:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.NetworkInterfaces'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.RebootCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.UpTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.TotalOperationalHours'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.BootReasons'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveHardwareFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveRadioFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveNetworkFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ThreadMetrics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapFree'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapUsed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapHighWatermark'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Channel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RoutingRole'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NetworkName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PanId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ExtendedPanId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.MeshLocalPrefix'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OverrunCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NeighborTableList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouteTableList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Weighting'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DataVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.StableDataVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRouterId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DetachedRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChildRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouterRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.AttachAttemptCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionIdChangeCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.BetterPartitionAttachAttemptCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ParentChangeCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxTotalCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxUnicastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBroadcastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckRequestedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxNoAckRequestedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataPollCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconRequestCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxOtherCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxRetryCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDirectMaxRetryExpiryCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxIndirectMaxRetryExpiryCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrCcaCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrAbortCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrBusyChannelCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxTotalCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxUnicastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBroadcastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataPollCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconRequestCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxOtherCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxAddressFilteredCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDestAddrFilteredCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDuplicatedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrNoFrameCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrUnknownNeighborCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrInvalidSrcAddrCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrSecCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrFcsCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrOtherCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveTimestamp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PendingTimestamp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Delay'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.SecurityPolicy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChannelMask'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OperationalDatasetComponents'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveNetworkFaultsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m15\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Bssid'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.SecurityType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.WiFiVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ChannelNumber'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Rssi'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconLostCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastTxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastTxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.CurrentMaxRate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.OverrunCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PHYRate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FullDuplex'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketTxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TxErrCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CollisionCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.OverrunCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CarrierDetect'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TimeSinceReset'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.WindowStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminFabricIndex'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminVendorId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.NOCs'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNOCStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnoc\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x01$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x11\\x02$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xbc8\\x9d2\\xe7\\xe6\\x0f\\x12\\xcb\\x0fYb\\x8f\\xa6zc\\xa1\\xb2y\\x18\\xc3~\\x98\\xee\\xa9r\\xd3\\x18\\xe9@\\xf9\\x17B\\xa6\\xed\\x11\\x92\\xc2\\xe2k&\\x88m\\r^`\\x10\\xc3|\\xdd\\xb4\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\r\\x11\\xcc\\xd1p\\x9bwN\u001b[0m\u001b[32m)\u001b[0m\u001b[32mH\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x187\\n5\\x01\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x14B8k q\\xd8Lv\\x85^A;\\xceyC\\xa4\\xe9|\\xc1\\x120\\x05\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xa5-\\x97jG\\xdb\\x87\\x180\\x0b@4\\n\\xcd\\x15+\\xa9n\u001b[0m\u001b[32m}\u001b[0m\u001b[32ms\\xbb$u\\x12\\xec\"B\\x00\\x98\\x1fD\\xd4\\xb7\\xcc\\xbb\\xd3\\x17*\\xfa\\xd3\\x8atX\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xca\\xec\\xaf:\u001b[0m\u001b[32m[\u001b[0m\u001b[32m$o|\\xc6\"z\\x15\\xb4d\\x144\\x11i\\xa4\\xaa7\\xce\\x9f\\xc5l\\x11\\xe7I\\x87L\\x88\\x18'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33micac\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x13\\x01$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xf2\\xc0\\x10\\\u001b[0m\u001b[32mxe9\u001b[0m\u001b[32m=\u001b[0m\u001b[32mc\u001b[0m\u001b[32m\\x9e\\xed.\\xaaQj\\x0ca\\xd8\\x1f\\xfb:\\xf2\\x92$\\x04hc>\u001b[0m\u001b[32m<\u001b[0m\u001b[32m\\xb2\\xc9R\u001b[0m\u001b[32m>\u001b[0m\u001b[32m\\xfe\\x1f\\x121\\xf2\\xaf5 \\xc4\\r\\\u001b[0m\u001b[32mxd3\u001b[0m\u001b[32m=\\xd0\\xae\\xbe\\xb4\\x85\\x8dI\\xfa`Z\\xaeI\\xfe*>\\xb1\\x88:,Rs\\xb57\\n5\\x01\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x01\\x18$\\x02`0\\x04\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xa5-\\x97jG\\xdb\\x870\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd\u001b[0m\u001b[32m<\u001b[0m\u001b[32m\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@\\x91\\x1cY!4-\\\\\\xc1hC\u001b[0m\u001b[32m[\u001b[0m\u001b[32mq\\xa8\\x85\\x00\\xa7\\xdd\\xd8\\x1fAM\\xca-6\\xf5 \\x89\\x85k\\x05;\\x15\\xd0\\x83A\u001b[0m\u001b[32m>\u001b[0m\u001b[32mD\\xe9\\x9e\\xc1\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xbb\\xcd\\x8c\\x83\\xbbm\\xab\\xf9\\x8a\\xdb\\x9df\\x11\\x05\\x98hC\\x8f\\xcd\\xad\\n7\\x9e\\x18'\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m60064\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.SupportedFabrics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m16\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.CommissionedFabrics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.TrustedRootCertificates'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x14\\x00$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa7\\n5\\x01\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x01\\x18$\\x02`0\\x04\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd\u001b[0m\u001b[32m<\u001b[0m\u001b[32m\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd50\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@J\\xa5\\xdb\\xec9\\xd3i\\xbf\\xa84\\xbc\u001b[0m\u001b[32m(\u001b[0m\u001b[32mr\\xfb\\xf9\\x95X\\x00\\xf1\\x1f\\xd5#\\x14x\\xbeT\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xda\\xe1\\x15\\x94\\x92\\xdb\\xc8\\xccI0\\xc5\\xe2\\x1ev0h\\x10N\\xdd\\x8b\\xd7\\x94\\x90\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xd4\\x8f\\x08\u001b[0m\u001b[32m>\u001b[0m\u001b[32m\\x8b\\xc8j\\x05\\xbeb\\xed\\xd5\\xe0\\x18'\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.CurrentFabricIndex'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupKeyMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupTable'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupsPerFabric'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupKeysPerFabric'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.SceneCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.CurrentScene'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.CurrentGroup'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.SceneValid'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchActions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.CurrentLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m254\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.RemainingTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MinLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MaxLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m254\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.CurrentFrequency'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MinFrequency'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MaxFrequency'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.Options'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OnOffTransitionTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OnLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m254\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OnTransitionTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OffTransitionTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.DefaultMoveRate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.StartUpCurrentLevel'\u001b[0m\u001b[1m>\u001b[0m: Null,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m5\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.OutOfService'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.PresentValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.StatusFlags'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m30\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m37\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m47\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m49\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m57\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m59\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m69\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m80\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m257\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m258\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m259\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m512\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m513\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m516\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m768\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1024\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1026\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1027\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1028\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1029\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1030\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1280\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1283\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1284\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1285\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1286\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1287\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1288\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1289\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1290\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1291\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1292\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1293\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1294\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1295\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2820\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.ActionList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.EndpointList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.SetupUrl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'https://example.com'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.Status'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.Order'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.Description'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryVoltage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryPercentRemaining'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryTimeRemaining'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.ActiveBatteryFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.UnsupportedRead:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m143\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mNetworkCommissioningStatusEnum.kSuccess:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BridgedDeviceBasicInformation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BridgedDeviceBasicInformation.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.NumberOfPositions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.CurrentPosition'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.MultiPressMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BooleanState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BooleanState.Attributes.StateValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BooleanState.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.CurrentMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.SupportedModes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Black'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msemanticTag\u001b[0m=\u001b[1;36m0\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Cappuccino'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m=\u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msemanticTag\u001b[0m=\u001b[1;36m0\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Espresso'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m=\u001b[1;36m7\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msemanticTag\u001b[0m=\u001b[1;36m0\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.OnMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.StartUpMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.Description'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'Coffee'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.LockState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlLockState.kUnlocked:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.LockType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlLockType.kDeadBolt:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.ActuatorEnabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DoorState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlDoorState.kDoorOpen:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DoorOpenEvents'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DoorClosedEvents'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.OpenPeriod'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfTotalUsersSupported'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m10\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfPINUsersSupported'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m10\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfWeekDaySchedulesSupportedPerUser'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfYearDaySchedulesSupportedPerUser'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfHolidaySchedulesSupported'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.MaxPINCodeLength'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m6\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.MinPINCodeLength'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m6\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.CredentialRulesSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.Language'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'en'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.AutoRelockTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m96\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.SoundVolume'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.OperatingMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlOperatingMode.kNormal:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.SupportedOperatingModes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65526\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DefaultConfigurationRegister'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.EnableOneTouchLocking'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.EnableInsideStatusLED'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.EnablePrivacyModeButton'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.WrongCodeEntryLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.UserCodeTemporaryDisableTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m10\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.RequirePINforRemoteOperation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.Type'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLift'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32767\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTilt'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32767\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.ConfigStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercentage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m50\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercentage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m50\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.OperationalStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionLiftPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionTiltPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.EndProductType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitLift'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitLift'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitTilt'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitTilt'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.Mode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.SafetyStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m5\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierMovingState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierSafetyStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierCapabilities'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierPosition'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxFlow'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinCompPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxCompPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstFlow'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstFlow'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstTemp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstTemp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.PumpStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveOperationMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveControlMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Capacity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Speed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeRunningHours'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Power'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeEnergyConsumed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.OperationMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ControlMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.AlarmMask'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.LocalTemperature'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMinHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m700\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMaxHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3000\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMinCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1600\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMaxCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3200\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.OccupiedCoolingSetpoint'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2600\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.OccupiedHeatingSetpoint'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2000\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MinHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m700\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MaxHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3000\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MinCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1600\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MaxCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3200\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MinSetpointDeadBand'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m25\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.ControlSequenceOfOperation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.SystemMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.StartOfWeek'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.NumberOfWeeklyTransitions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m7\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.NumberOfDailyTransitions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m11\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.TemperatureDisplayMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.KeypadLockout'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ScheduleProgrammingVisibility'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentSaturation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.RemainingTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m24939\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m24701\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.DriftCompensation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CompensationText'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorTemperature'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorControlOptions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.NumberOfPrimaries'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary1X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary1Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary1Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary2X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary2Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary2Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary3X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary3Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary3Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary4X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary4Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary4Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary5X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary5Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary5Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary6X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary6Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary6Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.WhitePointX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.WhitePointY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointRX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointRY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointRIntensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointGX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointGY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointGIntensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointBX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointBY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointBIntensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.EnhancedCurrentHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.EnhancedColorMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopActive'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopDirection'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m25\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStartEnhancedHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m8960\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStoredEnhancedHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorCapabilities'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65279\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CoupleColorTempToLevelMinMireds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.StartUpColorTemperatureMireds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65534\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.LightSensorType'\u001b[0m\u001b[1m>\u001b[0m: Null,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-32768\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-32768\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-32768\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m541\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.IasCieAddress'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m255\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WakeOnLan'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WakeOnLan.Attributes.WakeOnLanMacAddress'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WakeOnLan.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Channel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Channel.Attributes.ChannelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Channel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator.Attributes.TargetNavigatorList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator.Attributes.CurrentNavigatorTarget'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mPlaybackStateEnum.kPlaying:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.StartTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m255\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.Duration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeEnd'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeStart'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput.Attributes.MediaInputList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput.Attributes.CurrentMediaInput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LowPower'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LowPower.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.KeypadInput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.KeypadInput.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher.Attributes.AcceptHeaderList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher.Attributes.SupportedStreamingProtocols'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput.Attributes.AudioOutputList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput.Attributes.CurrentAudioOutput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationLauncher'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationLauncher.Attributes.ApplicationLauncherList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationLauncher.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.VendorName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.VendorId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ProductId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mApplicationStatusEnum.kStopped:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.AllowedVendorList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccountLogin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccountLogin.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Boolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Bitmap8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Bitmap16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Bitmap32'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Bitmap64'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int24u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int32u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int40u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int48u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int56u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int64u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int24s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int32s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int40s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int48s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int56s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int64s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Enum8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Enum16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.FloatSingle'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.FloatDouble'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.OctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ListInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ListOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LaundryWasherControls'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3952184724\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'Off'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'Low'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'Medium'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'High'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1821926757\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m32767\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m32767\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65535\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m27\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m26\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65535\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65535\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65535\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5000\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m439497020\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mSimpleStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33ma\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mb\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mc\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33md\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33me\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mf\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mg\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mh\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mi\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m\u001b[39m,\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ListStructOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.LongOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.CharString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.LongCharString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.EpochUs'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.EpochS'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.VendorId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ListNullablesAndOptionalsStruct'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNullablesAndOptionalsStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableInt\u001b[0m=\u001b[35mNull\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalInt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalInt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableString\u001b[0m=\u001b[35mNull\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalString\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalString\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableStruct\u001b[0m=\u001b[35mNull\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalStruct\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalStruct\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableList\u001b[0m=\u001b[35mNull\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.EnumAttr'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.StructAttr'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m70\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-20\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m200\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.RangeRestrictedInt16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-100\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ListLongOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mTLVValue\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mReason\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mInteractionModelError\u001b[0m\u001b[1;39m(\u001b[0m\u001b[39m\u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m-20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m70\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember1\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember2\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember1\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember2\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember1\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember2\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember1\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmember2\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m25\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4294049962\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32mb''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mTLVValue\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mReason\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mInteractionModelError\u001b[0m\u001b[1;39m(\u001b[0m\u001b[39m\u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m70\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m200\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4294049979\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m25\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m26\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m27\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m28\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m32\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m33\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m34\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m35\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m37\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m38\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m39\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m40\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m41\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m42\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m43\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m48\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m49\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m51\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m52\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12288\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12289\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16388\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16389\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16390\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16391\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16392\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16393\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16394\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16395\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16396\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16397\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16398\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16399\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16400\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16401\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16402\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16403\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16404\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16405\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16406\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16407\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16408\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16409\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16414\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16420\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16421\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16422\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16423\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16424\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16425\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16426\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16435\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16436\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4294070017\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mTLVValue\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mReason\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mInteractionModelError\u001b[0m\u001b[1;39m(\u001b[0m\u001b[39m\u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mTestGlobalStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mmyBitmap\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mmyEnum\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32mb''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m\u001b[39m,\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ListFabricScoped'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTestFabricScoped\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.TimedWriteBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.GeneralErrorBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.InvalidDataType:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m141\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ClusterErrorBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.Failure:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap32'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableBitmap64'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt24u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt32u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt40u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt48u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt56u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt64u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt24s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt32s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt40s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt48s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt56s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableInt64s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableEnum8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableEnum16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableFloatSingle'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableFloatDouble'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableCharString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableEnumAttr'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableStruct'\u001b[0m\u001b[1m>\u001b[0m: Null,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m70\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-20\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m200\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.NullableRangeRestrictedInt16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-100\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.MeasurementType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.TotalActivePower'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32768\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32768\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrent'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePower'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m-20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m-100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m-100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m200\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNullablesAndOptionalsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableInt\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalInt\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalInt\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableString\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalString\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalString\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableStruct\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalStruct\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalStruct\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableList\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moptionalList\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnullableOptionalList\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32mb''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3518872582\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2815764172\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1867324670\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1077094336\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3130468674\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m32\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m33\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2475301757\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m838808377\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2166972274\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'111112222233'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'gtin8xxx'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'4444455555666'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'gtin14xxxxxxxx'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'oem20xxxxxxxxxxxxxxx'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2122560187\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m400316759\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m254\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m32\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m48\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m49\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m51\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m52\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m53\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m254\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2878054799\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1258332906\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mErrorStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateDetails\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m940213312\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'room'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'bedroom 2'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'orientation'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'North'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'floor'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'2'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'direction'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'up'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3118789738\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Normal'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Defrost'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3695315748\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1558336805\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'Hot'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'Warm'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'Freezing'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1263056761\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1056897843\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3831230641\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Normal'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Rapid Cool'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Rapid Freeze'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m26366735\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4056837231\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m599596032\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65534\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1982197115\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1634145010\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m37\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m47\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m59\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m69\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m72\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m73\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m74\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m80\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m81\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m82\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m83\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m84\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m85\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m86\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m87\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m89\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m91\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m92\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m93\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m94\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m96\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m97\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m98\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m113\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m114\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m128\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m129\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m144\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m145\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m148\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m152\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m153\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m155\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m156\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m157\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m158\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m159\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m258\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m512\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m513\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m514\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m516\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m768\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m769\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1024\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1026\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1027\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1028\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1029\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1030\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1036\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1037\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1043\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1045\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1066\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1067\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1068\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1069\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1070\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1071\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1283\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1288\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4294048773\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m256\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3376363787\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1278660077\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m24701\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m154\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m24939\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m454\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m250\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m25\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m250\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m67\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m68\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m71\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m75\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m76\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m8960\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m25\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m26\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m27\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m32\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m33\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m34\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m37\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m38\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m40\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m41\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m42\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m48\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m49\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m51\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m52\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m54\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m55\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m56\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m58\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m59\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m60\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16388\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16389\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16390\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16394\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16395\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16396\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16397\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16400\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2745260718\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m128\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m66\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mErrorStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateDetails\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1468428795\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m47\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m47\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1388996793\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'B2'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m849609238\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1448295399\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65536\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Vacuum'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Wash'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Deep clean'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m131907619\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3981224049\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m731264343\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m35\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m37\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m38\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m39\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m600\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m80000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1282586777\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3586559020\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Manual'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Auto-scheduled'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Solar'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Auto-scheduled with Solar charging'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m604674426\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mOperationalStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moperationalStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mErrorStateStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateLabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33merrorStateDetails\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2185778544\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1572204256\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Idle'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Cleaning'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Mapping'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65536\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2572965019\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m128\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1148398740\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4293984257\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'Coffee'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Black'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msemanticTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Cappuccino'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msemanticTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Espresso'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msemanticTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1183264025\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m100\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m678327300\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Normal'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Delicate'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Heavy'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Whites'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16387\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2464224752\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m25\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m27\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m28\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m72\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m73\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m74\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m75\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m77\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m78\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m79\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m80\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m81\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m82\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1600\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetHandle\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x01'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mcoolingSetpoint\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2500\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mheatingSetpoint\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mbuiltIn\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetHandle\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x02'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mcoolingSetpoint\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2600\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mheatingSetpoint\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mbuiltIn\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3200\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32mb''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m700\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m25\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1600\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2600\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m253\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnumberOfPresets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetTypeFeatures\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnumberOfPresets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetTypeFeatures\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnumberOfPresets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetTypeFeatures\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnumberOfPresets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetTypeFeatures\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnumberOfPresets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetTypeFeatures\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mPresetTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetScenario\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnumberOfPresets\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mpresetTypeFeatures\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3200\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m254\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m700\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m291\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2163402603\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3616251408\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mHoldTimeLimitsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m300\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeDefault\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m10\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1036554111\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1632544680\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m630077002\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3703460357\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m254\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m254\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2018142431\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mMeasurementAccuracyStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mmeasurementType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mmeasured\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mminMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mmaxMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33maccuracyRanges\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2023875062\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4208411723\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3203981046\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasurementType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasured\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mminMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-50000000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmaxMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m50000000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33maccuracyRanges\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-50000000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-10000000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-9999999\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m9999999\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m500\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m10000000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m50000000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasurementType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasured\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mminMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-100000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmaxMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33maccuracyRanges\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-100000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-4999\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4999\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m500\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasurementType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasured\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mminMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-500000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmaxMeasuredValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m500000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33maccuracyRanges\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-500000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-100000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m-99999\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m99999\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m500\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mMeasurementAccuracyRangeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mrangeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m500000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mpercentTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMax\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedMin\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mfixedTypical\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mHarmonicMeasurementStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33morder\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasurement\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100000\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mHarmonicMeasurementStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33morder\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmeasurement\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100000\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m191472871\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'https://example.com'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3904308277\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1177504198\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'111112222233'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'gtin8xxx'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'4444455555666'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'gtin14xxxxxxxx'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mReplacementProductStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mproductIdentifierValue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'oem20xxxxxxxxxxxxxxx'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1133184322\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mBalanceStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstep\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Efficient'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mBalanceStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstep\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mBalanceStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstep\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Comfort'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mBalanceStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstep\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'1 Minute'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mBalanceStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstep\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'5 Minutes'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mBalanceStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstep\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'10 Minutes'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3912078908\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1000.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0.0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m320\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1.0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3125157948\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSceneInfoStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msceneCount\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mcurrentScene\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mcurrentGroup\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msceneValid\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mremainingCapacity\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1013736200\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Off'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Manual'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Timed'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4283712150\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3937413178\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2087551459\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m80497179\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'No energy management \u001b[0m\u001b[32m(\u001b[0m\u001b[32mforecast only\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Device optimizes \u001b[0m\u001b[32m(\u001b[0m\u001b[32mno local or grid control\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Optimized within building'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Optimized for grid'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16387\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Optimized for grid and building'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16387\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2327973389\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m85351309\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Normal'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Heavy'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Light'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3098432079\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Bake'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16384\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Convection'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16385\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Grill'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16386\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Roast'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16387\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Clean'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16388\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Convection Bake'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16389\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Convection Roast'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16390\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Warming'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16391\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'Proofing'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmode\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmodeTags\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;35mModeTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16392\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m822429471\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m374552237\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'TEST_SN'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m32769\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'XX'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mCapabilityMinimaStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mcaseSessionsPerFabric\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33msubscriptionsPerFabric\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m65535\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'D70822CB195AF636'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'TEST_VERSION'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m17039360\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mProductAppearanceStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mfinish\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mprimaryColor\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'1.0'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m65521\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'20200101'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'TEST_VENDOR'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'TEST_PRODUCT'\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2652677544\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'room'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'bedroom 2'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'orientation'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'North'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'floor'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'2'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mLabelStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'direction'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalue\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'up'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3301725475\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1493996232\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3216262947\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m791469513149945\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mTimeZoneStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffset\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvalidAt\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1680707863\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1367792\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m262416\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1367792\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mThreadMetricsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2316334\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'2316334'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeMinimum\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackSize\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mThreadMetricsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2316333\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'2316333'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeMinimum\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackSize\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mThreadMetricsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2316332\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'2316332'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeMinimum\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackSize\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mThreadMetricsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2316331\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'2316331'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeMinimum\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackSize\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mThreadMetricsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mid\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2316330\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'2316330'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackFreeMinimum\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mstackSize\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1212225478\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2807182948\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1257786647\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNetworkInterface\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'docker0'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33misOperational\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv4\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv6\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mhardwareAddress\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x02B\\xc1\\x8e*\\xa0'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv4Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[32mb'\\xac\\x11\\x00\\x01'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv6Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[32mb''\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNetworkInterface\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'wlp3s0'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33misOperational\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv4\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv6\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mhardwareAddress\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\xc8\\x94\\x02\\xdf\\x92\\x95'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv4Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[32mb'\\xc0\\xa82l'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv6Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[32mb'\\xfe\\x80\\x00\\x00\\x00\\x00\\x00\\x00\\xfa<\\x14\\xeam!\\x1b\\x06'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNetworkInterface\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'enp2s0'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33misOperational\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv4\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv6\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mhardwareAddress\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x88\\xa4\\xc2\\x03\\xd2\\x10'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv4Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv6Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNetworkInterface\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mname\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'lo'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33misOperational\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv4\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33moffPremiseServicesReachableIPv6\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mhardwareAddress\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x00\\x00\\x00\\x00\\x00\\x00'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv4Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[32mb'\\x7f\\x00\\x00\\x01'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mIPv6Addresses\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[32mb'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2442821600\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'B1'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1051125554\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m13\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m18\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m19\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m20\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m21\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m23\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m24\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m25\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m26\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m27\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m28\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m32\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m33\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m34\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m35\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m36\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m37\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m38\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m39\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m40\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m41\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m42\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m43\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m44\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m45\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m46\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m47\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m48\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m49\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m51\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m52\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m53\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m54\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m55\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m56\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m57\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m58\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m59\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m60\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m61\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m62\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2923529572\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   │   \u001b[0m\u001b[1;36m112233\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m578308192\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m-68\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m12\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m32\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32mb'\\xc8\\x94\\x02\\xdf\\x92\\x95'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m432300000\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m149\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3015977773\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1742718448\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3996473632\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2715791168\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNetworkInfoStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnetworkID\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'enp2s0'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mconnected\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnetworkIdentifier\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mclientIdentifier\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m216322318\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m128\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3099986434\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mBasicCommissioningInfo\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mfailSafeExpiryLengthSeconds\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m60\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mmaxCumulativeFailsafeSeconds\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m900\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m955126441\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m22\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m41\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m40\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m42\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m43\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m44\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m45\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m46\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m47\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m48\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m49\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m50\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m51\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m52\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m53\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m54\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m55\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m56\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m60\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m62\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m63\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1029\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4294048774\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m217815959\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m9\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m11\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mNOCStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnoc\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x02\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x15\\x01$\\x11\\x02\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04T/\\xe1\\xdf\\n;>\\xd3k\\xc17\\xcd\\xf13\\x10\u001b[0m\u001b[32m)\u001b[0m\u001b[32m1\\xf9\\xf2\\xbb\\xf9L\\xbc\u001b[0m\u001b[32m[\u001b[0m\u001b[32m<\\xb0\\x1c\\x00\\xc1\\x04l\\x16!\\xe6\\xc6\\xf7\\x1bI\\x07\\xcf2\\xd5M\\xd4\\n\\x94\\x18\\x90\\xc4B\\xdf\\xed_$|\\n\\xe1\\x7fM\\xa2c\\x03*+7\\n5\\x01\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x140G \\xcd\\r\\\\b\\'\\x90\\x8d>\\x8e\\xdd\\xd9\\xff\\xd5\\x1a\\x1f\\x84\\x8f0\\x05\\x14\\xe8\\xb0\\xe8\\xd4R\\xe0\\xc3\\xf8\\xbbJ\\x1b\\xa9sL\\xa8U\\x10H\\x97I\\x180\\x0b@\u001b[0m\u001b[32m[\u001b[0m\u001b[32m\\xc5\\x8e\\xd2\\xeb\\xc3\\x8a\\xc5\\x95\\xebO:\\x07E\\xaeG\\xbd!\\xe1\\xc4X$\\xd3\\x97\\x0cQy\\\\\\xa6\\xc6\\x07H\\x9d\\xf8\\x0e-\\xfaFU\\x18\\\\\\x80A@D-E\\xea5\\x8c\\x19\\xdb\\xff_\\x9ed\\x1e\\xf5^\\xbcR\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\x80\\xc5\\x18'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33micac\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x14\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x13\\x02\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04m\\x1b\\x8eT\\x82\\x02\\xeaJ\\xf3\\xa1r\u001b[0m\u001b[32m{\u001b[0m\u001b[32mjr\\x16\\xd0\\xd5;\\x98%\u001b[0m\u001b[32m{\u001b[0m\u001b[32m7\\x06@\\xb6\\xa1\\xce\\x03#\\xfeo\\x01Ug\\xb3I$S\\xa1\\xbd\\xe9\\xb2\\x94\\xee\\xbbD\\xc5\\xb3\\x06\\xc4f\\xcf<\\xc8\\x9dZ\\xa6\\xad\\xa7\\xe5\\x96\\xc7\\x19\\xef7\\n5\\x01\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x01\\x18$\\x02`0\\x04\\x14\\xe8\\xb0\\xe8\\xd4R\\xe0\\xc3\\xf8\\xbbJ\\x1b\\xa9sL\\xa8U\\x10H\\x97I0\\x05\\x14\\xdbo\\\\Zui\\xb3\\x9f\\xe0\\xf6\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x11N\\xf8\\xc2ce\\xda\\x8e\\x01\\x180\\x0b@e\\x9e\\x17\\x8as-\\x18a\\x13\\xac9\\x92.\\t\\x99\\xd7\\x15\\x94c>\\xa7\\x16\\xab\\x84\\xdf\\xe4M\\x81\\x91\\xe4\\x91\\xdb2J\\x02\\xf3Y\\xf95\\xc4\\xaf\\x87\\xe3\\xfb\\x96\\xfd\\x81-\\x0f\\xd5e\\xf6\\xcd\\x0c\\x0bG8\\r\\xa2\\xca\\xae\\xbds\\xbb\\x18'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m\u001b[39m=\u001b[0m\u001b[32mb\"\u001b[0m\u001b[32m\\x04v\\x949'\u001b[0m\u001b[32m[\u001b[0m\u001b[32m\\x10V\\x8f\\x93\\xb6\\xb6\\x9a\\xa9Q\\xb7\\x05\\x83\\xe3\\xf2\\xa1\\xa1\\x07\\xd7S.\\x9b\\x80\u001b[0m\u001b[32m[\u001b[0m\u001b[32m#\\x04\\x14N\\x8f\\xba\\x13I\\xb3\\xcd\\xff\\xe4\\xc4\\x1a\\x13\\xe7g\\x1f\\x01c\\x92j\\xe2\\xba\\x00\\x07j\\xea\\xa9\\xf2'\\x7f\\x84\\xd3\\x0b\\xff\"\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m65521\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[32m''\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32mb'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x14\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x14\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04v\\x949\\'\u001b[0m\u001b[32m[\u001b[0m\u001b[32m\\x10V\\x8f\\x93\\xb6\\xb6\\x9a\\xa9Q\\xb7\\x05\\x83\\xe3\\xf2\\xa1\\xa1\\x07\\xd7S.\\x9b\\x80\u001b[0m\u001b[32m[\u001b[0m\u001b[32m#\\x04\\x14N\\x8f\\xba\\x13I\\xb3\\xcd\\xff\\xe4\\xc4\\x1a\\x13\\xe7g\\x1f\\x01c\\x92j\\xe2\\xba\\x00\\x07j\\xea\\xa9\\xf2\\'\\x7f\\x84\\xd3\\x0b\\xff7\\n5\\x01\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x01\\x18$\\x02`0\\x04\\x14\\xdbo\\\\Zui\\xb3\\x9f\\xe0\\xf6\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x11N\\xf8\\xc2ce\\xda\\x8e\\x010\\x05\\x14\\xdbo\\\\Zui\\xb3\\x9f\\xe0\\xf6\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x11N\\xf8\\xc2ce\\xda\\x8e\\x01\\x180\\x0b@\\xed\\xc2\\xaeV\\xb4r\\xa5\\xe6\\x00\\xf4\\xca%\\x8b/\\xb4\\xdc\\x0b\\x828\\xc5M3\\xcc\\x04\\xc4\\xad|\\xe4\\xe5U<\\x8e\\x9e\\xc9\\xfb#\\xb3\\xaf\\r\\x81\\\u001b[0m\u001b[32mxc7\u001b[0m\u001b[32m=\u001b[0m\u001b[32mrSk\u001b[0m\u001b[32m:&j\\\\\\xd0\u001b[0m\u001b[32m}\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\xb3\\xe3\\xa3\\xe7v\\xadhv\\x17!\\xea\\xbe\\x18'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m8\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1539332134\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'en-US'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'en-US'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'de-DE'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'fr-FR'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'en-GB'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'es-ES'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'zh-CN'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'it-IT'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'ja-JP'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1540735921\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1392266135\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m257143989\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2505890144\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[39m\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1658710865\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: Null,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4220563284\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m374163796\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[32m'B3'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1656272886\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[3;91mFalse\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2171024504\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mHoldTimeLimitsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m300\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeDefault\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m10\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3994102238\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m128\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1270857495\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m256\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m47\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m98\u001b[0m\u001b[39m,\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1030\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1357459428\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m59\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m67\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3527829753\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m58\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3475778820\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2494470048\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m67\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m59\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2169252413\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m30\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m}\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m878799405\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: ,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1;36m4\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 25,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -3358,143 +6620,304 @@
    "source": [
     "#### Alternative 'Cluster' View\n",
     "\n",
-    "The above encapsulates each attribute as a 'cluster-object' key within the top-level cluster instance. Instead, an alternative view each attribute is represented as a field in the object can be retrieved by passing in `True` to the third argument:"
+    "The above encapsulates each attribute as a 'cluster-object' key within the top-level cluster instance. Instead, an alternative view each attribute is represented as a field in the object can be retrieved by passing in `True` to the argument `returnClusterObject`:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 26,
    "id": "b46b9c2a-30c9-48e9-84ce-fe261cc10a5f",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: Groups(\n",
-       "│   │   │   nameSupport=128,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=None,\n",
-       "│   │   │   clusterRevision=3\n",
-       "│   │   ),\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: OnOff(\n",
-       "│   │   │   onOff=False,\n",
-       "│   │   │   globalSceneControl=True,\n",
-       "│   │   │   onTime=0,\n",
-       "│   │   │   offWaitTime=0,\n",
-       "│   │   │   startUpOnOff=0,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=0,\n",
-       "│   │   │   clusterRevision=4\n",
-       "│   │   ),\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: Descriptor(\n",
-       "│   │   │   deviceList=[\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   serverList=[\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   1030\n",
-       "│   │   │   ],\n",
-       "│   │   │   clientList=[],\n",
-       "│   │   │   partsList=[],\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=None,\n",
-       "│   │   │   clusterRevision=1\n",
-       "│   │   ),\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: OccupancySensing(\n",
-       "│   │   │   occupancy=0,\n",
-       "│   │   │   occupancySensorType=0,\n",
-       "│   │   │   occupancySensorTypeBitmap=1,\n",
-       "│   │   │   pirOccupiedToUnoccupiedDelay=None,\n",
-       "│   │   │   pirUnoccupiedToOccupiedDelay=None,\n",
-       "│   │   │   pirUnoccupiedToOccupiedThreshold=None,\n",
-       "│   │   │   ultrasonicOccupiedToUnoccupiedDelay=None,\n",
-       "│   │   │   ultrasonicUnoccupiedToOccupiedDelay=None,\n",
-       "│   │   │   ultrasonicUnoccupiedToOccupiedThreshold=None,\n",
-       "│   │   │   physicalContactOccupiedToUnoccupiedDelay=None,\n",
-       "│   │   │   physicalContactUnoccupiedToOccupiedDelay=None,\n",
-       "│   │   │   physicalContactUnoccupiedToOccupiedThreshold=None,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=None,\n",
-       "│   │   │   clusterRevision=2\n",
-       "│   │   )\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mGroups\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mnameSupport\u001b[0m=\u001b[1;36m128\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m3\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mOnOff\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monOff\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mglobalSceneControl\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moffWaitTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mstartUpOnOff\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m4\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mdeviceList\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mserverList\u001b[0m=\u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;35mGroups\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3994102238\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mnameSupport\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m128\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mOccupancySensing\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2171024504\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moccupancy\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moccupancySensorType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moccupancySensorTypeBitmap\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mholdTime\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mholdTimeLimits\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mHoldTimeLimitsStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMin\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeMax\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m300\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mholdTimeDefault\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m10\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPIROccupiedToUnoccupiedDelay\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPIRUnoccupiedToOccupiedDelay\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPIRUnoccupiedToOccupiedThreshold\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33multrasonicOccupiedToUnoccupiedDelay\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33multrasonicUnoccupiedToOccupiedDelay\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33multrasonicUnoccupiedToOccupiedThreshold\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mphysicalContactOccupiedToUnoccupiedDelay\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mphysicalContactUnoccupiedToOccupiedDelay\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mphysicalContactUnoccupiedToOccupiedThreshold\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mScenesManagement\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1658710865\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mlastConfiguredBy\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33msceneTableSize\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfabricSceneInfo\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mIdentify\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4220563284\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33midentifyTime\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33midentifyType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mPowerSource\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m374163796\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mstatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33morder\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mdescription\u001b[0m\u001b[39m=\u001b[0m\u001b[32m'B3'\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mwiredAssessedInputVoltage\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mwiredAssessedInputFrequency\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mwiredCurrentType\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mwiredAssessedCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mwiredNominalVoltage\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mwiredMaximumCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mwiredPresent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mactiveWiredFaults\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatVoltage\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatPercentRemaining\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatTimeRemaining\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatChargeLevel\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatReplacementNeeded\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatReplaceability\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatPresent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mactiveBatFaults\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatReplacementDescription\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatCommonDesignation\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatANSIDesignation\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatIECDesignation\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatApprovedChemistry\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatCapacity\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatQuantity\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatChargeState\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatTimeToFullCharge\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatFunctionalWhileCharging\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbatChargingCurrent\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mactiveBatChargeFaults\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mendpointList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m14\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m15\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mDescriptor\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1270857495\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mdeviceTypeList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m256\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mDeviceTypeStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mdeviceType\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m17\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mserverList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m6\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m29\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m47\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m98\u001b[0m\u001b[39m,\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1030\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclientList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mpartsList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mtagList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mSemanticTagStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mmfgCode\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnamespaceID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m8\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mtag\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m\u001b[39m=\u001b[0m\u001b[3;35mNone\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;35mOnOff\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1656272886\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monOff\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mglobalSceneControl\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monTime\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moffWaitTime\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mstartUpOnOff\u001b[0m\u001b[39m=\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclientList\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mpartsList\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mOccupancySensing\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moccupancy\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moccupancySensorType\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moccupancySensorTypeBitmap\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mpirOccupiedToUnoccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mpirUnoccupiedToOccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mpirUnoccupiedToOccupiedThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33multrasonicOccupiedToUnoccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33multrasonicUnoccupiedToOccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33multrasonicUnoccupiedToOccupiedThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mphysicalContactOccupiedToUnoccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mphysicalContactUnoccupiedToOccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mphysicalContactUnoccupiedToOccupiedThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m6\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 26,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "await devCtrl.ReadAttribute(2, [2], True)"
+    "await devCtrl.ReadAttribute(2, [2], returnClusterObject=True)"
    ]
   },
   {
@@ -3517,82 +6940,149 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 27,
    "id": "5ef28449-1262-4b06-9984-4a2f9c409450",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "[\n",
-       "EventReadResult(\n",
-       "│   │   Header=EventHeader(\n",
-       "│   │   │   EndpointId=1,\n",
-       "│   │   │   Event=None,\n",
-       "│   │   │   EventNumber=0,\n",
-       "│   │   │   Priority=<EventPriority.DEBUG: 1>,\n",
-       "│   │   │   Timestamp=<EventTimestampType.SYSTEM: 0>,\n",
-       "│   │   │   TimestampType=None\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>,\n",
-       "│   │   Data=TestEvent(\n",
-       "│   │   │   arg1=0,\n",
-       "│   │   │   arg2=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   arg3=False,\n",
-       "│   │   │   arg4=SimpleStruct(\n",
-       "│   │   │   │   a=0,\n",
-       "│   │   │   │   b=False,\n",
-       "│   │   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   │   d=b'',\n",
-       "│   │   │   │   e='',\n",
-       "│   │   │   │   f=0,\n",
-       "│   │   │   │   g=0.0,\n",
-       "│   │   │   │   h=0.0\n",
-       "│   │   │   ),\n",
-       "│   │   │   arg5=[],\n",
-       "│   │   │   arg6=[]\n",
-       "│   │   )\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m=\u001b[1;35mEventHeader\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEvent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m=\u001b[1;36m51\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m=\u001b[1;36m3\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.DEBUG:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventTimestampType.SYSTEM:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m=\u001b[1;35mTestEvent\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg3\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg4\u001b[0m=\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.CRITICAL:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154311463\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mBootReason\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mbootReason\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mEventHeader\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m56\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154311465\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mDSTTableEmpty\u001b[0m\u001b[1;39m(\u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mEventHeader\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m40\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154311487\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mStartUp\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33msoftwareVersion\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mEventHeader\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m93\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154311488\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mNotify\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mactive\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33minactive\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mstate\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mmask\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m47\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mEventHeader\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m31\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154312580\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mAccessControlEntryChanged\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33madminNodeID\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33madminPasscodeID\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mchangeType\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mlatestValue\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mAccessControlEntryStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mprivilege\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mauthMode\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33msubjects\u001b[0m\u001b[39m=\u001b[0m\u001b[1;39m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[1;36m112233\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;39m]\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mtargets\u001b[0m\u001b[39m=\u001b[0m\u001b[35mNull\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mEventHeader\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4294048773\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154314764\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mTestEvent\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg1\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg2\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg3\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg4\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mSimpleStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33ma\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mb\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mc\u001b[0m\u001b[39m=\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mi\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg5\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg6\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 27,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -3614,76 +7104,97 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 28,
    "id": "921b58f7-cdfb-436f-813a-412cbf7a018d",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
<Subscription (Id=6469889299346410316)>\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
-       "\u001b[1m<\u001b[0m\u001b[1;95mSubscription\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m6469889299346410316\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m\n"
+       "\u001b[1m<\u001b[0m\u001b[1;95mSubscription\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m2805001916\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m"
       ]
      },
+     "execution_count": 28,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
     "reportingTimingParams = (0, 2) # MinInterval = 0s, MaxInterval = 2s\n",
-    "subscription = await devCtrl.ReadAttribute(2, [(2, Clusters.OnOff)], True, reportingTimingParams)\n",
+    "subscription = await devCtrl.ReadAttribute(2, [(2, Clusters.OnOff)], returnClusterObject=True, reportInterval=reportingTimingParams)\n",
     "subscription"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 29,
    "id": "ebd8f6aa-cf7b-4396-a83a-ad2fdacad1ae",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: OnOff(\n",
-       "│   │   │   onOff=False,\n",
-       "│   │   │   globalSceneControl=True,\n",
-       "│   │   │   onTime=0,\n",
-       "│   │   │   offWaitTime=0,\n",
-       "│   │   │   startUpOnOff=0,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=0,\n",
-       "│   │   │   clusterRevision=4\n",
-       "│   │   )\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mOnOff\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monOff\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mglobalSceneControl\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moffWaitTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mstartUpOnOff\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m4\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;35mOnOff\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;39m(\u001b[0m\u001b[39mdata version\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1656272886\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monOff\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mglobalSceneControl\u001b[0m\u001b[39m=\u001b[0m\u001b[3;92mTrue\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33monTime\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33moffWaitTime\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mstartUpOnOff\u001b[0m\u001b[39m=\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mgeneratedCommandList\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33macceptedCommandList\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m64\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m66\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16384\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16385\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16386\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m16387\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65528\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65529\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65531\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65532\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;36m65533\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m6\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 29,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -3704,7 +7215,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 30,
    "id": "b0d34116-6c9b-4aee-a8a0-f92091654b4c",
    "metadata": {},
    "outputs": [
@@ -3735,62 +7246,6 @@
      },
      "metadata": {},
      "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Attribute Changed:\n"
-     ]
-    },
-    {
-     "data": {
-      "text/html": [
-       "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>,\n",
-       "'Value': True\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[3;92mTrue\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>,\n",
-       "'Value': 0\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -3800,7 +7255,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 31, "id": "eb712364-4311-4bcb-91a4-2e9f26b825a1", "metadata": {}, "outputs": [ @@ -3831,34 +7286,6 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>,\n",
-       "'Value': 0\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ @@ -3868,7 +7295,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 32, "id": "50aa8d53-0fe3-4489-badd-3db9f78ea210", "metadata": {}, "outputs": [], @@ -3878,7 +7305,7 @@ }, { "cell_type": "markdown", - "id": "dad3f8bf-431e-496f-b2a7-6e675e3d3ee2", + "id": "7280cb49-a6cb-4dbf-9b0b-f887f3d9f56b", "metadata": {}, "source": [ "#### Subscribe to Events" @@ -3886,7 +7313,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 33, "id": "7db20b08-fed9-46f6-ab46-9e69c82a87fb", "metadata": { "tags": [] @@ -3894,12 +7321,13 @@ "outputs": [], "source": [ "reportingTimingParams = (0, 2) # MinInterval = 0s, MaxInterval = 2s\n", - "subscription = await devCtrl.ReadEvent(2, [()], reportingTimingParams)" + "# Subscribing to Events from EndPoint 1\n", + "subscription = await devCtrl.ReadEvent(2, [ 1 ], reportInterval = reportingTimingParams)" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 34, "id": "d8599eec-b1e1-4936-aea2-11c2a015a7a7", "metadata": { "tags": [] @@ -3908,75 +7336,72 @@ { "data": { "text/html": [ - "
\n",
-       "[\n",
-       "EventReadResult(\n",
-       "│   │   Header=EventHeader(\n",
-       "│   │   │   EndpointId=1,\n",
-       "│   │   │   Event=None,\n",
-       "│   │   │   EventNumber=0,\n",
-       "│   │   │   Priority=<EventPriority.DEBUG: 1>,\n",
-       "│   │   │   Timestamp=<EventTimestampType.SYSTEM: 0>,\n",
-       "│   │   │   TimestampType=None\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>,\n",
-       "│   │   Data=TestEvent(\n",
-       "│   │   │   arg1=0,\n",
-       "│   │   │   arg2=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   arg3=False,\n",
-       "│   │   │   arg4=SimpleStruct(\n",
-       "│   │   │   │   a=0,\n",
-       "│   │   │   │   b=False,\n",
-       "│   │   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   │   d=b'',\n",
-       "│   │   │   │   e='',\n",
-       "│   │   │   │   f=0,\n",
-       "│   │   │   │   g=0.0,\n",
-       "│   │   │   │   h=0.0\n",
-       "│   │   │   ),\n",
-       "│   │   │   arg5=[],\n",
-       "│   │   │   arg6=[]\n",
-       "│   │   )\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m=\u001b[1;35mEventHeader\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEvent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.DEBUG:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventTimestampType.SYSTEM:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m=\u001b[1;35mTestEvent\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg3\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg4\u001b[0m=\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m=\u001b[1;36m93\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m3\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.INFO:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154311488\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mNotify\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mactive\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33minactive\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mstate\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m7\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mmask\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m47\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mHeader\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mEventHeader\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m4294048773\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEventNumber\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mPriority\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154314764\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mTestEvent\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg1\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg2\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg3\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg4\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mSimpleStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33ma\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mb\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mc\u001b[0m\u001b[39m=\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[33mi\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg5\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33marg6\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 34,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -3988,14 +7413,14 @@
    "id": "4ff2d257-ea1b-4957-97ed-fd6518740218",
    "metadata": {},
    "source": [
-    "### Trigger Event\n",
+    "#### Trigger Event\n",
     "\n",
     "Force an event to get emitted, which after a short while, should generate a report and trigger the print out of the received event:"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 35,
    "id": "93cb4c17-b3c7-4462-b448-397171458416",
    "metadata": {},
    "outputs": [
@@ -4012,26 +7437,28 @@
        "
EventReadResult(\n",
        "Header=EventHeader(\n",
        "│   │   EndpointId=1,\n",
-       "│   │   Event=None,\n",
-       "│   │   EventNumber=1,\n",
-       "│   │   Priority=<EventPriority.DEBUG: 1>,\n",
-       "│   │   Timestamp=<EventTimestampType.SYSTEM: 0>,\n",
-       "│   │   TimestampType=None\n",
-       "),\n",
-       "Status=<Status.Success: 0>,\n",
-       "Data=TestEvent(\n",
-       "│   │   arg1=0,\n",
-       "│   │   arg2=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   arg3=False,\n",
-       "│   │   arg4=SimpleStruct(\n",
-       "│   │   │   a=0,\n",
-       "│   │   │   b=False,\n",
-       "│   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
+       "│   │   ClusterId=4294048773,\n",
+       "│   │   EventId=1,\n",
+       "│   │   EventNumber=6,\n",
+       "│   │   Priority=<EventPriority.INFO: 1>,\n",
+       "│   │   Timestamp=1738154316909,\n",
+       "│   │   TimestampType=<EventTimestampType.EPOCH: 1>\n",
+       "),\n",
+       "Status=<Status.Success: 0>,\n",
+       "Data=TestEvent(\n",
+       "│   │   arg1=0,\n",
+       "│   │   arg2=<SimpleEnum.kUnspecified: 0>,\n",
+       "│   │   arg3=False,\n",
+       "│   │   arg4=SimpleStruct(\n",
+       "│   │   │   a=0,\n",
+       "│   │   │   b=False,\n",
+       "│   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
        "│   │   │   d=b'',\n",
        "│   │   │   e='',\n",
        "│   │   │   f=0,\n",
        "│   │   │   g=0.0,\n",
-       "│   │   │   h=0.0\n",
+       "│   │   │   h=0.0,\n",
+       "│   │   │   i=None\n",
        "│   │   ),\n",
        "│   │   arg5=[],\n",
        "│   │   arg6=[]\n",
@@ -4043,26 +7470,28 @@
        "\u001b[1;35mEventReadResult\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[33mHeader\u001b[0m=\u001b[1;35mEventHeader\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mEvent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.DEBUG:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mTimestamp\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventTimestampType.SYSTEM:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33mTimestampType\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[33mData\u001b[0m=\u001b[1;35mTestEvent\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg3\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg4\u001b[0m=\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mClusterId\u001b[0m=\u001b[1;36m4294048773\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mEventId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m6\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.INFO:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mTimestamp\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m1738154316909\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33mTimestampType\u001b[0m\u001b[39m=\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[33mStatus\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[33mData\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mTestEvent\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg1\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg2\u001b[0m\u001b[39m=,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg3\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[33marg4\u001b[0m\u001b[39m=\u001b[0m\u001b[1;35mSimpleStruct\u001b[0m\u001b[1;39m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33ma\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mb\u001b[0m\u001b[39m=\u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mc\u001b[0m\u001b[39m=\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mi\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33marg5\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33marg6\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\n",
@@ -4081,7 +7510,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 36,
    "id": "6e294da6-1e71-444d-952b-0e1d3b8268b6",
    "metadata": {},
    "outputs": [],
@@ -4101,42 +7530,39 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 37,
    "id": "95c78192-d895-4784-b8e6-4f8884bb1f92",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "[\n",
-       "AttributeStatus(\n",
-       "│   │   Path=AttributePath(\n",
-       "│   │   │   EndpointId=1,\n",
-       "│   │   │   ClusterId=1295,\n",
-       "│   │   │   AttributeId=6\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>\n",
-       ")\n",
-       "]\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m[\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;35mAttributeStatus\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mPath\u001b[0m=\u001b[1;35mAttributePath\u001b[0m\u001b[1m(\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m=\u001b[1;36m1295\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mClusterId\u001b[0m=\u001b[1;36m4294048773\u001b[0m,\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[33mAttributeId\u001b[0m=\u001b[1;36m6\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m)\u001b[0m\n",
-       "\u001b[1m]\u001b[0m\n"
+       "\u001b[1m]\u001b[0m"
       ]
      },
+     "execution_count": 37,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -4145,36 +7571,37 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 38,
    "id": "69fcf8e6-a49e-471e-9169-14c4fee88f2e",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.UnitTesting'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UnitTesting.Attributes.Int16u'>: 2\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UnitTesting'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m439497021\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1;36m2\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 38,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -4198,7 +7625,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.10.5"
+   "version": "3.10.12"
   },
   "vscode": {
    "interpreter": {
diff --git a/docs/development_controllers/chip-repl/Matter_Multi_Fabric_Commissioning.ipynb b/docs/development_controllers/chip-repl/Matter_Multi_Fabric_Commissioning.ipynb
index 5738ee612c9967..02f27b7aa38f9a 100644
--- a/docs/development_controllers/chip-repl/Matter_Multi_Fabric_Commissioning.ipynb
+++ b/docs/development_controllers/chip-repl/Matter_Multi_Fabric_Commissioning.ipynb
@@ -4,6 +4,10 @@
    "cell_type": "markdown",
    "id": "7953092e-e313-4fb5-82ab-ce1d42f4c1a9",
    "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": ""
+    },
     "tags": []
    },
    "source": [
@@ -22,9 +26,11 @@
    "id": "c8aae2cc-41fa-4101-a744-c725be5f034c",
    "metadata": {},
    "source": [
-    "## FabricAdmins and Controllers\n",
+    "## CertificateAuthority, FabricAdmins and Controllers\n",
+    "\n",
+    "The `CertificateAuthorityManager` class manages a set of `CertificateAuthority` instances (both present in `chip.CertificateAuthority` package). a `CertificateAuthority` represents an operational root of trust, a Root Certificate Authority (CA) with a root key pair with the associated public key (i.e \"Root PK\"). The `CertificateAuthority` class manages a list of `FabricAdmins` adminstering a fabric within that CA.\n",
     "\n",
-    "The `FabricAdmin` class (present in the `chip.FabricAdmin` package) is responsible for administering a fabric. It houses the Fabric ID and Index, as well as an RCAC and ICAC that provides the certificate material grounding that fabric.\n",
+    "The `FabricAdmin` class (present in the `chip.FabricAdmin` package) is responsible for administering a fabric. It houses the Fabric ID and is managed by a `CertificateAuthority`.\n",
     "\n",
     "The `FabricAdmin` can be used to vend `ChipDeviceController` objects that represent a controller instance with a specific identity grounded in the admin's fabric. This controller can then be used to commission and interact with devices."
    ]
@@ -50,7 +56,7 @@
     {
      "data": {
       "text/plain": [
-       ""
+       "0"
       ]
      },
      "execution_count": 1,
@@ -77,7 +83,7 @@
    "source": [
     "## Initialization\n",
     "\n",
-    "Let's first begin by setting up by importing some key modules that are needed to make it easier for us to interact with the Matter stack.\n",
+    "Let's first begin setting up by importing some key modules that are needed to make it easier for us to interact with the Matter stack.\n",
     "\n",
     "`ChipReplStartup.py` is run within the global namespace. This results in all of its imports being made available here.\n",
     "\n",
@@ -89,17 +95,63 @@
    "execution_count": 2,
    "id": "72f25a72-0b7e-41d5-a9ef-18af8a54ec39",
    "metadata": {
+    "scrolled": true,
     "tags": []
    },
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
──────────────────────────────────────── Matter REPL ────────────────────────────────────────\n",
+       "
\n",
+       " Replacing  store path ./credentials/development/paa-root-certs with \n",
+       "/home/root/repos/connectedhomeip/credentials/development/paa-root-certs\n",
+       "Note that you are still running from \n",
+       "/home/root/repos/connectedhomeip/docs/development_controllers/chip-repl so other relative\n",
+       "paths may be off.\n",
+       "                    \n",
        "
\n" ], "text/plain": [ - "\u001b[92m──────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ────────────────────────────────────────\u001b[0m\n" + "\n", + "\u001b[1m Replacing \u001b[0m store path .\u001b[35m/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m with \n", + "\u001b[35m/home/root/repos/connectedhomeip/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m\n", + "Note that you are still running from \n", + "\u001b[35m/home/root/repos/connectedhomeip/docs/development_controllers/\u001b[0m\u001b[95mchip-repl\u001b[0m so other relative\n", + "paths may be off.\n", + " \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1738152867.148313][2264454:2264454] CHIP:CTL: Setting attestation nonce to random value\n", + "[1738152867.148534][2264454:2264454] CHIP:CTL: Setting CSR nonce to random value\n", + "[1738152867.160741][2264454:2264454] CHIP:DL: NVS set: chip-factory/unique-id = \"3844ABE883465BB4\"\n", + "[1738152867.161683][2264454:2264454] CHIP:DL: NVS set: chip-factory/vendor-id = 65521 (0xFFF1)\n", + "[1738152867.162893][2264454:2264454] CHIP:DL: NVS set: chip-factory/product-id = 32769 (0x8001)\n", + "[1738152867.164421][2264454:2264454] CHIP:DL: NVS set: chip-counters/reboot-count = 1 (0x1)\n", + "[1738152867.165934][2264454:2264454] CHIP:DL: NVS set: chip-counters/total-operational-hours = 0 (0x0)\n", + "[1738152867.167463][2264454:2264454] CHIP:DL: NVS set: chip-counters/boot-reason = 0 (0x0)\n", + "[1738152867.168925][2264454:2264454] CHIP:DL: NVS set: chip-config/regulatory-location = 0 (0x0)\n", + "[1738152867.170369][2264454:2264454] CHIP:DL: NVS set: chip-config/location-capability = 2 (0x2)\n", + "[1738152867.170831][2264454:2264454] CHIP:DL: Got Ethernet interface: enp2s0\n", + "[1738152867.171003][2264454:2264454] CHIP:DL: Found the primary Ethernet interface:enp2s0\n", + "[1738152867.171166][2264454:2264454] CHIP:DL: Got WiFi interface: wlp3s0\n", + "[1738152867.171348][2264454:2264454] CHIP:DL: Found the primary WiFi interface:wlp3s0\n" + ] + }, + { + "data": { + "text/html": [ + "
─────────────────────────────────────────────────── Matter REPL ───────────────────────────────────────────────────\n",
+       "
\n" + ], + "text/plain": [ + "\u001b[92m─────────────────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ───────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -110,28 +162,28 @@ "text/html": [ "
\n",
        "            \n",
-       "    \n",
+       "\n",
        "            Welcome to the Matter Python REPL!\n",
-       "    \n",
+       "\n",
        "            For help, please type matterhelp()\n",
-       "    \n",
+       "\n",
        "            To get more information on a particular object/class, you can pass\n",
        "            that into matterhelp() as well.\n",
-       "    \n",
+       "\n",
        "            \n",
        "
\n" ], "text/plain": [ "\n", " \n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m \u001b[0m\n" ] }, @@ -141,11 +193,11 @@ { "data": { "text/html": [ - "
─────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\u001b[92m─────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" + "\u001b[92m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -155,30 +207,10 @@ "name": "stderr", "output_type": "stream", "text": [ - "2022-01-25 16:58:57 johnsj-macbookpro1.roam.corp.google.com root[27921] ERROR [Errno 2] No such file or directory: '/tmp/repl-storage.json'\n", - "2022-01-25 16:58:57 johnsj-macbookpro1.roam.corp.google.com root[27921] WARNING Could not load configuration from /tmp/repl-storage.json - resetting configuration...\n" - ] - }, - { - "data": { - "text/html": [ - "
\n",
-       "No previous fabric admins discovered in persistent storage - creating a new one...\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[38;5;129mNo previous fabric admins discovered in persistent storage - creating a new one\u001b[0m\u001b[38;5;129m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 1(1)\n" + "2025-01-29 13:14:27 ThinkPad chip.storage[2264454] ERROR [Errno 2] No such file or directory: '/tmp/repl-storage.json'\n", + "2025-01-29 13:14:27 ThinkPad chip.storage[2264454] CRITICAL Could not load configuration from /tmp/repl-storage.json - resetting configuration...\n", + "2025-01-29 13:14:27 ThinkPad chip.storage[2264454] WARNING No valid SDK configuration present - clearing out configuration\n", + "2025-01-29 13:14:27 ThinkPad chip.storage[2264454] WARNING No valid REPL configuration present - clearing out configuration\n" ] }, { @@ -186,11 +218,13 @@ "text/html": [ "
\n",
        "\n",
+       "The following objects have been created:\n",
        "
\n" ], "text/plain": [ "\n", - "\n" + "\n", + "\u001b[34mThe following objects have been created:\u001b[0m\n" ] }, "metadata": {}, @@ -199,37 +233,36 @@ { "data": { "text/html": [ - "
Creating default device controller on fabric 1...\n",
+       "
        certificateAuthorityManager:    Manages a list of CertificateAuthority instances.\n",
+       "        caList:                         The list of CertificateAuthority instances.\n",
+       "        caList[n].adminList[m]:         A specific FabricAdmin object at index m for the nth CertificateAuthority \n",
+       "instance.\n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mCreating default device controller on fabric \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + " \u001b[31mcertificateAuthorityManager\u001b[0m\u001b[34m: \u001b[0m\u001b[34mManages a list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34mThe list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mn\u001b[0m\u001b[1;31m]\u001b[0m\u001b[31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mm\u001b[0m\u001b[1;31m]\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34mA specific FabricAdmin object at index m for the nth CertificateAuthority \u001b[0m\n", + "\u001b[34minstance.\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Allocating new controller with FabricId: 1(1), NodeId: 1\n" - ] - }, { "data": { "text/html": [ "
\n",
        "\n",
-       "Default CHIP Device Controller has been initialized to manage fabricAdmins[0], and is \n",
-       "available as devCtrl\n",
+       "Default CHIP Device Controller (NodeId: 112233): has been initialized to manage caList[0].adminList[0] (FabricId = \n",
+       "1), and is available as devCtrl\n",
        "
\n" ], "text/plain": [ "\n", "\n", - "\u001b[34mDefault CHIP Device Controller has been initialized to manage \u001b[0m\u001b[1;31mfabricAdmins\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m, and is \u001b[0m\n", - "\u001b[1;34mavailable as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" + "\u001b[34mDefault CHIP Device Controller \u001b[0m\u001b[1;34m(\u001b[0m\u001b[34mNodeId: \u001b[0m\u001b[1;34m112233\u001b[0m\u001b[1;34m)\u001b[0m\u001b[34m: has been initialized to manage \u001b[0m\u001b[1;31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m \u001b[0m\u001b[1;34m(\u001b[0m\u001b[1;34mFabricId = \u001b[0m\n", + "\u001b[1;34m1\u001b[0m\u001b[1;34m)\u001b[0m\u001b[1;34m, and is available as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" ] }, "metadata": {}, @@ -237,10 +270,10 @@ } ], "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path}" + "%reset -f\n", + "import importlib.util\n", + "spec = importlib.util.find_spec('chip.ChipReplStartup')\n", + "%run {spec.origin} --debug" ] }, { @@ -248,29 +281,49 @@ "id": "d79775d7-2ebb-4d05-9f2f-c7859802dc98", "metadata": {}, "source": [ - "At startup, the REPL will attempt to find any previously configured fabrics stored in persisted storage. If it can't find any (as is the case here), it will construct a default `FabricAdmin` object on Fabric 1 (Index 1) as well as construct a device controller (`devCtrl`) on that fabric." + "At startup, the `certificateAuthorityManager` within REPL will attempt to find `CertificateAuthority` instances present in persistent storage.If it can't find any (as is the case here), it will create a new `CertificateAuthority` instance at CA index 0. This `CertificateAuthority` instance will construct a default `FabricAdmin` object on FabricAdmin index 0 with a Fabric ID = 1." ] }, { "cell_type": "code", "execution_count": 3, "id": "030ecc69-bad4-476f-95d5-cb593597cad6", - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { "text/html": [ - "
\n",
-       "[\n",
-       "<chip.FabricAdmin.FabricAdmin object at 0x10a68dee0>\n",
-       "]\n",
+       "
╭───────────────────────────── <class 'chip.FabricAdmin.FabricAdmin'> ─────────────────────────────╮\n",
+       " Administers a fabric associated with a unique FabricID under a given CertificateAuthority        \n",
+       " instance.                                                                                        \n",
+       "                                                                                                  \n",
+       " ╭──────────────────────────────────────────────────────────────────────────────────────────────╮ \n",
+       "  <chip.FabricAdmin.FabricAdmin object at 0x74c3436d78e0>                                       \n",
+       " ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ \n",
+       "                                                                                                  \n",
+       "              caIndex = 1                                                                         \n",
+       " certificateAuthority = <chip.CertificateAuthority.CertificateAuthority object at 0x74c32c8ba680> \n",
+       "             fabricId = 1                                                                         \n",
+       "             vendorId = 65521                                                                     \n",
+       "╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ - "\n", - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mchip.FabricAdmin.FabricAdmin\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x10a68dee0\u001b[0m\u001b[1m>\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" + "\u001b[34m╭─\u001b[0m\u001b[34m────────────────────────────\u001b[0m\u001b[34m \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.FabricAdmin.FabricAdmin'\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m \u001b[0m\u001b[34m────────────────────────────\u001b[0m\u001b[34m─╮\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[36mAdministers a fabric associated with a unique FabricID under a given CertificateAuthority\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[36minstance.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m╭──────────────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mchip.FabricAdmin.FabricAdmin\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c3436d78e0\u001b[0m\u001b[1m>\u001b[0m \u001b[32m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m╰──────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcaIndex\u001b[0m = \u001b[1;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcertificateAuthority\u001b[0m = \u001b[1m<\u001b[0m\u001b[1;95mchip.CertificateAuthority.CertificateAuthority\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c32c8ba680\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mfabricId\u001b[0m = \u001b[1;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mvendorId\u001b[0m = \u001b[1;36m65521\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m╰──────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" ] }, "metadata": {}, @@ -278,7 +331,15 @@ } ], "source": [ - "fabricAdmins" + "inspect(caList[0].adminList[0])" + ] + }, + { + "cell_type": "markdown", + "id": "8d9e6c95-5488-4a9c-87c7-4cfa2dda7d42", + "metadata": {}, + "source": [ + "The Newly created `FabricAdmin` will automatically construct a device controller (`devCtrl`) on it's own fabric. " ] }, { @@ -290,11 +351,43 @@ { "data": { "text/html": [ - "
<chip.ChipDeviceCtrl.ChipDeviceController object at 0x10a6c6040>\n",
+       "
╭────────────────── <class 'chip.ChipDeviceCtrl.ChipDeviceController'> ───────────────────╮\n",
+       " The ChipDeviceCommissioner binding, named as ChipDeviceController                       \n",
+       "                                                                                         \n",
+       " ╭─────────────────────────────────────────────────────────────────────────────────────╮ \n",
+       "  <chip.ChipDeviceCtrl.ChipDeviceController object at 0x74c32c8baa10>                  \n",
+       " ╰─────────────────────────────────────────────────────────────────────────────────────╯ \n",
+       "                                                                                         \n",
+       "      activeList = {<chip.ChipDeviceCtrl.ChipDeviceController object at 0x74c32c8baa10>} \n",
+       "         caIndex = 1                                                                     \n",
+       "         devCtrl = c_void_p(128380733235904)                                             \n",
+       "     fabricAdmin = <chip.FabricAdmin.FabricAdmin object at 0x74c3436d78e0>               \n",
+       "        fabricId = 1                                                                     \n",
+       "        isActive = True                                                                  \n",
+       "            name = 'caIndex(1)/fabricId(0x0000000000000001)/nodeId(0x000000000001B669)'  \n",
+       "          nodeId = 112233                                                                \n",
+       " pairingDelegate = c_void_p(128380733235776)                                             \n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ - "\u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x10a6c6040\u001b[0m\u001b[1m>\u001b[0m\n" + "\u001b[34m╭─\u001b[0m\u001b[34m─────────────────\u001b[0m\u001b[34m \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.ChipDeviceCtrl.ChipDeviceController'\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m \u001b[0m\u001b[34m──────────────────\u001b[0m\u001b[34m─╮\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[36mThe ChipDeviceCommissioner binding, named as ChipDeviceController\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m╭─────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c32c8baa10\u001b[0m\u001b[1m>\u001b[0m \u001b[32m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m╰─────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mactiveList\u001b[0m = \u001b[1m{\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c32c8baa10\u001b[0m\u001b[1m>\u001b[0m\u001b[1m}\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcaIndex\u001b[0m = \u001b[1;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mdevCtrl\u001b[0m = \u001b[1;35mc_void_p\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m128380733235904\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mfabricAdmin\u001b[0m = \u001b[1m<\u001b[0m\u001b[1;95mchip.FabricAdmin.FabricAdmin\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c3436d78e0\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mfabricId\u001b[0m = \u001b[1;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33misActive\u001b[0m = \u001b[3;92mTrue\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mname\u001b[0m = \u001b[32m'caIndex\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/fabricId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x0000000000000001\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/nodeId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x000000000001B669\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mnodeId\u001b[0m = \u001b[1;36m112233\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mpairingDelegate\u001b[0m = \u001b[1;35mc_void_p\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m128380733235776\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m╰─────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" ] }, "metadata": {}, @@ -302,7 +395,7 @@ } ], "source": [ - "devCtrl" + "inspect(devCtrl)" ] }, { @@ -335,11 +428,14 @@ "os.system('pkill -f chip-all-clusters-app')\n", "time.sleep(1)\n", "\n", - "# The location of the all-clusters-app in the cloud playground is one level higher - adjust for this by testing for file presence.\n", - "if (os.path.isfile('../../../out/debug/chip-all-clusters-app')):\n", - " appPath = '../../../out/debug/chip-all-clusters-app'\n", + "CI_APP_PATH = '../../../out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-clang-test/chip-all-clusters-app'\n", + "LOCAL_APP_PATH = '../../../out/linux-x64-all-clusters/chip-all-clusters-app'\n", + "\n", + "# Check if the app built by GitHub Actions is present. Otherwise use the standard all-clusters-app \n", + "if (os.path.isfile(CI_APP_PATH)):\n", + " appPath = CI_APP_PATH\n", "else:\n", - " appPath = '../../../../out/debug/chip-all-clusters-app'\n", + " appPath = LOCAL_APP_PATH\n", "\n", "process = subprocess.Popen(appPath, stdout=subprocess.DEVNULL)\n", "time.sleep(1)" @@ -352,7 +448,7 @@ "source": [ "#### Commission Target\n", "\n", - "Commission the target onto Fabric 1 using the default device controller instance with a NodeId of 1." + "Commission the target onto Fabric 1 using the default device controller instance with a NodeId of 2." ] }, { @@ -360,41 +456,36 @@ "execution_count": 6, "id": "cde97ce7-6478-45fd-b985-103b09d8dfa9", "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, "tags": [] }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-01-25 16:59:00 johnsj-macbookpro1.roam.corp.google.com chip.CTL[27921] ERROR Unable to find country code, defaulting to WW\n", - "2022-01-25 16:59:00 johnsj-macbookpro1.roam.corp.google.com chip.SC[27921] ERROR The device does not support GetClock_RealTimeMS() API. This will eventually result in CASE session setup failures.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Node address has been updated\n", - "Commissioning complete\n" - ] - }, { "data": { "text/html": [ - "
True\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
-       "\u001b[3;92mTrue\u001b[0m\n"
+       "\u001b[1;36m2\u001b[0m"
       ]
      },
+     "execution_count": 6,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "devCtrl.CommissionIP(b'127.0.0.1', 20202021, 2)"
+    "await devCtrl.CommissionOnNetwork(2, 20202021)"
    ]
   },
   {
@@ -412,63 +503,65 @@
    "execution_count": 7,
    "id": "830e3421-45a6-435f-9617-bbf34f7c3fe0",
    "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": ""
+    },
     "tags": []
    },
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.OperationalCredentials'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'>: [\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\xa2\\x88}\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98',\n",
-       "│   │   │   │   │   vendorId=27168,\n",
-       "│   │   │   │   │   fabricId=1,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label=''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ]\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xa2\\x88\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m27168\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4246564825\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xffKd\\xd3v\\xa97c\\x87\\r\\xadXF\\xd2?\\n\\x08\\x1f\\rZE\\x91\\x0c_\\x1e`\"\\xfbwZ\\x9c\\xaf!\\\u001b[0m\u001b[32mx10\u001b[0m\u001b[32m=\\xd4\\x03\\xf5\u001b[0m\u001b[32m[\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xb3\\x08\\xa2\\xe5\\x04\\x7f\\x06\\x1c\\nEa\\x02q\\xeeK\\x91\\xda\\x1e\\xd2\\\\i\\xef\\x05#'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 7,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "await devCtrl.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.FabricsList)], fabricFiltered=False)"
+    "await devCtrl.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.Fabrics)], fabricFiltered=False)"
    ]
   },
   {
    "cell_type": "markdown",
    "id": "77c0c2a1-3014-4dc5-8d42-5a3459ed311a",
-   "metadata": {},
+   "metadata": {
+    "editable": true,
+    "slideshow": {
+     "slide_type": ""
+    },
+    "tags": []
+   },
    "source": [
     "### Commission onto Fabric 2"
    ]
@@ -478,7 +571,8 @@
    "id": "965a5fbf-5762-4432-93f9-47782c5ee050",
    "metadata": {},
    "source": [
-    "#### Create new FabricAdmin"
+    "#### Create a new CertificateAuthority and a new FabricAdmin\n",
+    "We create a new `CertificateAuthority` instance, and then create a new `FabricAdmin` that administers Fabric 2 within that CA."
    ]
   },
   {
@@ -486,18 +580,54 @@
    "execution_count": 8,
    "id": "9f7d6810-6d8e-47c9-8795-b4bc8777e963",
    "metadata": {},
+   "outputs": [],
+   "source": [
+    "certificateAuthority = certificateAuthorityManager.NewCertificateAuthority()\n",
+    "\n",
+    "fabricAdmin2 = certificateAuthority.NewFabricAdmin(vendorId=0xFFF1, fabricId=2)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9a4fc670-3b6f-490d-a01b-621a6b086650",
+   "metadata": {},
+   "source": [
+    "Two different `CertificateAuthority` instances are now present"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "b256ca0e-0876-41e2-a414-ca1e00beeb5e",
+   "metadata": {},
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "New FabricAdmin: FabricId: 2(2)\n"
-     ]
+     "data": {
+      "text/html": [
+       "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/plain": [
+       "\n",
+       "\u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mchip.CertificateAuthority.CertificateAuthority\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c32c8ba680\u001b[0m\u001b[39m>,\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[39m\u001b[0m\n",
+       "\u001b[1m]\u001b[0m"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "import chip.FabricAdmin as FabricAdmin\n",
-    "fabric2 = FabricAdmin.FabricAdmin(fabricId = 2, fabricIndex = 2)"
+    "caList"
    ]
   },
   {
@@ -510,86 +640,94 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 10,
    "id": "f211c5be-665b-4630-9570-a44a6f17f358",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "'repl-config': {\n",
-       "│   │   'fabricAdmins': {\n",
-       "│   │   │   '1': {\n",
-       "│   │   │   │   'fabricId': 1\n",
-       "│   │   │   },\n",
-       "│   │   │   '2': {\n",
-       "│   │   │   │   'fabricId': 2\n",
-       "│   │   │   }\n",
-       "│   │   }\n",
-       "},\n",
-       "'sdk-config': {\n",
-       "│   │   'ExampleOpCredsCAKey1': 'BKKIfb3b1LxeVaPOZveSvqdYO0W4LVkSXiTgG1P5mo+sdmr6ISZtNgDj0YVvG55Iq0M/2OwIbEi1WB86dbD7apgpj13h8fueMKMfErM65jMAsAPBcPEhnVc3JJ6m7K4Qq0ORAwBgAABhAAAAAAAAAA==',\n",
-       "│   │   'ExampleOpCredsICAKey1': 'BCwMgmSo2C1vhjBR642H5nieC/jJManFAW54QhdovJhdySYZn96XJoBNyouhoGf9rn0SipgIhmvHPcPqDrDwcAXiQyB87caIuz5DJ3v7KHHLquGmdv5pNpZ4IhqDomt/2kORAwBgAABhAAAAAAAAAA==',\n",
-       "│   │   'ExampleCAIntermediateCert1': 'MIIB2TCCAYCgAwIBAgIBADAKBggqhkjOPQQDAjBEMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMDEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwHhcNMjEwMTAxMDAwMDAwWhcNMzAxMjMwMDAwMDAwWjBEMSAwHgYKKwYBBAGConwBAwwQMDAwMDAwMDAwMDAwMDAwMTEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQsDIJkqNgtb4YwUeuNh+Z4ngv4yTGpxQFueEIXaLyYXckmGZ/elyaATcqLoaBn/a59EoqYCIZrxz3D6g6w8HAFo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcPz5CkZJujm2U0jL0G1lZwoJXD0wHwYDVR0jBBgwFoAUfvAKJyeJwjao2nq+Q3ayf27KXrUwCgYIKoZIzj0EAwIDRwAwRAIgEaX5gBqc5b8eswqDDlc2IQ+wLKfbsONC3FzsuwLCBNkCIAyn32oaFV0YCN9GeiUpYvqbypnMWQGnffF85v7wKhBX',\n",
-       "│   │   'ExampleCARootCert1': 'MIIB2jCCAYCgAwIBAgIBADAKBggqhkjOPQQDAjBEMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMDEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwHhcNMjEwMTAxMDAwMDAwWhcNMzAxMjMwMDAwMDAwWjBEMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMDEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASiiH2929S8XlWjzmb3kr6nWDtFuC1ZEl4k4BtT+ZqPrHZq+iEmbTYA49GFbxueSKtDP9jsCGxItVgfOnWw+2qYo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfvAKJyeJwjao2nq+Q3ayf27KXrUwHwYDVR0jBBgwFoAUfvAKJyeJwjao2nq+Q3ayf27KXrUwCgYIKoZIzj0EAwIDSAAwRQIgMzvVbqCxT+xJOpxN9HUSYZYdExmkRLN2Jl9vLijLc+sCIQDAxLgwwuxGNPtWJ/dY4kGqpWwNNbq9pEkmQ//t2KhfBg==',\n",
-       "│   │   'ExampleOpCredsCAKey2': 'BJ1gkAlp0ZrmBkQiko2ces/p86N1qCB30y+tdT5HrWEBqgPh6SVNnZfe5ZMjzJZFp/J1K+7MSDF7QeAgKrQYwcAcV1G9fnqw9anHoj+EW2k9xqw0b4bWXE9f2xKfWWb/ykCSAwBgAABhAAAAAAAAAA==',\n",
-       "│   │   'ExampleOpCredsICAKey2': 'BMktytxSOcWsbMcZ6WrjsODvTRKcLWZjo8bt8CDUqfhoHLFqrmahTQnH4rY8gjRpKRBw/Yw2YpEodcaLyC1V+cC2VvZrLqLVW8uRNPkVxcojVHAXYAGCRp6CW4kQ+zBtNUCSAwBgAABhAAAAAAAAAA=='\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[32m'sdk-config'\u001b[0m: \u001b[1m{\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/lkgt'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mFSYAgKi8LBg\u001b[0m\u001b[32m='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/gcc'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32m2rpTAQ\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/gdc'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mbNE5Bw\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsCAKey1'\u001b[0m: \u001b[32m'BP9LZNN2qTdjhw2tWEbSPwoIHw1aRZEMXx5gIvt3WpyvIRA91AP1W32zCKLlBH8GHApFYQJx7kuR2h7SXGnvBSMAh4AKfr1HHSs7hYln6Oif+\u001b[0m\u001b[32mDTdrYIartnC0MufgIwjOw\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsICAKey1'\u001b[0m: \u001b[32m'BAOZBNHF54zmSMKesumS33XPPiYkNuFD4EneHIbBlGw5R74leYynlviYRo6pJJgsBFhZpPSysbanxd6FGhDMSSvkfszhKxNneEFnLM3zg/\u001b[0m\u001b[32mNWzKzqYglnZf4cjVFDVoKN1A\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleCARootCert1'\u001b[0m: \u001b[32m'MIIBljCCATygAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMTAeFw0yMTAxMDEwMDAwMDBaFw0zMDEyMzAwMDAwMDBaMCIxIDAeBgorBgEEAYKifAEEDBAwMDAwMDAwMDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/0tk03apN2OHDa1YRtI/CggfDVpFkQxfHmAi+3danK8hED3UA/VbfbMIouUEfwYcCkVhAnHuS5HaHtJcae8FI6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFK4R1kjK4X+tUcRsjhHsVt60AN7yMB8GA1UdIwQYMBaAFK4R1kjK4X+tUcRsjhHsVt60AN7yMAoGCCqGSM49BAMCA0gAMEUCIQD07YMcVJ+u1B9LehEK3qnyXronDsmovVX/qXO34/JgbgIgEsIzOThDOapZJvkx8FPD0vrJMA15EywpppjznOHJ/\u001b[0m\u001b[32mrU\u001b[0m\u001b[32m='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleCAIntermediateCert1'\u001b[0m: \u001b[32m'MIIBljCCATygAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMTAeFw0yMTAxMDEwMDAwMDBaFw0zMDEyMzAwMDAwMDBaMCIxIDAeBgorBgEEAYKifAEDDBAwMDAwMDAwMDAwMDAwMDAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEA5kE0cXnjOZIwp6y6ZLfdc8+JiQ24UPgSd4chsGUbDlHviV5jKeW+JhGjqkkmCwEWFmk9LKxtqfF3oUaEMxJK6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFG5tDqy+Mc5ckVx9bIT6DF80ZU/hMB8GA1UdIwQYMBaAFK4R1kjK4X+tUcRsjhHsVt60AN7yMAoGCCqGSM49BAMCA0gAMEUCIADFrrNbn6Wypkk/xDt60gPZgGiFrYJci1vAmXSo7sp2AiEAm5pySx6WfY7xYbLTZzG1naB/\u001b[0m\u001b[32mUmC3l8ISwQhckSMWlIU\u001b[0m\u001b[32m='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'f/1/m'\u001b[0m: \u001b[32m'FSUA8f8sAQAY'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'f/1/n'\u001b[0m: \u001b[32m'FTABAQEkAgE3AyQTAhgmBIAigScmBYAlTTo3BiQVASYRabYBABgkBwEkCAEwCUEEh05Tmf5SwOmGDGABlanyUdZG8scEklDEtc32VnQ6dXjpSBPhj7kqbiu8NhzXVF3TIwYE0H/wM81wJ9QMlyF/PTcKNQEoARgkAgE2AwQCBAEYMAQUbhVdM1nbgFTygIhbBNspMC3qeFEwBRRubQ6svjHOXJFcfWyE+gxfNGVP4RgwC0BMfja54viizgNw/mf/rBEiMsg0i5Etaa78UXG11jLqZSpgtxMgmcM9FBvQu/I4rUn7xekyT+\u001b[0m\u001b[32mF8w9BQw3sgmk8mGA\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'f/1/i'\u001b[0m: \u001b[32m'FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQTAhgkBwEkCAEwCUEEA5kE0cXnjOZIwp6y6ZLfdc8+JiQ24UPgSd4chsGUbDlHviV5jKeW+JhGjqkkmCwEWFmk9LKxtqfF3oUaEMxJKzcKNQEpARgkAmAwBBRubQ6svjHOXJFcfWyE+gxfNGVP4TAFFK4R1kjK4X+tUcRsjhHsVt60AN7yGDALQADFrrNbn6Wypkk/xDt60gPZgGiFrYJci1vAmXSo7sp2m5pySx6WfY7xYbLTZzG1naB/UmC3l8ISwQhckSMWlIUY'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'f/1/r'\u001b[0m: \u001b[32m'FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQUARgkBwEkCAEwCUEE/0tk03apN2OHDa1YRtI/CggfDVpFkQxfHmAi+3danK8hED3UA/VbfbMIouUEfwYcCkVhAnHuS5HaHtJcae8FIzcKNQEpARgkAmAwBBSuEdZIyuF/rVHEbI4R7FbetADe8jAFFK4R1kjK4X+tUcRsjhHsVt60AN7yGDALQPTtgxxUn67UH0t6EQreqfJeuicOyai9Vf+pc7fj8mBuEsIzOThDOapZJvkx8FPD0vrJMA15EywpppjznOHJ/rUY'\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/fidx'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mFSQAAjYBBAEYGA\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'f/1/k/0'\u001b[0m: \u001b[32m'FSQBACQCATYDFSQEACUFLCcwBhCSIUaxPEVbvx/zkOg4z8LaGBUkBAAkBQAwBhAAAAAAAAAAAAAAAAAAAAAAGBUkBAAkBQAwBhAAAAAAAAAAAAAAAAAAAAAAGBglB///\u001b[0m\u001b[32mGA\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/gfl'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mFSQBASQCARg\u001b[0m\u001b[32m='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'f/1/g'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mFSQBACQCACQDACQEACQFACQGASQHABg\u001b[0m\u001b[32m='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/icdfl'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mFgQBGA\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'f/1/s/0000000000000002'\u001b[0m: \u001b[32m'FTADEOgOX23ZDpeLioK4UxaZJFQwBCCBgxGw+pVAkqR0gVWft0iQQdWbK8BmxO+\u001b[0m\u001b[32mS7uB55OEyFDAFDAAAAAAAAAAAAAAAABg\u001b[0m\u001b[32m='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/s/\u001b[0m\u001b[32m6A5fbdkOl4uKgrhTFpkkVA\u001b[0m\u001b[32m=='\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mFSQBASQCAhg\u001b[0m\u001b[32m='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'g/sri'\u001b[0m: \u001b[32m'\u001b[0m\u001b[32mFhUkAQEkAgIYGA\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsCAKey2'\u001b[0m: \u001b[32m'BHBLU0W2BwQKpXC7H6BauEhTqqrpfPGvKw6mXSA3jxDlprYVJGsII1iljyvTTZkGwYaO2tN7Jq8pgaFoxyTArZsQN9BcRw7TDItVdZ/+P2fYT7iTegeNlg5+OtW6U+\u001b[0m\u001b[32mewvA\u001b[0m\u001b[32m=='\u001b[0m,\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsICAKey2'\u001b[0m: \u001b[32m'BPFBfV0351x11SBvZVlNpRwZXfdWX4RSnHXtJDQmpdXTAG3qd7OCJvh4X1kc6kzhWZibCZd3GmQXj06BuYoeWiF/a9cWQMV3Kz0J/1DEn+EIo8T++\u001b[0m\u001b[32m62tpZereGxCtS4kNQ\u001b[0m\u001b[32m=='\u001b[0m\n",
+       "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m,\n",
        "\u001b[2;32m│   \u001b[0m\u001b[32m'repl-config'\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'fabricAdmins'\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[32m'1'\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'fabricId'\u001b[0m: \u001b[1;36m1\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[32m'2'\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[32m'fabricId'\u001b[0m: \u001b[1;36m2\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m}\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'caList'\u001b[0m: \u001b[1m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[32m'1'\u001b[0m: \u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[32m'fabricId'\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[32m'vendorId'\u001b[0m: \u001b[1;36m65521\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m}\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[32m'2'\u001b[0m: \u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[32m'fabricId'\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[32m'vendorId'\u001b[0m: \u001b[1;36m65521\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m}\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m,\n",
-       "\u001b[2;32m│   \u001b[0m\u001b[32m'sdk-config'\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsCAKey1'\u001b[0m: \u001b[32m'BKKIfb3b1LxeVaPOZveSvqdYO0W4LVkSXiTgG1P5mo+sdmr6ISZtNgDj0YVvG55Iq0M/2OwIbEi1WB86dbD7apgpj13h8fueMKMf\u001b[0m\u001b[32mErM65jMAsAPBcPEhnVc3JJ6m7K4Qq0ORAwBgAABhAAAAAAAAAA\u001b[0m\u001b[32m=='\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsICAKey1'\u001b[0m: \u001b[32m'BCwMgmSo2C1vhjBR642H5nieC/jJManFAW54QhdovJhdySYZn96XJoBNyouhoGf9rn0SipgIhmvHPcPqDrDwcAXiQyB87caIuz5DJ3v7KHHLquGmdv5pNpZ4IhqDomt/\u001b[0m\u001b[32m2kORAwBgAABhAAAAAAAAAA\u001b[0m\u001b[32m=='\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleCAIntermediateCert1'\u001b[0m: \u001b[32m'MIIB2TCCAYCgAwIBAgIBADAKBggqhkjOPQQDAjBEMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMDEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwHhcNMjEwMTAxMDAwMDAwWhcNMzAxMjMwMDAwMDAwWjBEMSAwHgYKKwYBBAGConwBAwwQMDAwMDAwMDAwMDAwMDAwMTEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQsDIJkqNgtb4YwUeuNh+Z4ngv4yTGpxQFueEIXaLyYXckmGZ/elyaATcqLoaBn/a59EoqYCIZrxz3D6g6w8HAFo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcPz5CkZJujm2U0jL0G1lZwoJXD0wHwYDVR0jBBgwFoAUfvAKJyeJwjao2nq+Q3ayf27KXrUwCgYIKoZIzj0EAwIDRwAwRAIgEaX5gBqc5b8eswqDDlc2IQ+wLKfbsONC3FzsuwLCBNkCIAyn32oaFV0YCN9GeiUpYvqbypnMWQGnffF85v7wKhBX'\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleCARootCert1'\u001b[0m: \u001b[32m'MIIB2jCCAYCgAwIBAgIBADAKBggqhkjOPQQDAjBEMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMDEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwHhcNMjEwMTAxMDAwMDAwWhcNMzAxMjMwMDAwMDAwWjBEMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMDEgMB4GCisGAQQBgqJ8AQUMEDAwMDAwMDAwMDAwMDAwMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASiiH2929S8XlWjzmb3kr6nWDtFuC1ZEl4k4BtT+ZqPrHZq+iEmbTYA49GFbxueSKtDP9jsCGxItVgfOnWw+2qYo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfvAKJyeJwjao2nq+Q3ayf27KXrUwHwYDVR0jBBgwFoAUfvAKJyeJwjao2nq+Q3ayf27KXrUwCgYIKoZIzj0EAwIDSAAwRQIgMzvVbqCxT+xJOpxN9HUSYZYdExmkRLN2Jl9vLijLc+sCIQDAxLgwwuxGNPtWJ/dY4kGqpWwNNbq9pEkmQ//\u001b[0m\u001b[32mt2KhfBg\u001b[0m\u001b[32m=='\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsCAKey2'\u001b[0m: \u001b[32m'BJ1gkAlp0ZrmBkQiko2ces/p86N1qCB30y+tdT5HrWEBqgPh6SVNnZfe5ZMjzJZFp/J1K+7MSDF7QeAgKrQYwcAcV1G9fnqw9anHoj+EW2k9xqw0b4bWXE9f2xKfWWb/\u001b[0m\u001b[32mykCSAwBgAABhAAAAAAAAAA\u001b[0m\u001b[32m=='\u001b[0m,\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[32m'ExampleOpCredsICAKey2'\u001b[0m: \u001b[32m'BMktytxSOcWsbMcZ6WrjsODvTRKcLWZjo8bt8CDUqfhoHLFqrmahTQnH4rY8gjRpKRBw/Yw2YpEodcaLyC1V+cC2VvZrLqLVW8uRNPkVxcojVHAXYAGCRp6CW4kQ+\u001b[0m\u001b[32mzBtNUCSAwBgAABhAAAAAAAAAA\u001b[0m\u001b[32m=='\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 10,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
     "builtins.chipStack.GetStorageManager().jsonData"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "id": "098c71b3-1bdd-44a2-b122-26387913bd3e",
+   "metadata": {},
+   "source": [
+    "#### Create a new ChipDeviceController on Fabric 2"
+   ]
+  },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 11,
    "id": "15bb2c3e-9051-421c-8769-4a59e4b2fc73",
    "metadata": {
     "tags": []
    },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Allocating new controller with FabricId: 2(2), NodeId: 1\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "devCtrl2 = fabric2.NewController()"
+    "devCtrl2 = fabricAdmin2.NewController()"
    ]
   },
   {
@@ -600,54 +738,53 @@
     "#### Open Commissioning Window"
    ]
   },
+  {
+   "cell_type": "markdown",
+   "id": "9178e145-bbcc-463d-8ada-72b3c9575b2b",
+   "metadata": {},
+   "source": [
+    "The Controller of Fabric 1 must open the commissioning window that allows the Commissioner of Fabric 2 to join the node to its fabric."
+   ]
+  },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 12,
    "id": "7902ab28-3c74-4717-8522-f6c4a17c5efe",
    "metadata": {},
    "outputs": [],
    "source": [
-    "await devCtrl.SendCommand(2, 0, Clusters.AdministratorCommissioning.Commands.OpenBasicCommissioningWindow(180))"
+    "await devCtrl.SendCommand(2, 0, Clusters.AdministratorCommissioning.Commands.OpenBasicCommissioningWindow(180),  timedRequestTimeoutMs=10000)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 13,
    "id": "1c57c8ff-5ae9-4fdd-9fb8-4eda0e297db2",
    "metadata": {},
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "2022-01-25 16:59:00 johnsj-macbookpro1.roam.corp.google.com chip.CTL[27921] ERROR Unable to find country code, defaulting to WW\n",
-      "2022-01-25 16:59:00 johnsj-macbookpro1.roam.corp.google.com chip.SC[27921] ERROR The device does not support GetClock_RealTimeMS() API. This will eventually result in CASE session setup failures.\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Node address has been updated\n",
-      "Commissioning complete\n"
-     ]
-    },
     {
      "data": {
       "text/html": [
-       "
True\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
-       "\u001b[3;92mTrue\u001b[0m\n"
+       "\u001b[1;36m2\u001b[0m"
       ]
      },
+     "execution_count": 13,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "devCtrl2.CommissionIP(b'127.0.0.1', 20202021, 2)"
+    "await devCtrl2.CommissionOnNetwork(2, 20202021)"
    ]
   },
   {
@@ -662,74 +799,58 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 14,
    "id": "0c087a70-d852-4329-958d-d91a1bdbffaf",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.OperationalCredentials'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'>: [\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\xa2\\x88}\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98',\n",
-       "│   │   │   │   │   vendorId=27168,\n",
-       "│   │   │   │   │   fabricId=1,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label=''\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=2,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\x9d`\\x90\\ti\\xd1\\x9a\\xe6\\x06D\"\\x92\\x8d\\x9cz\\xcf\\xe9\\xf3\\xa3u\\xa8 w\\xd3/\\xadu>G\\xada\\x01\\xaa\\x03\\xe1\\xe9%M\\x9d\\x97\\xde\\xe5\\x93#\\xcc\\x96E\\xa7\\xf2u+\\xee\\xccH1{A\\xe0 *\\xb4\\x18\\xc1\\xc0',\n",
-       "│   │   │   │   │   vendorId=28544,\n",
-       "│   │   │   │   │   fabricId=2,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label=''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ]\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xa2\\x88\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m27168\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4246564829\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xffKd\\xd3v\\xa97c\\x87\\r\\xadXF\\xd2?\\n\\x08\\x1f\\rZE\\x91\\x0c_\\x1e`\"\\xfbwZ\\x9c\\xaf!\\\u001b[0m\u001b[32mx10\u001b[0m\u001b[32m=\\xd4\\x03\\xf5\u001b[0m\u001b[32m[\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xb3\\x08\\xa2\\xe5\\x04\\x7f\\x06\\x1c\\nEa\\x02q\\xeeK\\x91\\xda\\x1e\\xd2\\\\i\\xef\\x05#'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\x9d`\\x90\\ti\\xd1\\x9a\\xe6\\x06D\"\\x92\\x8d\\x9cz\\xcf\\xe9\\xf3\\xa3u\\xa8 w\\xd3/\\xadu>G\\xada\\x01\\xaa\\x03\\xe1\\xe9%M\\x9d\\x97\\xde\\xe5\\x93#\\xcc\\x96E\\xa7\\xf2u+\\xee\\xccH1\u001b[0m\u001b[32m{\u001b[0m\u001b[32mA\\xe0 *\\xb4\\x18\\xc1\\xc0'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m28544\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04pKSE\\xb6\\x07\\x04\\n\\xa5p\\xbb\\x1f\\xa0Z\\xb8HS\\xaa\\xaa\\xe9|\\xf1\\xaf+\\x0e\\xa6\u001b[0m\u001b[32m]\u001b[0m\u001b[32m 7\\x8f\\x10\\xe5\\xa6\\xb6\\x15$k\\x08#X\\xa5\\x8f+\\xd3M\\x99\\x06\\xc1\\x86\\x8e\\xda\\xd3\u001b[0m\u001b[32m{\u001b[0m\u001b[32m&\\xaf\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x81\\xa1h\\xc7$\\xc0\\xad\\x9b'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m2\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 14,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "await devCtrl2.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.FabricsList)], fabricFiltered=False)"
+    "await devCtrl2.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.Fabrics)], fabricFiltered=False)"
    ]
   },
   {
@@ -746,18 +867,43 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 15,
    "id": "d44f5ab8-c59f-4fdb-9a26-081f6799c512",
    "metadata": {},
    "outputs": [
     {
      "data": {
       "text/html": [
-       "
──────────────────────────────────────── Matter REPL ────────────────────────────────────────\n",
+       "
\n",
+       " Replacing  store path ./credentials/development/paa-root-certs with \n",
+       "/home/root/repos/connectedhomeip/credentials/development/paa-root-certs\n",
+       "Note that you are still running from \n",
+       "/home/root/repos/connectedhomeip/docs/development_controllers/chip-repl so other relative\n",
+       "paths may be off.\n",
+       "                    \n",
+       "
\n" + ], + "text/plain": [ + "\n", + "\u001b[1m Replacing \u001b[0m store path .\u001b[35m/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m with \n", + "\u001b[35m/home/root/repos/connectedhomeip/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m\n", + "Note that you are still running from \n", + "\u001b[35m/home/root/repos/connectedhomeip/docs/development_controllers/\u001b[0m\u001b[95mchip-repl\u001b[0m so other relative\n", + "paths may be off.\n", + " \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
─────────────────────────────────────────────────── Matter REPL ───────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\u001b[92m──────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ────────────────────────────────────────\u001b[0m\n" + "\u001b[92m─────────────────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ───────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -768,28 +914,28 @@ "text/html": [ "
\n",
        "            \n",
-       "    \n",
+       "\n",
        "            Welcome to the Matter Python REPL!\n",
-       "    \n",
+       "\n",
        "            For help, please type matterhelp()\n",
-       "    \n",
+       "\n",
        "            To get more information on a particular object/class, you can pass\n",
        "            that into matterhelp() as well.\n",
-       "    \n",
+       "\n",
        "            \n",
        "
\n" ], "text/plain": [ "\n", " \n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", + "\n", "\u001b[1;34m \u001b[0m\n" ] }, @@ -799,11 +945,11 @@ { "data": { "text/html": [ - "
─────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\u001b[92m─────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" + "\u001b[92m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -814,66 +960,32 @@ "text/html": [ "
\n",
        "\n",
+       "The following objects have been created:\n",
        "
\n" ], "text/plain": [ "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
Restoring FabricAdmin from storage to manage FabricId 1, FabricIndex 1...\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[38;5;129mRestoring FabricAdmin from storage to manage FabricId \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m, FabricIndex \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + "\n", + "\u001b[34mThe following objects have been created:\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 1(1)\n" - ] - }, { "data": { "text/html": [ - "
Restoring FabricAdmin from storage to manage FabricId 2, FabricIndex 2...\n",
+       "
        certificateAuthorityManager:    Manages a list of CertificateAuthority instances.\n",
+       "        caList:                         The list of CertificateAuthority instances.\n",
+       "        caList[n].adminList[m]:         A specific FabricAdmin object at index m for the nth CertificateAuthority \n",
+       "instance.\n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mRestoring FabricAdmin from storage to manage FabricId \u001b[0m\u001b[1;38;5;129m2\u001b[0m\u001b[38;5;129m, FabricIndex \u001b[0m\u001b[1;38;5;129m2\u001b[0m\u001b[38;5;129m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 2(2)\n" - ] - }, - { - "data": { - "text/html": [ - "
\n",
-       "Fabric Admins have been loaded and are available at fabricAdmins\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[34mFabric Admins have been loaded and are available at \u001b[0m\u001b[31mfabricAdmins\u001b[0m\n" + " \u001b[31mcertificateAuthorityManager\u001b[0m\u001b[34m: \u001b[0m\u001b[34mManages a list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34mThe list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mn\u001b[0m\u001b[1;31m]\u001b[0m\u001b[31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mm\u001b[0m\u001b[1;31m]\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34mA specific FabricAdmin object at index m for the nth CertificateAuthority \u001b[0m\n", + "\u001b[34minstance.\u001b[0m\n" ] }, "metadata": {}, @@ -884,69 +996,69 @@ "text/html": [ "
\n",
        "\n",
+       "Default CHIP Device Controller (NodeId: 112233): has been initialized to manage caList[0].adminList[0] (FabricId = \n",
+       "1), and is available as devCtrl\n",
        "
\n" ], "text/plain": [ "\n", - "\n" + "\n", + "\u001b[34mDefault CHIP Device Controller \u001b[0m\u001b[1;34m(\u001b[0m\u001b[34mNodeId: \u001b[0m\u001b[1;34m112233\u001b[0m\u001b[1;34m)\u001b[0m\u001b[34m: has been initialized to manage \u001b[0m\u001b[1;31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m \u001b[0m\u001b[1;34m(\u001b[0m\u001b[1;34mFabricId = \u001b[0m\n", + "\u001b[1;34m1\u001b[0m\u001b[1;34m)\u001b[0m\u001b[1;34m, and is available as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" - }, + } + ], + "source": [ + "%reset -f\n", + "import importlib.util\n", + "spec = importlib.util.find_spec('chip.ChipReplStartup')\n", + "%run {spec.origin}" + ] + }, + { + "cell_type": "markdown", + "id": "2a619893-da3f-4651-bc9f-a2276906fc71", + "metadata": {}, + "source": [ + "The REPL now loaded (through the `certificateAuthorityManager`) the two `certificateAuthority` instances that were created in the previous session into the `CaList`. It has also created a default controller on the first fabric in that list (Fabric 1) as `devCtrl`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "cb277ac7-2660-45bc-a01e-8a0e543ea53f", + "metadata": {}, + "outputs": [ { "data": { "text/html": [ - "
Creating default device controller on fabric 1...\n",
-       "
\n" + "
\n"
       ],
-      "text/plain": [
-       "\u001b[38;5;129mCreating default device controller on fabric \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n"
-      ]
+      "text/plain": []
      },
      "metadata": {},
      "output_type": "display_data"
     },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Allocating new controller with FabricId: 1(1), NodeId: 1\n"
-     ]
-    },
     {
      "data": {
-      "text/html": [
-       "
\n",
-       "\n",
-       "Default CHIP Device Controller has been initialized to manage fabricAdmins[0], and is \n",
-       "available as devCtrl\n",
-       "
\n" - ], "text/plain": [ "\n", - "\n", - "\u001b[34mDefault CHIP Device Controller has been initialized to manage \u001b[0m\u001b[1;31mfabricAdmins\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m, and is \u001b[0m\n", - "\u001b[1;34mavailable as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" + "\u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mchip.CertificateAuthority.CertificateAuthority\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c32c96dc30\u001b[0m\u001b[39m>,\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[39m\u001b[0m\n", + "\u001b[1m]\u001b[0m" ] }, + "execution_count": 16, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path}" - ] - }, - { - "cell_type": "markdown", - "id": "2a619893-da3f-4651-bc9f-a2276906fc71", - "metadata": {}, - "source": [ - "The REPL has now loaded the two fabrics that were created in the previous session into the `fabricAdmins` variable. It has also created a default controller on the first fabric in that list (Fabric 1) as `devCtrl`." + "caList" ] }, { @@ -965,90 +1077,92 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "45ee5838-b1e9-4ba8-b804-c3efc9d352d0", + "execution_count": 17, + "id": "fb79f13a-9acb-4ddd-b0b4-38589ff4822e", "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-01-25 16:59:00 johnsj-macbookpro1.roam.corp.google.com chip.SC[27921] ERROR The device does not support GetClock_RealTimeMS() API. This will eventually result in CASE session setup failures.\n" - ] + "data": { + "text/html": [ + "
\n"
+      ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
     },
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Node address has been updated\n",
-      "Established CASE with Device\n"
-     ]
-    },
+     "data": {
+      "text/plain": [
+       "\u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x74c32c96e0b0\u001b[0m\u001b[1m>\u001b[0m"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "devCtrl"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "45ee5838-b1e9-4ba8-b804-c3efc9d352d0",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.OperationalCredentials'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'>: [\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\xa2\\x88}\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98',\n",
-       "│   │   │   │   │   vendorId=27168,\n",
-       "│   │   │   │   │   fabricId=1,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label='Fabric1Label'\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=2,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\x9d`\\x90\\ti\\xd1\\x9a\\xe6\\x06D\"\\x92\\x8d\\x9cz\\xcf\\xe9\\xf3\\xa3u\\xa8 w\\xd3/\\xadu>G\\xada\\x01\\xaa\\x03\\xe1\\xe9%M\\x9d\\x97\\xde\\xe5\\x93#\\xcc\\x96E\\xa7\\xf2u+\\xee\\xccH1{A\\xe0 *\\xb4\\x18\\xc1\\xc0',\n",
-       "│   │   │   │   │   vendorId=28544,\n",
-       "│   │   │   │   │   fabricId=2,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label=''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ]\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xa2\\x88\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m27168\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Fabric1Label'\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4246564830\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xffKd\\xd3v\\xa97c\\x87\\r\\xadXF\\xd2?\\n\\x08\\x1f\\rZE\\x91\\x0c_\\x1e`\"\\xfbwZ\\x9c\\xaf!\\\u001b[0m\u001b[32mx10\u001b[0m\u001b[32m=\\xd4\\x03\\xf5\u001b[0m\u001b[32m[\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xb3\\x08\\xa2\\xe5\\x04\\x7f\\x06\\x1c\\nEa\\x02q\\xeeK\\x91\\xda\\x1e\\xd2\\\\i\\xef\\x05#'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Fabric1Label'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\x9d`\\x90\\ti\\xd1\\x9a\\xe6\\x06D\"\\x92\\x8d\\x9cz\\xcf\\xe9\\xf3\\xa3u\\xa8 w\\xd3/\\xadu>G\\xada\\x01\\xaa\\x03\\xe1\\xe9%M\\x9d\\x97\\xde\\xe5\\x93#\\xcc\\x96E\\xa7\\xf2u+\\xee\\xccH1\u001b[0m\u001b[32m{\u001b[0m\u001b[32mA\\xe0 *\\xb4\\x18\\xc1\\xc0'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m28544\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04pKSE\\xb6\\x07\\x04\\n\\xa5p\\xbb\\x1f\\xa0Z\\xb8HS\\xaa\\xaa\\xe9|\\xf1\\xaf+\\x0e\\xa6\u001b[0m\u001b[32m]\u001b[0m\u001b[32m 7\\x8f\\x10\\xe5\\xa6\\xb6\\x15$k\\x08#X\\xa5\\x8f+\\xd3M\\x99\\x06\\xc1\\x86\\x8e\\xda\\xd3\u001b[0m\u001b[32m{\u001b[0m\u001b[32m&\\xaf\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x81\\xa1h\\xc7$\\xc0\\xad\\x9b'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m2\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 18,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
     "await devCtrl.SendCommand(2, 0, Clusters.OperationalCredentials.Commands.UpdateFabricLabel(\"Fabric1Label\"))\n",
-    "await devCtrl.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.FabricsList)], fabricFiltered=False)"
+    "await devCtrl.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.Fabrics)], fabricFiltered=False)"
    ]
   },
   {
@@ -1063,97 +1177,67 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 19,
    "id": "5d88cb17-bdda-418f-94ca-83d746c162b0",
    "metadata": {},
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "2022-01-25 16:59:00 johnsj-macbookpro1.roam.corp.google.com chip.SC[27921] ERROR The device does not support GetClock_RealTimeMS() API. This will eventually result in CASE session setup failures.\n"
-     ]
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Allocating new controller with FabricId: 2(2), NodeId: 1\n",
-      "Node address has been updated\n",
-      "Established CASE with Device\n"
-     ]
-    },
     {
      "data": {
       "text/html": [
-       "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.OperationalCredentials'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'>: [\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\xa2\\x88}\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98',\n",
-       "│   │   │   │   │   vendorId=27168,\n",
-       "│   │   │   │   │   fabricId=1,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label='Fabric1Label'\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=2,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\x9d`\\x90\\ti\\xd1\\x9a\\xe6\\x06D\"\\x92\\x8d\\x9cz\\xcf\\xe9\\xf3\\xa3u\\xa8 w\\xd3/\\xadu>G\\xada\\x01\\xaa\\x03\\xe1\\xe9%M\\x9d\\x97\\xde\\xe5\\x93#\\xcc\\x96E\\xa7\\xf2u+\\xee\\xccH1{A\\xe0 *\\xb4\\x18\\xc1\\xc0',\n",
-       "│   │   │   │   │   vendorId=28544,\n",
-       "│   │   │   │   │   fabricId=2,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label='Fabric2Label'\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ]\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n",
-       "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xa2\\x88\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xbd\\xdb\\xd4\\xbc^U\\xa3\\xcef\\xf7\\x92\\xbe\\xa7X;E\\xb8-Y\\x12^$\\xe0\\x1bS\\xf9\\x9a\\x8f\\xacvj\\xfa!&m6\\x00\\xe3\\xd1\\x85o\\x1b\\x9eH\\xabC?\\xd8\\xec\\x08lH\\xb5X\\x1f:u\\xb0\\xfbj\\x98'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m27168\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Fabric1Label'\u001b[0m\n",
+       "\u001b[2;32m│   │   \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[39m>: \u001b[0m\u001b[1;39m{\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m: \u001b[0m\u001b[1;36m4246564831\u001b[0m\u001b[39m,\u001b[0m\n",
+       "\u001b[2;32m│   │   │   \u001b[0m\u001b[39m\u001b[0m: \u001b[1m[\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\xffKd\\xd3v\\xa97c\\x87\\r\\xadXF\\xd2?\\n\\x08\\x1f\\rZE\\x91\\x0c_\\x1e`\"\\xfbwZ\\x9c\\xaf!\\\u001b[0m\u001b[32mx10\u001b[0m\u001b[32m=\\xd4\\x03\\xf5\u001b[0m\u001b[32m[\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xb3\\x08\\xa2\\xe5\\x04\\x7f\\x06\\x1c\\nEa\\x02q\\xeeK\\x91\\xda\\x1e\\xd2\\\\i\\xef\\x05#'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m=\u001b[1;36m1\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Fabric1Label'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\x9d`\\x90\\ti\\xd1\\x9a\\xe6\\x06D\"\\x92\\x8d\\x9cz\\xcf\\xe9\\xf3\\xa3u\\xa8 w\\xd3/\\xadu>G\\xada\\x01\\xaa\\x03\\xe1\\xe9%M\\x9d\\x97\\xde\\xe5\\x93#\\xcc\\x96E\\xa7\\xf2u+\\xee\\xccH1\u001b[0m\u001b[32m{\u001b[0m\u001b[32mA\\xe0 *\\xb4\\x18\\xc1\\xc0'\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m28544\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
-       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Fabric2Label'\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1;35mFabricDescriptorStruct\u001b[0m\u001b[1m(\u001b[0m\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04pKSE\\xb6\\x07\\x04\\n\\xa5p\\xbb\\x1f\\xa0Z\\xb8HS\\xaa\\xaa\\xe9|\\xf1\\xaf+\\x0e\\xa6\u001b[0m\u001b[32m]\u001b[0m\u001b[32m 7\\x8f\\x10\\xe5\\xa6\\xb6\\x15$k\\x08#X\\xa5\\x8f+\\xd3M\\x99\\x06\\xc1\\x86\\x8e\\xda\\xd3\u001b[0m\u001b[32m{\u001b[0m\u001b[32m&\\xaf\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x81\\xa1h\\xc7$\\xc0\\xad\\x9b'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mvendorID\u001b[0m=\u001b[1;36m65521\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mnodeID\u001b[0m=\u001b[1;36m2\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Fabric2Label'\u001b[0m,\n",
+       "\u001b[2;32m│   │   │   │   │   \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m2\u001b[0m\n",
        "\u001b[2;32m│   │   │   │   \u001b[0m\u001b[1m)\u001b[0m\n",
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m}\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m}\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 19,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
-    "devCtrl2 = fabricAdmins[1].NewController()\n",
+    "fabricAdmin2 = caList[1].adminList[0]\n",
+    "devCtrl2 = fabricAdmin2.NewController()\n",
+    "\n",
     "await devCtrl2.SendCommand(2, 0, Clusters.OperationalCredentials.Commands.UpdateFabricLabel(\"Fabric2Label\"))\n",
-    "await devCtrl2.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.FabricsList)], fabricFiltered=False)"
+    "await devCtrl2.ReadAttribute(2, [(Clusters.OperationalCredentials.Attributes.Fabrics)], fabricFiltered=False)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 20,
    "id": "4ecb4ab4-bb7a-4941-8080-34783028fce0",
    "metadata": {},
    "outputs": [],
@@ -1164,9 +1248,9 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "matter-env",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
-   "name": "matter-env"
+   "name": "python3"
   },
   "language_info": {
    "codemirror_mode": {
@@ -1178,7 +1262,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.2+chromium.10"
+   "version": "3.10.12"
   }
  },
  "nbformat": 4,
diff --git a/docs/development_controllers/chip-repl/Matter_REPL_Intro.ipynb b/docs/development_controllers/chip-repl/Matter_REPL_Intro.ipynb
index 69e0a6c603452a..10363c6936e608 100644
--- a/docs/development_controllers/chip-repl/Matter_REPL_Intro.ipynb
+++ b/docs/development_controllers/chip-repl/Matter_REPL_Intro.ipynb
@@ -39,82 +39,52 @@
     "tags": []
    },
    "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "
──────────────────────────────────────── Matter REPL ────────────────────────────────────────\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[92m──────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ────────────────────────────────────────\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "text/html": [ "
\n",
-       "            \n",
-       "    \n",
-       "            Welcome to the Matter Python REPL!\n",
-       "    \n",
-       "            For help, please type matterhelp()\n",
-       "    \n",
-       "            To get more information on a particular object/class, you can pass\n",
-       "            that into matterhelp() as well.\n",
-       "    \n",
-       "            \n",
+       " Replacing  store path ./credentials/development/paa-root-certs with \n",
+       "/home/root/repos/connectedhomeip/credentials/development/paa-root-certs\n",
+       "Note that you are still running from \n",
+       "/home/root/repos/connectedhomeip/docs/development_controllers/chip-repl so other relative\n",
+       "paths may be off.\n",
+       "                    \n",
        "
\n" ], "text/plain": [ "\n", - " \n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", - "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m \u001b[0m\n" + "\u001b[1m Replacing \u001b[0m store path .\u001b[35m/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m with \n", + "\u001b[35m/home/root/repos/connectedhomeip/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m\n", + "Note that you are still running from \n", + "\u001b[35m/home/root/repos/connectedhomeip/docs/development_controllers/\u001b[0m\u001b[95mchip-repl\u001b[0m so other relative\n", + "paths may be off.\n", + " \n" ] }, "metadata": {}, "output_type": "display_data" }, { - "data": { - "text/html": [ - "
─────────────────────────────────────────────────────────────────────────────────────────────\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[92m─────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "2022-01-25 16:57:54 johnsj-macbookpro1.roam.corp.google.com root[27642] CRITICAL Loading configuration from /tmp/repl-storage.json...\n" + "[1738153426.053862][2285034:2285034] CHIP:CTL: Setting attestation nonce to random value\n", + "[1738153426.054073][2285034:2285034] CHIP:CTL: Setting CSR nonce to random value\n", + "[1738153426.063146][2285034:2285034] CHIP:DL: NVS set: chip-counters/reboot-count = 3 (0x3)\n", + "[1738153426.063662][2285034:2285034] CHIP:DL: Got Ethernet interface: enp2s0\n", + "[1738153426.063914][2285034:2285034] CHIP:DL: Found the primary Ethernet interface:enp2s0\n", + "[1738153426.064073][2285034:2285034] CHIP:DL: Got WiFi interface: wlp3s0\n", + "[1738153426.064230][2285034:2285034] CHIP:DL: Found the primary WiFi interface:wlp3s0\n" ] }, { "data": { "text/html": [ - "
\n",
-       "\n",
+       "
─────────────────────────────────────────────────── Matter REPL ───────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\n", - "\n" + "\u001b[92m─────────────────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ───────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -123,53 +93,44 @@ { "data": { "text/html": [ - "
Restoring FabricAdmin from storage to manage FabricId 1, FabricIndex 1...\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[38;5;129mRestoring FabricAdmin from storage to manage FabricId \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m, FabricIndex \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 1(1)\n" - ] - }, - { - "data": { - "text/html": [ - "
Restoring FabricAdmin from storage to manage FabricId 2, FabricIndex 2...\n",
+       "
\n",
+       "            \n",
+       "\n",
+       "            Welcome to the Matter Python REPL!\n",
+       "\n",
+       "            For help, please type matterhelp()\n",
+       "\n",
+       "            To get more information on a particular object/class, you can pass\n",
+       "            that into matterhelp() as well.\n",
+       "\n",
+       "            \n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mRestoring FabricAdmin from storage to manage FabricId \u001b[0m\u001b[1;38;5;129m2\u001b[0m\u001b[38;5;129m, FabricIndex \u001b[0m\u001b[1;38;5;129m2\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + "\n", + " \n", + "\n", + "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", + "\n", + "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", + "\n", + "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", + "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", + "\n", + "\u001b[1;34m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 2(2)\n" - ] - }, { "data": { "text/html": [ - "
\n",
-       "Fabric Admins have been loaded and are available at fabricAdmins\n",
+       "
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\n", - "\u001b[34mFabric Admins have been loaded and are available at \u001b[0m\u001b[31mfabricAdmins\u001b[0m\n" + "\u001b[92m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -180,11 +141,13 @@ "text/html": [ "
\n",
        "\n",
+       "The following objects have been created:\n",
        "
\n" ], "text/plain": [ "\n", - "\n" + "\n", + "\u001b[34mThe following objects have been created:\u001b[0m\n" ] }, "metadata": {}, @@ -193,37 +156,36 @@ { "data": { "text/html": [ - "
Creating default device controller on fabric 1...\n",
+       "
        certificateAuthorityManager:    Manages a list of CertificateAuthority instances.\n",
+       "        caList:                         The list of CertificateAuthority instances.\n",
+       "        caList[n].adminList[m]:         A specific FabricAdmin object at index m for the nth CertificateAuthority \n",
+       "instance.\n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mCreating default device controller on fabric \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + " \u001b[31mcertificateAuthorityManager\u001b[0m\u001b[34m: \u001b[0m\u001b[34mManages a list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34mThe list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mn\u001b[0m\u001b[1;31m]\u001b[0m\u001b[31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mm\u001b[0m\u001b[1;31m]\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34mA specific FabricAdmin object at index m for the nth CertificateAuthority \u001b[0m\n", + "\u001b[34minstance.\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Allocating new controller with FabricId: 1(1), NodeId: 1\n" - ] - }, { "data": { "text/html": [ "
\n",
        "\n",
-       "Default CHIP Device Controller has been initialized to manage fabricAdmins[0], and is \n",
-       "available as devCtrl\n",
+       "Default CHIP Device Controller (NodeId: 112233): has been initialized to manage caList[0].adminList[0] (FabricId = \n",
+       "1), and is available as devCtrl\n",
        "
\n" ], "text/plain": [ "\n", "\n", - "\u001b[34mDefault CHIP Device Controller has been initialized to manage \u001b[0m\u001b[1;31mfabricAdmins\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m, and is \u001b[0m\n", - "\u001b[1;34mavailable as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" + "\u001b[34mDefault CHIP Device Controller \u001b[0m\u001b[1;34m(\u001b[0m\u001b[34mNodeId: \u001b[0m\u001b[1;34m112233\u001b[0m\u001b[1;34m)\u001b[0m\u001b[34m: has been initialized to manage \u001b[0m\u001b[1;31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m \u001b[0m\u001b[1;34m(\u001b[0m\u001b[1;34mFabricId = \u001b[0m\n", + "\u001b[1;34m1\u001b[0m\u001b[1;34m)\u001b[0m\u001b[1;34m, and is available as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" ] }, "metadata": {}, @@ -231,10 +193,10 @@ } ], "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path}" + "%reset -f\n", + "import importlib.util\n", + "spec = importlib.util.find_spec('chip.ChipReplStartup')\n", + "%run {spec.origin}" ] }, { @@ -253,47 +215,26 @@ "id": "c05b4b22-f6b1-4669-9358-98b0fe9a9136", "metadata": {}, "outputs": [ - { - "data": { - "text/html": [ - "
──────────────────────────────────────── Matter REPL ────────────────────────────────────────\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[92m──────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ────────────────────────────────────────\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "text/html": [ "
\n",
-       "            \n",
-       "    \n",
-       "            Welcome to the Matter Python REPL!\n",
-       "    \n",
-       "            For help, please type matterhelp()\n",
-       "    \n",
-       "            To get more information on a particular object/class, you can pass\n",
-       "            that into matterhelp() as well.\n",
-       "    \n",
-       "            \n",
+       " Replacing  store path ./credentials/development/paa-root-certs with \n",
+       "/home/root/repos/connectedhomeip/credentials/development/paa-root-certs\n",
+       "Note that you are still running from \n",
+       "/home/root/repos/connectedhomeip/docs/development_controllers/chip-repl so other relative\n",
+       "paths may be off.\n",
+       "                    \n",
        "
\n" ], "text/plain": [ "\n", - " \n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", - "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m \u001b[0m\n" + "\u001b[1m Replacing \u001b[0m store path .\u001b[35m/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m with \n", + "\u001b[35m/home/root/repos/connectedhomeip/credentials/development/\u001b[0m\u001b[95mpaa-root-certs\u001b[0m\n", + "Note that you are still running from \n", + "\u001b[35m/home/root/repos/connectedhomeip/docs/development_controllers/\u001b[0m\u001b[95mchip-repl\u001b[0m so other relative\n", + "paths may be off.\n", + " \n" ] }, "metadata": {}, @@ -302,11 +243,11 @@ { "data": { "text/html": [ - "
─────────────────────────────────────────────────────────────────────────────────────────────\n",
+       "
─────────────────────────────────────────────────── Matter REPL ───────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\u001b[92m─────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" + "\u001b[92m─────────────────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ───────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -316,67 +257,43 @@ "data": { "text/html": [ "
\n",
+       "            \n",
        "\n",
-       "
\n" - ], - "text/plain": [ + " Welcome to the Matter Python REPL!\n", "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
Restoring FabricAdmin from storage to manage FabricId 1, FabricIndex 1...\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[38;5;129mRestoring FabricAdmin from storage to manage FabricId \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m, FabricIndex \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 1(1)\n" - ] - }, - { - "data": { - "text/html": [ - "
Restoring FabricAdmin from storage to manage FabricId 2, FabricIndex 2...\n",
+       "            For help, please type matterhelp()\n",
+       "\n",
+       "            To get more information on a particular object/class, you can pass\n",
+       "            that into matterhelp() as well.\n",
+       "\n",
+       "            \n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mRestoring FabricAdmin from storage to manage FabricId \u001b[0m\u001b[1;38;5;129m2\u001b[0m\u001b[38;5;129m, FabricIndex \u001b[0m\u001b[1;38;5;129m2\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + "\n", + " \n", + "\n", + "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", + "\n", + "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", + "\n", + "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", + "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", + "\n", + "\u001b[1;34m \u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 2(2)\n" - ] - }, { "data": { "text/html": [ - "
\n",
-       "Fabric Admins have been loaded and are available at fabricAdmins\n",
+       "
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\n",
        "
\n" ], "text/plain": [ - "\n", - "\u001b[34mFabric Admins have been loaded and are available at \u001b[0m\u001b[31mfabricAdmins\u001b[0m\n" + "\u001b[92m───────────────────────────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" ] }, "metadata": {}, @@ -387,11 +304,13 @@ "text/html": [ "
\n",
        "\n",
+       "The following objects have been created:\n",
        "
\n" ], "text/plain": [ "\n", - "\n" + "\n", + "\u001b[34mThe following objects have been created:\u001b[0m\n" ] }, "metadata": {}, @@ -400,37 +319,36 @@ { "data": { "text/html": [ - "
Creating default device controller on fabric 1...\n",
+       "
        certificateAuthorityManager:    Manages a list of CertificateAuthority instances.\n",
+       "        caList:                         The list of CertificateAuthority instances.\n",
+       "        caList[n].adminList[m]:         A specific FabricAdmin object at index m for the nth CertificateAuthority \n",
+       "instance.\n",
        "
\n" ], "text/plain": [ - "\u001b[38;5;129mCreating default device controller on fabric \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" + " \u001b[31mcertificateAuthorityManager\u001b[0m\u001b[34m: \u001b[0m\u001b[34mManages a list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34m \u001b[0m\u001b[34mThe list of CertificateAuthority instances.\u001b[0m\n", + "\u001b[34m \u001b[0m\u001b[31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mn\u001b[0m\u001b[1;31m]\u001b[0m\u001b[31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[31mm\u001b[0m\u001b[1;31m]\u001b[0m\u001b[34m: \u001b[0m\u001b[34m \u001b[0m\u001b[34mA specific FabricAdmin object at index m for the nth CertificateAuthority \u001b[0m\n", + "\u001b[34minstance.\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Allocating new controller with FabricId: 1(1), NodeId: 1\n" - ] - }, { "data": { "text/html": [ "
\n",
        "\n",
-       "Default CHIP Device Controller has been initialized to manage fabricAdmins[0], and is \n",
-       "available as devCtrl\n",
+       "Default CHIP Device Controller (NodeId: 112233): has been initialized to manage caList[0].adminList[0] (FabricId = \n",
+       "1), and is available as devCtrl\n",
        "
\n" ], "text/plain": [ "\n", "\n", - "\u001b[34mDefault CHIP Device Controller has been initialized to manage \u001b[0m\u001b[1;31mfabricAdmins\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m, and is \u001b[0m\n", - "\u001b[1;34mavailable as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" + "\u001b[34mDefault CHIP Device Controller \u001b[0m\u001b[1;34m(\u001b[0m\u001b[34mNodeId: \u001b[0m\u001b[1;34m112233\u001b[0m\u001b[1;34m)\u001b[0m\u001b[34m: has been initialized to manage \u001b[0m\u001b[1;31mcaList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;31m.adminList\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m \u001b[0m\u001b[1;34m(\u001b[0m\u001b[1;34mFabricId = \u001b[0m\n", + "\u001b[1;34m1\u001b[0m\u001b[1;34m)\u001b[0m\u001b[1;34m, and is available as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" ] }, "metadata": {}, @@ -438,10 +356,10 @@ } ], "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path} --storagepath /tmp/repl.json" + "%reset -f\n", + "import importlib.util\n", + "spec = importlib.util.find_spec('chip.ChipReplStartup')\n", + "%run {spec.origin} --storagepath /tmp/repl.json" ] }, { @@ -466,449 +384,1687 @@ { "data": { "text/html": [ - "
╭─────────────────── <class 'chip.ChipDeviceCtrl.ChipDeviceController'> ────────────────────╮\n",
-       " ╭───────────────────────────────────────────────────────────────────────────────────────╮ \n",
-       "  <chip.ChipDeviceCtrl.ChipDeviceController object at 0x1143b3910>                       \n",
-       " ╰───────────────────────────────────────────────────────────────────────────────────────╯ \n",
-       "                                                                                           \n",
-       "                                activeList = {                                             \n",
-       "                                                 <chip.ChipDeviceCtrl.ChipDeviceController \n",
-       "                                             object at 0x1143b3910>                        \n",
-       "                                             }                                             \n",
-       "                                   devCtrl = c_void_p(140320379576320)                     \n",
-       "                                  isActive = True                                          \n",
-       "                                     state = <DCState.IDLE: 1>                             \n",
-       "        cbHandleCommissioningCompleteFunct = def cbHandleCommissioningCompleteFunct(...)   \n",
-       "          cbHandleKeyExchangeCompleteFunct = def cbHandleKeyExchangeCompleteFunct(...)     \n",
-       "                 cbOnAddressUpdateComplete = def cbOnAddressUpdateComplete(...)            \n",
-       "                             CheckIsActive = def CheckIsActive():                          \n",
-       "                        CloseBLEConnection = def CloseBLEConnection():                     \n",
-       "                              CloseSession = def CloseSession(nodeid):                     \n",
-       "                                Commission = def Commission(nodeid):                       \n",
-       "                              CommissionIP = def CommissionIP(ipaddr, setupPinCode,        \n",
-       "                                             nodeid):                                      \n",
-       "                                ConnectBLE = def ConnectBLE(discriminator, setupPinCode,   \n",
-       "                                             nodeid):                                      \n",
-       "                                ConnectBle = def ConnectBle(bleConnection):                \n",
-       "                  DiscoverAllCommissioning = def DiscoverAllCommissioning():               \n",
-       " DiscoverCommissionableNodesCommissioningEn… def                                           \n",
-       "                                           = DiscoverCommissionableNodesCommissioningEnab… \n",
-       "     DiscoverCommissionableNodesDeviceType = def                                           \n",
-       "                                             DiscoverCommissionableNodesDeviceType(device… \n",
-       " DiscoverCommissionableNodesLongDiscriminat… def                                           \n",
-       "                                           = DiscoverCommissionableNodesLongDiscriminator \n",
-       " DiscoverCommissionableNodesShortDiscrimina… def                                           \n",
-       "                                           = DiscoverCommissionableNodesShortDiscriminato… \n",
-       "         DiscoverCommissionableNodesVendor = def                                           \n",
-       "                                             DiscoverCommissionableNodesVendor(vendor):    \n",
-       "                    EstablishPASESessionIP = def EstablishPASESessionIP(ipaddr,            \n",
-       "                                             setupPinCode, nodeid):                        \n",
-       "                         GetAddressAndPort = def GetAddressAndPort(nodeid):                \n",
-       "                         GetClusterHandler = def GetClusterHandler():                      \n",
-       "                     GetCompressedFabricId = def GetCompressedFabricId():                  \n",
-       "                    GetConnectedDeviceSync = def GetConnectedDeviceSync(nodeid):           \n",
-       "                               GetFabricId = def GetFabricId():                            \n",
-       "                  GetIPForDiscoveredDevice = def GetIPForDiscoveredDevice(idx, addrStr,    \n",
-       "                                             length):                                      \n",
-       "                              GetLogFilter = def GetLogFilter():                           \n",
-       "                               IsConnected = def IsConnected():                            \n",
-       "                   OpenCommissioningWindow = def OpenCommissioningWindow(nodeid, timeout,  \n",
-       "                                             iteration, discriminator, option):            \n",
-       "                               ParseQRCode = def ParseQRCode(qrCode, output):              \n",
-       "                    PrintDiscoveredDevices = def PrintDiscoveredDevices():                 \n",
-       "                             ReadAttribute = def ReadAttribute(nodeid: int, attributes:    \n",
-       "                                             List[Union[NoneType, Tuple[int],              \n",
-       "                                             Tuple[Type[chip.clusters.ClusterObjects.Clus… \n",
-       "                                             Tuple[Type[chip.clusters.ClusterObjects.Clus… \n",
-       "                                             Tuple[int,                                    \n",
-       "                                             Type[chip.clusters.ClusterObjects.Cluster]],  \n",
-       "                                             Tuple[int,                                    \n",
-       "                                             Type[chip.clusters.ClusterObjects.ClusterAtt… \n",
-       "                                             returnClusterObject: bool = False,            \n",
-       "                                             reportInterval: Tuple[int, int] = None,       \n",
-       "                                             fabricFiltered: bool = True):                 \n",
-       "                                             Read a list of attributes from a target node  \n",
-       "                                                                                           \n",
-       "                                             nodeId: Target's Node ID                      \n",
-       "                                             attributes: A list of tuples of varying types \n",
-       "                                             depending on the type of read being           \n",
-       "                                             requested:                                    \n",
-       "                                                 (endpoint, Clusters.ClusterA.AttributeA): \n",
-       "                                             Endpoint = specific,    Cluster = specific,   \n",
-       "                                             Attribute = specific                          \n",
-       "                                                 (endpoint, Clusters.ClusterA):            \n",
-       "                                             Endpoint = specific,    Cluster = specific,   \n",
-       "                                             Attribute = *                                 \n",
-       "                                                 (Clusters.ClusterA.AttributeA):           \n",
-       "                                             Endpoint = *,           Cluster = specific,   \n",
-       "                                             Attribute = specific                          \n",
-       "                                                 endpoint:                                 \n",
-       "                                             Endpoint = specific,    Cluster = *,          \n",
-       "                                             Attribute = *                                 \n",
-       "                                                 Clusters.ClusterA:                        \n",
-       "                                             Endpoint = *,           Cluster = specific,   \n",
-       "                                             Attribute = *                                 \n",
-       "                                                 '*' or ():                                \n",
-       "                                             Endpoint = *,           Cluster = *,          \n",
-       "                                             Attribute = *                                 \n",
-       "                                                                                           \n",
-       "                                                 The cluster and attributes specified      \n",
-       "                                             above are to be selected from the generated   \n",
-       "                                             cluster objects.                              \n",
-       "                                                                                           \n",
-       "                                                 e.g.                                      \n",
-       "                                                     ReadAttribute(1, [ 1 ] ) -- case 4    \n",
-       "                                             above.                                        \n",
-       "                                                     ReadAttribute(1, [ Clusters.BasicInformation ] ) \n",
-       "                                             -- case 5 above.                              \n",
-       "                                                     ReadAttribute(1, [ (1,                \n",
-       "                                             Clusters.BasicInformation.Attributes.Location ] ) --     \n",
-       "                                             case 1 above.                                 \n",
-       "                                                                                           \n",
-       "                                             returnClusterObject: This returns the data as \n",
-       "                                             consolidated cluster objects, with all        \n",
-       "                                             attributes for a cluster inside               \n",
-       "                                                                  a single cluster-wide    \n",
-       "                                             cluster object.                               \n",
-       "                                                                                           \n",
-       "                                             reportInterval: A tuple of two int-s for      \n",
-       "                                             (MinIntervalFloor, MaxIntervalCeiling). Used  \n",
-       "                                             by establishing subscriptions.                \n",
-       "                                                 When not provided, a read request will be \n",
-       "                                             sent.                                         \n",
-       "                                 ReadEvent = def ReadEvent(nodeid: int, events:            \n",
-       "                                             List[Union[NoneType, Tuple[int],              \n",
-       "                                             Tuple[Type[chip.clusters.ClusterObjects.Clus… \n",
-       "                                             Tuple[Type[chip.clusters.ClusterObjects.Clus… \n",
-       "                                             Tuple[int,                                    \n",
-       "                                             Type[chip.clusters.ClusterObjects.Cluster]],  \n",
-       "                                             Tuple[int,                                    \n",
-       "                                             Type[chip.clusters.ClusterObjects.ClusterEve… \n",
-       "                                             reportInterval: Tuple[int, int] = None):      \n",
-       "                                             Read a list of events from a target node      \n",
-       "                                                                                           \n",
-       "                                             nodeId: Target's Node ID                      \n",
-       "                                             events: A list of tuples of varying types     \n",
-       "                                             depending on the type of read being           \n",
-       "                                             requested:                                    \n",
-       "                                                 (endpoint, Clusters.ClusterA.EventA):     \n",
-       "                                             Endpoint = specific,    Cluster = specific,   \n",
-       "                                             Event = specific                              \n",
-       "                                                 (endpoint, Clusters.ClusterA):            \n",
-       "                                             Endpoint = specific,    Cluster = specific,   \n",
-       "                                             Event = *                                     \n",
-       "                                                 (Clusters.ClusterA.EventA):               \n",
-       "                                             Endpoint = *,           Cluster = specific,   \n",
-       "                                             Event = specific                              \n",
-       "                                                 endpoint:                                 \n",
-       "                                             Endpoint = specific,    Cluster = *,          \n",
-       "                                             Event = *                                     \n",
-       "                                                 Clusters.ClusterA:                        \n",
-       "                                             Endpoint = *,           Cluster = specific,   \n",
-       "                                             Event = *                                     \n",
-       "                                                 '*' or ():                                \n",
-       "                                             Endpoint = *,           Cluster = *,          \n",
-       "                                             Event = *                                     \n",
-       "                                                                                           \n",
-       "                                             The cluster and events specified above are to \n",
-       "                                             be selected from the generated cluster        \n",
-       "                                             objects.                                      \n",
-       "                                                                                           \n",
-       "                                             e.g.                                          \n",
-       "                                                 ReadEvent(1, [ 1 ] ) -- case 4 above.     \n",
-       "                                                 ReadEvent(1, [ Clusters.BasicInformation ] ) -- case \n",
-       "                                             5 above.                                      \n",
-       "                                                 ReadEvent(1, [ (1,                        \n",
-       "                                             Clusters.BasicInformation.Events.Location ] ) -- case 1  \n",
-       "                                             above.                                        \n",
-       "                                                                                           \n",
-       "                                             reportInterval: A tuple of two int-s for      \n",
-       "                                             (MinIntervalFloor, MaxIntervalCeiling). Used  \n",
-       "                                             by establishing subscriptions.                \n",
-       "                                                 When not provided, a read request will be \n",
-       "                                             sent.                                         \n",
-       "                               ResolveNode = def ResolveNode(nodeid):                      \n",
-       "                               SendCommand = def SendCommand(nodeid: int, endpoint: int,   \n",
-       "                                             payload:                                      \n",
-       "                                             chip.clusters.ClusterObjects.ClusterCommand,  \n",
-       "                                             responseType=None, timedRequestTimeoutMs: int \n",
-       "                                             = None):                                      \n",
-       "                                             Send a cluster-object encapsulated command to \n",
-       "                                             a node and get returned a future that can be  \n",
-       "                                             awaited upon to receive the response.         \n",
-       "                                             If a valid responseType is passed in, that    \n",
-       "                                             will be used to deserialize the object. If    \n",
-       "                                             not, the type will be automatically deduced   \n",
-       "                                             from the metadata received over the wire.     \n",
-       "                                                                                           \n",
-       "                                             timedWriteTimeoutMs: Timeout for a timed      \n",
-       "                                             invoke request. Omit or set to 'None' to      \n",
-       "                                             indicate a non-timed request.                 \n",
-       "                             SetBlockingCB = def SetBlockingCB(blockingCB):                \n",
-       "                              SetLogFilter = def SetLogFilter(category):                   \n",
-       "               SetThreadOperationalDataset = def                                           \n",
-       "                                             SetThreadOperationalDataset(threadOperationa… \n",
-       "                        SetWiFiCredentials = def SetWiFiCredentials(ssid, credentials):    \n",
-       "                                  Shutdown = def Shutdown():                               \n",
-       "                                             Shuts down this controller and reclaims any   \n",
-       "                                             used resources, including the bound           \n",
-       "                                             C++ constructor instance in the SDK.          \n",
-       "                               ShutdownAll = def ShutdownAll(...) Shut down all active     \n",
-       "                                             controllers and reclaim any used resources.   \n",
-       "                            WriteAttribute = def WriteAttribute(nodeid: int, attributes:   \n",
-       "                                             List[Tuple[int,                               \n",
-       "                                             chip.clusters.ClusterObjects.ClusterAttribut… \n",
-       "                                             timedRequestTimeoutMs: int = None):           \n",
-       "                                             Write a list of attributes on a target node.  \n",
-       "                                                                                           \n",
-       "                                             nodeId: Target's Node ID                      \n",
-       "                                             timedWriteTimeoutMs: Timeout for a timed      \n",
-       "                                             write request. Omit or set to 'None' to       \n",
-       "                                             indicate a non-timed request.                 \n",
-       "                                             attributes: A list of tuples of type          \n",
-       "                                             (endpoint, cluster-object):                   \n",
-       "                                                                                           \n",
-       "                                             E.g                                           \n",
-       "                                                 (1,                                       \n",
-       "                                             Clusters.UnitTesting.Attributes.XYZAttribute \n",
-       "                                             -- Write 'hello' to the XYZ attribute on the  \n",
-       "                                             test cluster to endpoint 1                    \n",
-       "                          ZCLAttributeList = def ZCLAttributeList():                       \n",
-       "                            ZCLCommandList = def ZCLCommandList():                         \n",
-       "                          ZCLReadAttribute = def ZCLReadAttribute(cluster, attribute,      \n",
-       "                                             nodeid, endpoint, groupid, blocking=True):    \n",
-       "                                   ZCLSend = def ZCLSend(cluster, command, nodeid,         \n",
-       "                                             endpoint, groupid, args, blocking=False):     \n",
-       "                     ZCLSubscribeAttribute = def ZCLSubscribeAttribute(cluster, attribute, \n",
-       "                                             nodeid, endpoint, minInterval, maxInterval,   \n",
-       "                                             blocking=True):                               \n",
-       "                         ZCLWriteAttribute = def ZCLWriteAttribute(cluster: str,           \n",
-       "                                             attribute: str, nodeid, endpoint, groupid,    \n",
-       "                                             value, blocking=True):                        \n",
-       "╰───────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
╭────────────────────────────── <class 'chip.ChipDeviceCtrl.ChipDeviceController'> ───────────────────────────────╮\n",
+       " The ChipDeviceCommissioner binding, named as ChipDeviceController                                               \n",
+       "                                                                                                                 \n",
+       " TODO: This class contains DEPRECATED functions, we should update the test scripts to avoid the usage of those   \n",
+       " functions.                                                                                                      \n",
+       "                                                                                                                 \n",
+       " ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ \n",
+       "  <chip.ChipDeviceCtrl.ChipDeviceController object at 0x78e55c7c3fa0>                                          \n",
+       " ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ \n",
+       "                                                                                                                 \n",
+       "                                           activeList = {                                                        \n",
+       "                                                            <chip.ChipDeviceCtrl.ChipDeviceController object at  \n",
+       "                                                        0x78e55c7c3fa0>                                          \n",
+       "                                                        }                                                        \n",
+       "                                              caIndex = 1                                                        \n",
+       "                                              devCtrl = c_void_p(132925546862080)                                \n",
+       "                                          fabricAdmin = <chip.FabricAdmin.FabricAdmin object at 0x78e55c7c3be0>  \n",
+       "                                             fabricId = 1                                                        \n",
+       "                                             isActive = True                                                     \n",
+       "                                                 name = 'caIndex(1)/fabricId(0x0000000000000001)/nodeId(0x00000… \n",
+       "                                               nodeId = 112233                                                   \n",
+       "                                      pairingDelegate = c_void_p(132925546882384)                                \n",
+       "                   cbHandleCommissioningCompleteFunct = def cbHandleCommissioningCompleteFunct(...)              \n",
+       "                    cbHandleDeviceUnpairCompleteFunct = def cbHandleDeviceUnpairCompleteFunct(...)               \n",
+       "                             cbHandleFabricCheckFunct = def cbHandleFabricCheckFunct(...)                        \n",
+       "                      cbHandleOpenWindowCompleteFunct = def cbHandleOpenWindowCompleteFunct(...)                 \n",
+       "               cbHandlePASEEstablishmentCompleteFunct = def cbHandlePASEEstablishmentCompleteFunct(...)          \n",
+       "                                        CheckIsActive = def CheckIsActive():                                     \n",
+       "                                 CheckStageSuccessful = def CheckStageSuccessful(stage: 'int'):                  \n",
+       "                       CheckTestCommissionerCallbacks = def CheckTestCommissionerCallbacks():                    \n",
+       "                  CheckTestCommissionerPaseConnection = def CheckTestCommissionerPaseConnection(nodeid):         \n",
+       "                                   CloseBLEConnection = def CloseBLEConnection():                                \n",
+       "                                         CloseSession = def CloseSession(nodeid):                                \n",
+       "                                           Commission = async def Commission(nodeid) -> 'int':                   \n",
+       "                                                        Start the auto-commissioning process on a node after     \n",
+       "                                                        establishing a PASE connection.                          \n",
+       "                                                        This function is intended to be used in conjunction with \n",
+       "                                                        `EstablishPASESessionBLE` or                             \n",
+       "                                                        `EstablishPASESessionIP`. It can be called either before \n",
+       "                                                        or after the DevicePairingDelegate                       \n",
+       "                                                        receives the OnPairingComplete call. Commissioners that  \n",
+       "                                                        want to perform simple                                   \n",
+       "                                                        auto-commissioning should use the supplied               \n",
+       "                                                        \"CommissionWithCode\" function, which will                \n",
+       "                                                        establish the PASE connection and commission             \n",
+       "                                                        automatically.                                           \n",
+       "                                                                                                                 \n",
+       "                                                        Raises a ChipStackError on failure.                      \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - Effective Node ID of the device (as defined by the \n",
+       "                                                        assigned NOC)                                            \n",
+       "                          CommissioningWindowPasscode = class CommissioningWindowPasscode(value, names=None, *,  \n",
+       "                                                        module=None, qualname=None, type=None, start=1): An      \n",
+       "                                                        enumeration.                                             \n",
+       "                                         CommissionIP = async def CommissionIP(ipaddr: 'str', setupPinCode:      \n",
+       "                                                        'int', nodeid: 'int') -> 'int':                          \n",
+       "                                                        DEPRECATED, DO NOT USE! Use `CommissionOnNetwork` or     \n",
+       "                                                        `CommissionWithCode`                                     \n",
+       "                                                                                                                 \n",
+       "                                                        Raises a ChipStackError on failure.                      \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - Effective Node ID of the device (as defined by the \n",
+       "                                                        assigned NOC)                                            \n",
+       "                                  CommissionOnNetwork = async def CommissionOnNetwork(nodeId: 'int',             \n",
+       "                                                        setupPinCode: 'int', filterType: 'DiscoveryFilterType' = \n",
+       "                                                        <FilterType.NONE: 0>, filter: 'typing.Any' = None,       \n",
+       "                                                        discoveryTimeoutMsec: 'int' = 30000) -> 'int':           \n",
+       "                                                        Does the routine for OnNetworkCommissioning, with a      \n",
+       "                                                        filter for mDNS discovery.                               \n",
+       "                                                        Supported filters are:                                   \n",
+       "                                                                                                                 \n",
+       "                                                            DiscoveryFilterType.NONE                             \n",
+       "                                                            DiscoveryFilterType.SHORT_DISCRIMINATOR              \n",
+       "                                                            DiscoveryFilterType.LONG_DISCRIMINATOR               \n",
+       "                                                            DiscoveryFilterType.VENDOR_ID                        \n",
+       "                                                            DiscoveryFilterType.DEVICE_TYPE                      \n",
+       "                                                            DiscoveryFilterType.COMMISSIONING_MODE               \n",
+       "                                                            DiscoveryFilterType.INSTANCE_NAME                    \n",
+       "                                                            DiscoveryFilterType.COMMISSIONER                     \n",
+       "                                                            DiscoveryFilterType.COMPRESSED_FABRIC_ID             \n",
+       "                                                                                                                 \n",
+       "                                                        The filter can be an integer, a string or None depending \n",
+       "                                                        on the actual type of selected filter.                   \n",
+       "                                                                                                                 \n",
+       "                                                        Raises a ChipStackError on failure.                      \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - Effective Node ID of the device (as defined by the \n",
+       "                                                        assigned NOC)                                            \n",
+       "                                     CommissionThread = async def CommissionThread(discriminator, setupPinCode,  \n",
+       "                                                        nodeId, threadOperationalDataset: 'bytes',               \n",
+       "                                                        isShortDiscriminator: 'bool' = False) -> 'int':          \n",
+       "                                                        Commissions a Thread device over BLE                     \n",
+       "                                       CommissionWiFi = async def CommissionWiFi(discriminator, setupPinCode,    \n",
+       "                                                        nodeId, ssid: 'str', credentials: 'str',                 \n",
+       "                                                        isShortDiscriminator: 'bool' = False) -> 'int':          \n",
+       "                                                        Commissions a Wi-Fi device over BLE.                     \n",
+       "                                   CommissionWithCode = async def CommissionWithCode(setupPayload: 'str',        \n",
+       "                                                        nodeid: 'int', discoveryType: 'DiscoveryType' =          \n",
+       "                                                        <DiscoveryType.DISCOVERY_ALL: 2>) -> 'int':              \n",
+       "                                                        Commission with the given nodeid from the setupPayload.  \n",
+       "                                                            setupPayload may be a QR or manual code.             \n",
+       "                                                                                                                 \n",
+       "                                                            Raises a ChipStackError on failure.                  \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - Effective Node ID of the device (as defined by the \n",
+       "                                                        assigned NOC)                                            \n",
+       "                              ComputeRoundTripTimeout = def ComputeRoundTripTimeout(nodeid,                      \n",
+       "                                                        upperLayerProcessingTimeoutMs: 'int' = 0):               \n",
+       "                                                        Returns a computed timeout value based on the round-trip \n",
+       "                                                        time it takes for the peer at the other end of the       \n",
+       "                                                        session to                                               \n",
+       "                                                        receive a message, process it and send it back. This is  \n",
+       "                                                        computed based on the session type, the type of          \n",
+       "                                                        transport,                                               \n",
+       "                                                        sleepy characteristics of the target and a               \n",
+       "                                                        caller-provided value for the time it takes to process a \n",
+       "                                                        message                                                  \n",
+       "                                                        at the upper layer on the target For group sessions.     \n",
+       "                                                                                                                 \n",
+       "                                                        This will result in a session being established if one   \n",
+       "                                                        wasn't already.                                          \n",
+       "                                           ConnectBLE = async def ConnectBLE(discriminator: 'int', setupPinCode: \n",
+       "                                                        'int', nodeid: 'int', isShortDiscriminator: 'bool' =     \n",
+       "                                                        False) -> 'int':                                         \n",
+       "                                                        Connect to a BLE device using the given discriminator    \n",
+       "                                                        and setup pin code.                                      \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - Effective Node ID of the device (as defined by the \n",
+       "                                                        assigned NOC)                                            \n",
+       "                                     CreateManualCode = def CreateManualCode(discriminator: 'int', passcode:     \n",
+       "                                                        'int') -> 'str': Creates a standard flow manual code     \n",
+       "                                                        from the given discriminator and passcode.               \n",
+       "                               DisableICDRegistration = def DisableICDRegistration(): Disables ICD registration. \n",
+       "                          DiscoverCommissionableNodes = async def DiscoverCommissionableNodes(filterType:        \n",
+       "                                                        'discovery.FilterType' = <FilterType.NONE: 0>, filter:   \n",
+       "                                                        'typing.Any' = None, stopOnFirst: 'bool' = False,        \n",
+       "                                                        timeoutSecond: 'int' = 5) -> 'typing.Union[None,         \n",
+       "                                                        CommissionableNode, typing.List[CommissionableNode]]':   \n",
+       "                                                        Discover commissionable nodes via DNS-SD with specified  \n",
+       "                                                        filters.                                                 \n",
+       "                                                        Supported filters are:                                   \n",
+       "                                                                                                                 \n",
+       "                                                            discovery.FilterType.NONE                            \n",
+       "                                                            discovery.FilterType.SHORT_DISCRIMINATOR             \n",
+       "                                                            discovery.FilterType.LONG_DISCRIMINATOR              \n",
+       "                                                            discovery.FilterType.VENDOR_ID                       \n",
+       "                                                            discovery.FilterType.DEVICE_TYPE                     \n",
+       "                                                            discovery.FilterType.COMMISSIONING_MODE              \n",
+       "                                                            discovery.FilterType.INSTANCE_NAME                   \n",
+       "                                                            discovery.FilterType.COMMISSIONER                    \n",
+       "                                                            discovery.FilterType.COMPRESSED_FABRIC_ID            \n",
+       "                                                                                                                 \n",
+       "                                                        This function will always return a list of               \n",
+       "                                                        CommissionableDevice. When stopOnFirst is set,           \n",
+       "                                                        this function will return when at least one device is    \n",
+       "                                                        discovered or on timeout.                                \n",
+       "                                EnableICDRegistration = def EnableICDRegistration(parameters:                    \n",
+       "                                                        'ICDRegistrationParameters'):                            \n",
+       "                                                        Enables ICD registration for the following commissioning \n",
+       "                                                        session.                                                 \n",
+       "                                                                                                                 \n",
+       "                                                        Args:                                                    \n",
+       "                                                            parameters: A ICDRegistrationParameters for the      \n",
+       "                                                        parameters used for ICD registration, or None for        \n",
+       "                                                        default arguments.                                       \n",
+       "                                 EstablishPASESession = async def EstablishPASESession(setUpCode: 'str', nodeid: \n",
+       "                                                        'int') -> 'None':                                        \n",
+       "                              EstablishPASESessionBLE = async def EstablishPASESessionBLE(setupPinCode: 'int',   \n",
+       "                                                        discriminator: 'int', nodeid: 'int') -> 'None':          \n",
+       "                               EstablishPASESessionIP = async def EstablishPASESessionIP(ipaddr: 'str',          \n",
+       "                                                        setupPinCode: 'int', nodeid: 'int', port: 'int' = 0) ->  \n",
+       "                                                        'None':                                                  \n",
+       "                                       ExpireSessions = def ExpireSessions(nodeid):                              \n",
+       "                                                        Close all sessions with `nodeid` (if any existed) so     \n",
+       "                                                        that sessions get re-established.                        \n",
+       "                                                                                                                 \n",
+       "                                                        This is needed to properly handle operations that        \n",
+       "                                                        invalidate a node's state, such as                       \n",
+       "                                                        UpdateNOC.                                               \n",
+       "                                                                                                                 \n",
+       "                                                        WARNING: ONLY CALL THIS IF YOU UNDERSTAND THE            \n",
+       "                                                        SIDE-EFFECTS                                             \n",
+       "                           FindOrEstablishPASESession = async def FindOrEstablishPASESession(setupCode: 'str',   \n",
+       "                                                        nodeid: 'int', timeoutMs: 'typing.Optional[int]' = None) \n",
+       "                                                        -> 'typing.Optional[DeviceProxyWrapper]': Returns        \n",
+       "                                                        CommissioneeDeviceProxy if we can find or establish a    \n",
+       "                                                        PASE connection to the specified device                  \n",
+       "                    GenerateICDRegistrationParameters = def GenerateICDRegistrationParameters(): Generates ICD   \n",
+       "                                                        registration parameters for this controller.             \n",
+       "                                    GetAddressAndPort = def GetAddressAndPort(nodeid):                           \n",
+       "                                    GetClusterHandler = def GetClusterHandler():                                 \n",
+       "                                GetCompressedFabricId = def GetCompressedFabricId():                             \n",
+       "                                   GetConnectedDevice = async def GetConnectedDevice(nodeid, allowPASE: 'bool' = \n",
+       "                                                        True, timeoutMs: 'typing.Optional[int]' = None,          \n",
+       "                                                        payloadCapability: 'int' = 0):                           \n",
+       "                                                        Gets an OperationalDeviceProxy or                        \n",
+       "                                                        CommissioneeDeviceProxy for the specified Node.          \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Target's Node ID                                 \n",
+       "                                                        allowPASE: Get a device proxy of a device being          \n",
+       "                                                        commissioned.                                            \n",
+       "                                                        timeoutMs: Timeout for a timed invoke request. Omit or   \n",
+       "                                                        set to 'None' to indicate a non-timed request.           \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - DeviceProxyWrapper on success                      \n",
+       "                               GetConnectedDeviceSync = def GetConnectedDeviceSync(nodeid, allowPASE=True,       \n",
+       "                                                        timeoutMs: 'typing.Optional[int]' = None,                \n",
+       "                                                        payloadCapability: 'int' = 0):                           \n",
+       "                                                        Gets an OperationalDeviceProxy or                        \n",
+       "                                                        CommissioneeDeviceProxy for the specified Node.          \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Target's Node ID                                 \n",
+       "                                                        allowPASE: Get a device proxy of a device being          \n",
+       "                                                        commissioned.                                            \n",
+       "                                                        timeoutMs: Timeout for a timed invoke request. Omit or   \n",
+       "                                                        set to 'None' to indicate a non-timed request.           \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - DeviceProxyWrapper on success                      \n",
+       "                                 GetDiscoveredDevices = async def GetDiscoveredDevices():                        \n",
+       "                                 GetFabricCheckResult = def GetFabricCheckResult() -> 'int': Returns the fabric  \n",
+       "                                                        check result if SetCheckMatchingFabric was used.         \n",
+       "                                  GetFabricIdInternal = def GetFabricIdInternal(): Get the fabric ID from the    \n",
+       "                                                        object. Only used to validate cached value from          \n",
+       "                                                        property.                                                \n",
+       "                               GetFabricIndexInternal = def GetFabricIndexInternal(): Get the fabric index from  \n",
+       "                                                        the object. Only used to validate cached value from      \n",
+       "                                                        property.                                                \n",
+       "                             GetIPForDiscoveredDevice = def GetIPForDiscoveredDevice(idx, addrStr, length):      \n",
+       "                                    GetNodeIdInternal = def GetNodeIdInternal() -> 'int': Get the node ID from   \n",
+       "                                                        the object. Only used to validate cached value from      \n",
+       "                                                        property.                                                \n",
+       "                           GetRemoteSessionParameters = def GetRemoteSessionParameters(nodeid) ->                \n",
+       "                                                        'typing.Optional[SessionParameters]':                    \n",
+       "                                                        Returns the SessionParameters of reported by the remote  \n",
+       "                                                        node associated with `nodeid`.                           \n",
+       "                                                        If there is some error in getting SessionParameters None \n",
+       "                                                        is returned.                                             \n",
+       "                                                                                                                 \n",
+       "                                                        This will result in a session being established if one   \n",
+       "                                                        wasn't already established.                              \n",
+       "                              GetTestCommissionerUsed = def GetTestCommissionerUsed():                           \n",
+       "                                 InitGroupTestingData = def InitGroupTestingData(): Populates the Device         \n",
+       "                                                        Controller's GroupDataProvider with known test group     \n",
+       "                                                        info and keys.                                           \n",
+       "                                          IsConnected = def IsConnected():                                       \n",
+       "                                        IssueNOCChain = async def IssueNOCChain(csr:                             \n",
+       "                                                        'Clusters.OperationalCredentials.Commands.CSRResponse',  \n",
+       "                                                        nodeId: 'int'):                                          \n",
+       "                                                        Issue an NOC chain using the associated                  \n",
+       "                                                        OperationalCredentialsDelegate.                          \n",
+       "                                                        The NOC chain will be provided in TLV cert format.       \n",
+       "                                     NOCChainCallback = def NOCChainCallback(nocChain):                          \n",
+       "                              OpenCommissioningWindow = async def OpenCommissioningWindow(nodeid: 'int',         \n",
+       "                                                        timeout: 'int', iteration: 'int', discriminator: 'int',  \n",
+       "                                                        option: 'CommissioningWindowPasscode') ->                \n",
+       "                                                        'CommissioningParameters':                               \n",
+       "                                                        Opens a commissioning window on the device with the      \n",
+       "                                                        given nodeid.                                            \n",
+       "                                                        nodeid:        Node id of the device                     \n",
+       "                                                        timeout:       Command timeout                           \n",
+       "                                                        iteration:     The PAKE iteration count associated with  \n",
+       "                                                        the PAKE Passcode ID and ephemeral                       \n",
+       "                                                                       PAKE passcode verifier to be used for     \n",
+       "                                                        this commissioning. Valid range: 1000 - 100000           \n",
+       "                                                                       Ignored if option == 0                    \n",
+       "                                                        discriminator: The long discriminator for the DNS-SD     \n",
+       "                                                        advertisement. Valid range: 0-4095                       \n",
+       "                                                                       Ignored if option == 0                    \n",
+       "                                                        option:        0 = kOriginalSetupCode                    \n",
+       "                                                                       1 = kTokenWithRandomPIN                   \n",
+       "                                                                                                                 \n",
+       "                                                        Returns CommissioningParameters                          \n",
+       "                                                 Read = async def Read(nodeid: 'int', attributes:                \n",
+       "                                                        'typing.Optional[typing.List[typing.Union[None,          \n",
+       "                                                        typing.Tuple[int],                                       \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.Cluster]],       \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.ClusterAttribut… \n",
+       "                                                        typing.Tuple[int, typing.Type[ClusterObjects.Cluster]],  \n",
+       "                                                        typing.Tuple[int,                                        \n",
+       "                                                        typing.Type[ClusterObjects.ClusterAttributeDescriptor]], \n",
+       "                                                        ClusterAttribute.AttributePath]]]' = None,               \n",
+       "                                                        dataVersionFilters:                                      \n",
+       "                                                        'typing.Optional[typing.List[typing.Tuple[int,           \n",
+       "                                                        typing.Type[ClusterObjects.Cluster], int]]]' = None,     \n",
+       "                                                        events: 'typing.Optional[typing.List[typing.Union[None,  \n",
+       "                                                        typing.Tuple[str, int], typing.Tuple[int, int],          \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.Cluster], int],  \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.ClusterEvent],   \n",
+       "                                                        int], typing.Tuple[int,                                  \n",
+       "                                                        typing.Type[ClusterObjects.Cluster], int],               \n",
+       "                                                        typing.Tuple[int,                                        \n",
+       "                                                        typing.Type[ClusterObjects.ClusterEvent], int]]]]' =     \n",
+       "                                                        None, eventNumberFilter: 'typing.Optional[int]' = None,  \n",
+       "                                                        returnClusterObject: 'bool' = False, reportInterval:     \n",
+       "                                                        'typing.Optional[typing.Tuple[int, int]]' = None,        \n",
+       "                                                        fabricFiltered: 'bool' = True, keepSubscriptions: 'bool' \n",
+       "                                                        = False, autoResubscribe: 'bool' = True,                 \n",
+       "                                                        payloadCapability: 'int' = 0):                           \n",
+       "                                                        Read a list of attributes and/or events from a target    \n",
+       "                                                        node                                                     \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Target's Node ID                                 \n",
+       "                                                        attributes: A list of tuples of varying types depending  \n",
+       "                                                        on the type of read being requested:                     \n",
+       "                                                            (endpoint, Clusters.ClusterA.AttributeA):   Endpoint \n",
+       "                                                        = specific,    Cluster = specific,   Attribute =         \n",
+       "                                                        specific                                                 \n",
+       "                                                            (endpoint, Clusters.ClusterA):              Endpoint \n",
+       "                                                        = specific,    Cluster = specific,   Attribute = *       \n",
+       "                                                            (Clusters.ClusterA.AttributeA):             Endpoint \n",
+       "                                                        = *,           Cluster = specific,   Attribute =         \n",
+       "                                                        specific                                                 \n",
+       "                                                            endpoint:                                   Endpoint \n",
+       "                                                        = specific,    Cluster = *,          Attribute = *       \n",
+       "                                                            Clusters.ClusterA:                          Endpoint \n",
+       "                                                        = *,           Cluster = specific,   Attribute = *       \n",
+       "                                                            '*' or ():                                  Endpoint \n",
+       "                                                        = *,           Cluster = *,          Attribute = *       \n",
+       "                                                                                                                 \n",
+       "                                                            The cluster and attributes specified above are to be \n",
+       "                                                        selected from the generated cluster objects.             \n",
+       "                                                                                                                 \n",
+       "                                                            e.g.                                                 \n",
+       "                                                                ReadAttribute(1, [ 1 ] ) -- case 4 above.        \n",
+       "                                                                ReadAttribute(1, [ Clusters.BasicInformation ] ) \n",
+       "                                                        -- case 5 above.                                         \n",
+       "                                                                ReadAttribute(1, [ (1,                           \n",
+       "                                                        Clusters.BasicInformation.Attributes.Location ] ) --     \n",
+       "                                                        case 1 above.                                            \n",
+       "                                                                                                                 \n",
+       "                                                            An AttributePath can also be specified directly by   \n",
+       "                                                        [chip.cluster.Attribute.AttributePath(...)]              \n",
+       "                                                                                                                 \n",
+       "                                                        dataVersionFilters: A list of tuples of (endpoint,       \n",
+       "                                                        cluster, data version).                                  \n",
+       "                                                                                                                 \n",
+       "                                                        events: A list of tuples of varying types depending on   \n",
+       "                                                        the type of read being requested:                        \n",
+       "                                                            (endpoint, Clusters.ClusterA.EventA, urgent):        \n",
+       "                                                        Endpoint = specific,                                     \n",
+       "                                                         \n",
+       "                                                        = specific,   Event = specific, Urgent = True/False      \n",
+       "                                                            (endpoint, Clusters.ClusterA, urgent):               \n",
+       "                                                        Endpoint = specific,                                     \n",
+       "                                                         \n",
+       "                                                        = specific,   Event = *, Urgent = True/False             \n",
+       "                                                            (Clusters.ClusterA.EventA, urgent):                  \n",
+       "                                                        Endpoint = *,                                            \n",
+       "                                                         \n",
+       "                                                        = specific,   Event = specific, Urgent = True/False      \n",
+       "                                                            endpoint:                                   Endpoint \n",
+       "                                                        = specific,    Cluster = *,          Event = *, Urgent = \n",
+       "                                                        True/False                                               \n",
+       "                                                            Clusters.ClusterA:                          Endpoint \n",
+       "                                                        = *,          Cluster = specific,    Event = *, Urgent = \n",
+       "                                                        True/False                                               \n",
+       "                                                            '*' or ():                                  Endpoint \n",
+       "                                                        = *,          Cluster = *,          Event = *, Urgent =  \n",
+       "                                                        True/False                                               \n",
+       "                                                                                                                 \n",
+       "                                                        eventNumberFilter: Optional minimum event number filter. \n",
+       "                                                                                                                 \n",
+       "                                                        returnClusterObject: This returns the data as            \n",
+       "                                                        consolidated cluster objects, with all attributes for a  \n",
+       "                                                        cluster inside                                           \n",
+       "                                                                             a single cluster-wide cluster       \n",
+       "                                                        object.                                                  \n",
+       "                                                                                                                 \n",
+       "                                                        reportInterval: A tuple of two int-s for                 \n",
+       "                                                        (MinIntervalFloor, MaxIntervalCeiling). Used by          \n",
+       "                                                        establishing subscriptions.                              \n",
+       "                                                            When not provided, a read request will be sent.      \n",
+       "                                                        fabricFiltered: If True (default), the read/subscribe is \n",
+       "                                                        fabric-filtered and will only see things associated with \n",
+       "                                                        the fabric                                               \n",
+       "                                                            of the reader/subscriber. Relevant for attributes    \n",
+       "                                                        with fabric-scoped data.                                 \n",
+       "                                                        keepSubscriptions: Keep existing subscriptions. If set   \n",
+       "                                                        to False, existing subscriptions with this node will get \n",
+       "                                                        cancelled                                                \n",
+       "                                                            and a new one gets setup.                            \n",
+       "                                                        autoResubscribe: Automatically resubscribe to the        \n",
+       "                                                        subscription if subscription is lost. The automatic      \n",
+       "                                                        re-subscription only                                     \n",
+       "                                                            applies if the subscription establishes on first     \n",
+       "                                                        try. If the first subscription establishment attempt     \n",
+       "                                                        fails the function                                       \n",
+       "                                                            returns right away.                                  \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - AsyncReadTransaction.ReadResponse. Please see      \n",
+       "                                                        ReadAttribute and ReadEvent for examples of how to       \n",
+       "                                                        access data.                                             \n",
+       "                                                                                                                 \n",
+       "                                                        Raises:                                                  \n",
+       "                                                            - InteractionModelError (chip.interaction_model) on  \n",
+       "                                                        error                                                    \n",
+       "                                        ReadAttribute = async def ReadAttribute(nodeid: 'int', attributes:       \n",
+       "                                                        'typing.Optional[typing.List[typing.Union[None,          \n",
+       "                                                        typing.Tuple[int],                                       \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.Cluster]],       \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.ClusterAttribut… \n",
+       "                                                        typing.Tuple[int, typing.Type[ClusterObjects.Cluster]],  \n",
+       "                                                        typing.Tuple[int,                                        \n",
+       "                                                        typing.Type[ClusterObjects.ClusterAttributeDescriptor]], \n",
+       "                                                        ClusterAttribute.AttributePath]]]', dataVersionFilters:  \n",
+       "                                                        'typing.Optional[typing.List[typing.Tuple[int,           \n",
+       "                                                        typing.Type[ClusterObjects.Cluster], int]]]' = None,     \n",
+       "                                                        returnClusterObject: 'bool' = False, reportInterval:     \n",
+       "                                                        'typing.Optional[typing.Tuple[int, int]]' = None,        \n",
+       "                                                        fabricFiltered: 'bool' = True, keepSubscriptions: 'bool' \n",
+       "                                                        = False, autoResubscribe: 'bool' = True,                 \n",
+       "                                                        payloadCapability: 'int' = 0):                           \n",
+       "                                                        Read a list of attributes from a target node, this is a  \n",
+       "                                                        wrapper of DeviceController.Read()                       \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Target's Node ID                                 \n",
+       "                                                        attributes: A list of tuples of varying types depending  \n",
+       "                                                        on the type of read being requested:                     \n",
+       "                                                            (endpoint, Clusters.ClusterA.AttributeA):   Endpoint \n",
+       "                                                        = specific,    Cluster = specific,   Attribute =         \n",
+       "                                                        specific                                                 \n",
+       "                                                            (endpoint, Clusters.ClusterA):              Endpoint \n",
+       "                                                        = specific,    Cluster = specific,   Attribute = *       \n",
+       "                                                            (Clusters.ClusterA.AttributeA):             Endpoint \n",
+       "                                                        = *,           Cluster = specific,   Attribute =         \n",
+       "                                                        specific                                                 \n",
+       "                                                            endpoint:                                   Endpoint \n",
+       "                                                        = specific,    Cluster = *,          Attribute = *       \n",
+       "                                                            Clusters.ClusterA:                          Endpoint \n",
+       "                                                        = *,           Cluster = specific,   Attribute = *       \n",
+       "                                                            '*' or ():                                  Endpoint \n",
+       "                                                        = *,           Cluster = *,          Attribute = *       \n",
+       "                                                                                                                 \n",
+       "                                                            The cluster and attributes specified above are to be \n",
+       "                                                        selected from the generated cluster objects.             \n",
+       "                                                                                                                 \n",
+       "                                                            e.g.                                                 \n",
+       "                                                                ReadAttribute(1, [ 1 ] ) -- case 4 above.        \n",
+       "                                                                ReadAttribute(1, [ Clusters.BasicInformation ] ) \n",
+       "                                                        -- case 5 above.                                         \n",
+       "                                                                ReadAttribute(1, [ (1,                           \n",
+       "                                                        Clusters.BasicInformation.Attributes.Location ] ) --     \n",
+       "                                                        case 1 above.                                            \n",
+       "                                                                                                                 \n",
+       "                                                            An AttributePath can also be specified directly by   \n",
+       "                                                        [chip.cluster.Attribute.AttributePath(...)]              \n",
+       "                                                                                                                 \n",
+       "                                                        returnClusterObject: This returns the data as            \n",
+       "                                                        consolidated cluster objects, with all attributes for a  \n",
+       "                                                        cluster inside                                           \n",
+       "                                                                             a single cluster-wide cluster       \n",
+       "                                                        object.                                                  \n",
+       "                                                                                                                 \n",
+       "                                                        reportInterval: A tuple of two int-s for                 \n",
+       "                                                        (MinIntervalFloor, MaxIntervalCeiling). Used by          \n",
+       "                                                        establishing subscriptions.                              \n",
+       "                                                            When not provided, a read request will be sent.      \n",
+       "                                                        fabricFiltered: If True (default), the read/subscribe is \n",
+       "                                                        fabric-filtered and will only see things associated with \n",
+       "                                                        the fabric                                               \n",
+       "                                                            of the reader/subscriber. Relevant for attributes    \n",
+       "                                                        with fabric-scoped data.                                 \n",
+       "                                                        keepSubscriptions: Keep existing subscriptions. If set   \n",
+       "                                                        to False, existing subscriptions with this node will get \n",
+       "                                                        cancelled                                                \n",
+       "                                                            and a new one gets setup.                            \n",
+       "                                                        autoResubscribe: Automatically resubscribe to the        \n",
+       "                                                        subscription if subscription is lost. The automatic      \n",
+       "                                                        re-subscription only                                     \n",
+       "                                                            applies if the subscription establishes on first     \n",
+       "                                                        try. If the first subscription establishment attempt     \n",
+       "                                                        fails the function                                       \n",
+       "                                                            returns right away.                                  \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - subscription request:                              \n",
+       "                                                        ClusterAttribute.SubscriptionTransaction                 \n",
+       "                                                                                    To get notified on attribute \n",
+       "                                                        change use SetAttributeUpdateCallback on the returned    \n",
+       "                                                                                    SubscriptionTransaction.     \n",
+       "                                                        This is used to set a callback function, which is a      \n",
+       "                                                        callable of                                              \n",
+       "                                                                                    type                         \n",
+       "                                                        Callable[[TypedAttributePath, SubscriptionTransaction],  \n",
+       "                                                        None]                                                    \n",
+       "                                                                                    Get the attribute value from \n",
+       "                                                        the change path using GetAttribute on the                \n",
+       "                                                        SubscriptionTransaction                                  \n",
+       "                                                                                    You can await changes in the \n",
+       "                                                        main loop using a trigger mechanism from the callback.   \n",
+       "                                                                                    ex. queue.SimpleQueue        \n",
+       "                                                                                                                 \n",
+       "                                                            - read request:                                      \n",
+       "                                                        AsyncReadTransaction.ReadResponse.attributes.            \n",
+       "                                                                            This is of type                      \n",
+       "                                                        AttributeCache.attributeCache (Attribute.py),            \n",
+       "                                                                            which is a dict mapping endpoints to \n",
+       "                                                        a list of Cluster (ClusterObjects.py) classes            \n",
+       "                                                                            (dict[int, List[Cluster]])           \n",
+       "                                                                            Access as                            \n",
+       "                                                        returned_object[endpoint_id][<Cluster class>][<Attribute \n",
+       "                                                        class>]                                                  \n",
+       "                                                                            Ex. To access the OnTime attribute   \n",
+       "                                                        from the OnOff cluster on endpoint 1                     \n",
+       "                                                                            returned_object[1][Clusters.OnOff][ \n",
+       "                                                                                                                 \n",
+       "                                                        Raises:                                                  \n",
+       "                                                            - InteractionModelError (chip.interaction_model) on  \n",
+       "                                                        error                                                    \n",
+       "                                            ReadEvent = async def ReadEvent(nodeid: 'int', events:               \n",
+       "                                                        'typing.List[typing.Union[None, typing.Tuple[str, int],  \n",
+       "                                                        typing.Tuple[int, int],                                  \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.Cluster], int],  \n",
+       "                                                        typing.Tuple[typing.Type[ClusterObjects.ClusterEvent],   \n",
+       "                                                        int], typing.Tuple[int,                                  \n",
+       "                                                        typing.Type[ClusterObjects.Cluster], int],               \n",
+       "                                                        typing.Tuple[int,                                        \n",
+       "                                                        typing.Type[ClusterObjects.ClusterEvent], int]]]',       \n",
+       "                                                        eventNumberFilter: 'typing.Optional[int]' = None,        \n",
+       "                                                        fabricFiltered: 'bool' = True, reportInterval:           \n",
+       "                                                        'typing.Optional[typing.Tuple[int, int]]' = None,        \n",
+       "                                                        keepSubscriptions: 'bool' = False, autoResubscribe:      \n",
+       "                                                        'bool' = True, payloadCapability: 'int' = 0):            \n",
+       "                                                        Read a list of events from a target node, this is a      \n",
+       "                                                        wrapper of DeviceController.Read()                       \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Target's Node ID                                 \n",
+       "                                                        events: A list of tuples of varying types depending on   \n",
+       "                                                        the type of read being requested:                        \n",
+       "                                                            (endpoint, Clusters.ClusterA.EventA, urgent):        \n",
+       "                                                        Endpoint = specific,                                     \n",
+       "                                                         \n",
+       "                                                        = specific,   Event = specific, Urgent = True/False      \n",
+       "                                                            (endpoint, Clusters.ClusterA, urgent):               \n",
+       "                                                        Endpoint = specific,                                     \n",
+       "                                                         \n",
+       "                                                        = specific,   Event = *, Urgent = True/False             \n",
+       "                                                            (Clusters.ClusterA.EventA, urgent):                  \n",
+       "                                                        Endpoint = *,                                            \n",
+       "                                                         \n",
+       "                                                        = specific,   Event = specific, Urgent = True/False      \n",
+       "                                                            endpoint:                                   Endpoint \n",
+       "                                                        = specific,    Cluster = *,          Event = *, Urgent = \n",
+       "                                                        True/False                                               \n",
+       "                                                            Clusters.ClusterA:                          Endpoint \n",
+       "                                                        = *,          Cluster = specific,    Event = *, Urgent = \n",
+       "                                                        True/False                                               \n",
+       "                                                            '*' or ():                                  Endpoint \n",
+       "                                                        = *,          Cluster = *,          Event = *, Urgent =  \n",
+       "                                                        True/False                                               \n",
+       "                                                                                                                 \n",
+       "                                                        The cluster and events specified above are to be         \n",
+       "                                                        selected from the generated cluster objects.             \n",
+       "                                                                                                                 \n",
+       "                                                        e.g.                                                     \n",
+       "                                                            ReadEvent(1, [ 1 ] ) -- case 4 above.                \n",
+       "                                                            ReadEvent(1, [ Clusters.BasicInformation ] ) -- case \n",
+       "                                                        5 above.                                                 \n",
+       "                                                            ReadEvent(1, [ (1,                                   \n",
+       "                                                        Clusters.BasicInformation.Events.Location ] ) -- case 1  \n",
+       "                                                        above.                                                   \n",
+       "                                                                                                                 \n",
+       "                                                        eventNumberFilter: Optional minimum event number filter. \n",
+       "                                                        reportInterval: A tuple of two int-s for                 \n",
+       "                                                        (MinIntervalFloor, MaxIntervalCeiling). Used by          \n",
+       "                                                        establishing subscriptions.                              \n",
+       "                                                            When not provided, a read request will be sent.      \n",
+       "                                                        keepSubscriptions: Keep existing subscriptions. If set   \n",
+       "                                                        to False, existing subscriptions with this node will get \n",
+       "                                                        cancelled                                                \n",
+       "                                                            and a new one gets setup.                            \n",
+       "                                                        autoResubscribe: Automatically resubscribe to the        \n",
+       "                                                        subscription if subscription is lost. The automatic      \n",
+       "                                                        re-subscription only                                     \n",
+       "                                                            applies if the subscription establishes on first     \n",
+       "                                                        try. If the first subscription establishment attempt     \n",
+       "                                                        fails the function                                       \n",
+       "                                                            returns right away.                                  \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - subscription request:                              \n",
+       "                                                        ClusterAttribute.SubscriptionTransaction                 \n",
+       "                                                                                    To get notified on event     \n",
+       "                                                        subscriptions, use the SetEventUpdateCallback function   \n",
+       "                                                        on the                                                   \n",
+       "                                                                                    returned                     \n",
+       "                                                        SubscriptionTransaction. This is a callable of type      \n",
+       "                                                                                    Callable[[EventReadResult,   \n",
+       "                                                        SubscriptionTransaction], None]                          \n",
+       "                                                                                    You can await events using a \n",
+       "                                                        trigger mechanism in the callback. ex. queue.SimpleQueue \n",
+       "                                                                                                                 \n",
+       "                                                            - read request:                                      \n",
+       "                                                        AsyncReadTransaction.ReadResponse.events.                \n",
+       "                                                                            This is a List[ClusterEvent].        \n",
+       "                                                                                                                 \n",
+       "                                                        Raises:                                                  \n",
+       "                                                            - InteractionModelError (chip.interaction_model) on  \n",
+       "                                                        error                                                    \n",
+       "                         ResetCommissioningParameters = def ResetCommissioningParameters(): Sets the             \n",
+       "                                                        commissioning parameters back to the default values.     \n",
+       "                                ResetTestCommissioner = def ResetTestCommissioner():                             \n",
+       "                                          ResolveNode = def ResolveNode(nodeid):                                 \n",
+       "                                    SendBatchCommands = async def SendBatchCommands(nodeid: 'int', commands:     \n",
+       "                                                        'typing.List[ClusterCommand.InvokeRequestInfo]',         \n",
+       "                                                        timedRequestTimeoutMs: 'typing.Optional[int]' = None,    \n",
+       "                                                        interactionTimeoutMs: 'typing.Optional[int]' = None,     \n",
+       "                                                        busyWaitMs: 'typing.Optional[int]' = None,               \n",
+       "                                                        suppressResponse: 'typing.Optional[bool]' = None,        \n",
+       "                                                        payloadCapability: 'int' = 0):                           \n",
+       "                                                        Send a batch of cluster-object encapsulated commands to  \n",
+       "                                                        a node and get returned a future that can be awaited     \n",
+       "                                                        upon to receive                                          \n",
+       "                                                        the responses. If a valid responseType is passed in,     \n",
+       "                                                        that will be used to de-serialize the object. If not,    \n",
+       "                                                        the type will be automatically deduced from the metadata \n",
+       "                                                        received over the wire.                                  \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Target's Node ID                                 \n",
+       "                                                        commands: A list of InvokeRequestInfo containing the     \n",
+       "                                                        commands to invoke.                                      \n",
+       "                                                        timedWriteTimeoutMs: Timeout for a timed invoke request. \n",
+       "                                                        Omit or set to 'None' to indicate a non-timed request.   \n",
+       "                                                        interactionTimeoutMs: Overall timeout for the            \n",
+       "                                                        interaction. Omit or set to 'None' to have the SDK       \n",
+       "                                                        automatically compute the                                \n",
+       "                                                                              right timeout value based on       \n",
+       "                                                        transport characteristics as well as the responsiveness  \n",
+       "                                                        of the target.                                           \n",
+       "                                                        busyWaitMs: How long to wait in ms after sending command \n",
+       "                                                        to device before performing any other operations.        \n",
+       "                                                        suppressResponse: Do not send a response to this action  \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - List of command responses in the same order as     \n",
+       "                                                        what was given in `commands`. The type of the response   \n",
+       "                                                        is defined by the command.                               \n",
+       "                                                                      - A value of `None` indicates success.     \n",
+       "                                                                      - If only a single command fails, for      \n",
+       "                                                        example with `UNSUPPORTED_COMMAND`, the corresponding    \n",
+       "                                                        index associated with the command will,                  \n",
+       "                                                                        contain                                  \n",
+       "                                                        `interaction_model.Status.UnsupportedCommand`.           \n",
+       "                                                                      - If a command is not responded to by      \n",
+       "                                                        server, command will contain                             \n",
+       "                                                        `interaction_model.Status.NoCommandResponse`             \n",
+       "                                                        Raises:                                                  \n",
+       "                                                            - InteractionModelError if error with sending of     \n",
+       "                                                        InvokeRequestMessage fails as a whole.                   \n",
+       "                                          SendCommand = async def SendCommand(nodeid: 'int', endpoint: 'int',    \n",
+       "                                                        payload: 'ClusterObjects.ClusterCommand',                \n",
+       "                                                        responseType=None, timedRequestTimeoutMs:                \n",
+       "                                                        'typing.Optional[int]' = None, interactionTimeoutMs:     \n",
+       "                                                        'typing.Optional[int]' = None, busyWaitMs:               \n",
+       "                                                        'typing.Optional[int]' = None, suppressResponse:         \n",
+       "                                                        'typing.Optional[bool]' = None, payloadCapability: 'int' \n",
+       "                                                        = 0):                                                    \n",
+       "                                                        Send a cluster-object encapsulated command to a node and \n",
+       "                                                        get returned a future that can be awaited upon to        \n",
+       "                                                        receive                                                  \n",
+       "                                                        the response. If a valid responseType is passed in, that \n",
+       "                                                        will be used to de-serialize the object. If not,         \n",
+       "                                                        the type will be automatically deduced from the metadata \n",
+       "                                                        received over the wire.                                  \n",
+       "                                                                                                                 \n",
+       "                                                        timedWriteTimeoutMs: Timeout for a timed invoke request. \n",
+       "                                                        Omit or set to 'None' to indicate a non-timed request.   \n",
+       "                                                        interactionTimeoutMs: Overall timeout for the            \n",
+       "                                                        interaction. Omit or set to 'None' to have the SDK       \n",
+       "                                                        automatically compute the                                \n",
+       "                                                                              right timeout value based on       \n",
+       "                                                        transport characteristics as well as the responsiveness  \n",
+       "                                                        of the target.                                           \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - command response. The type of the response is      \n",
+       "                                                        defined by the command.                                  \n",
+       "                                                        Raises:                                                  \n",
+       "                                                            - InteractionModelError on error                     \n",
+       "                                     SendGroupCommand = def SendGroupCommand(groupid: 'int', payload:            \n",
+       "                                                        'ClusterObjects.ClusterCommand', busyWaitMs:             \n",
+       "                                                        'typing.Optional[int]' = None):                          \n",
+       "                                                        Send a group cluster-object encapsulated command to a    \n",
+       "                                                        group_id and get returned a future                       \n",
+       "                                                        that can be awaited upon to get confirmation command was \n",
+       "                                                        sent.                                                    \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - None: responses are not sent to group commands     \n",
+       "                                                        Raises:                                                  \n",
+       "                                                            - InteractionModelError on error                     \n",
+       "                               SetCheckMatchingFabric = def SetCheckMatchingFabric(check: 'bool'): Instructs the \n",
+       "                                                        auto-commissioner to perform a matching fabric check     \n",
+       "                                                        before commissioning.                                    \n",
+       "                                        SetDefaultNTP = def SetDefaultNTP(defaultNTP: 'str'): Set the DefaultNTP \n",
+       "                                                        to set during commissioning                              \n",
+       "                                         SetDSTOffset = def SetDSTOffset(offset: 'int', validStarting: 'int',    \n",
+       "                                                        validUntil: 'int'): Set the DST offset to set during     \n",
+       "                                                        commissioning. Currently only one DST entry is supported \n",
+       "                                               SetIpk = def SetIpk(ipk: 'bytes'):                                \n",
+       "                         SetSkipCommissioningComplete = def                                                      \n",
+       "                                                        SetSkipCommissioningComplete(skipCommissioningComplete:  \n",
+       "                                                        'bool'): Set whether to skip the commissioning complete  \n",
+       "                                                        callback                                                 \n",
+       "                                SetTCAcknowledgements = def SetTCAcknowledgements(tcAcceptedVersion: 'int',      \n",
+       "                                                        tcUserResponse: 'int'): Set the TC acknowledgements to   \n",
+       "                                                        set during commissioning                                 \n",
+       "            SetTestCommissionerPrematureCompleteAfter = def SetTestCommissionerPrematureCompleteAfter(stage:     \n",
+       "                                                        'int'):                                                  \n",
+       "           SetTestCommissionerSimulateFailureOnReport = def SetTestCommissionerSimulateFailureOnReport(stage:    \n",
+       "                                                        'int'):                                                  \n",
+       "            SetTestCommissionerSimulateFailureOnStage = def SetTestCommissionerSimulateFailureOnStage(stage:     \n",
+       "                                                        'int'):                                                  \n",
+       "                          SetThreadOperationalDataset = def                                                      \n",
+       "                                                        SetThreadOperationalDataset(threadOperationalDataset):   \n",
+       "                                                        Set the Thread operational dataset to set during         \n",
+       "                                                        commissioning.                                           \n",
+       "                                          SetTimeZone = def SetTimeZone(offset: 'int', validAt: 'int', name:     \n",
+       "                                                        'str' = ''): Set the time zone to set during             \n",
+       "                                                        commissioning. Currently only one time zone entry is     \n",
+       "                                                        supported                                                \n",
+       "                                 SetTrustedTimeSource = def SetTrustedTimeSource(nodeId: 'int', endpoint:        \n",
+       "                                                        'int'): Set the trusted time source nodeId to set during \n",
+       "                                                        commissioning. This must be a node on the commissioner   \n",
+       "                                                        fabric.                                                  \n",
+       "                                   SetWiFiCredentials = def SetWiFiCredentials(ssid: 'str', credentials: 'str'): \n",
+       "                                                        Set the Wi-Fi credentials to set during commissioning.   \n",
+       "                                             Shutdown = def Shutdown():                                          \n",
+       "                                                        Shuts down this controller and reclaims any used         \n",
+       "                                                        resources, including the bound                           \n",
+       "                                                        C++ constructor instance in the SDK.                     \n",
+       "                                          ShutdownAll = def ShutdownAll(): Shut down all active controllers and  \n",
+       "                                                        reclaim any used resources.                              \n",
+       "                      TestOnlyPrepareToReceiveBdxData = def TestOnlyPrepareToReceiveBdxData() ->                 \n",
+       "                                                        'asyncio.Future':                                        \n",
+       "                                                        Sets up the system to expect a node to initiate a BDX    \n",
+       "                                                        transfer. The transfer will send data here.              \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - a future that will yield a BdxTransfer with the    \n",
+       "                                                        init message from the transfer.                          \n",
+       "                         TestOnlyPrepareToSendBdxData = def TestOnlyPrepareToSendBdxData(data: 'bytes') ->       \n",
+       "                                                        'asyncio.Future':                                        \n",
+       "                                                        Sets up the system to expect a node to initiate a BDX    \n",
+       "                                                        transfer. The transfer will send data to the node.       \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - a future that will yield a BdxTransfer with the    \n",
+       "                                                        init message from the transfer.                          \n",
+       "                            TestOnlySendBatchCommands = async def TestOnlySendBatchCommands(nodeid: 'int',       \n",
+       "                                                        commands:                                                \n",
+       "                                                        'typing.List[ClusterCommand.InvokeRequestInfo]',         \n",
+       "                                                        timedRequestTimeoutMs: 'typing.Optional[int]' = None,    \n",
+       "                                                        interactionTimeoutMs: 'typing.Optional[int]' = None,     \n",
+       "                                                        busyWaitMs: 'typing.Optional[int]' = None,               \n",
+       "                                                        suppressResponse: 'typing.Optional[bool]' = None,        \n",
+       "                                                        remoteMaxPathsPerInvoke: 'typing.Optional[int]' = None,  \n",
+       "                                                        suppressTimedRequestMessage: 'bool' = False,             \n",
+       "                                                        commandRefsOverride: 'typing.Optional[typing.List[int]]' \n",
+       "                                                        = None):                                                 \n",
+       "                                                        Please see SendBatchCommands for description.            \n",
+       "                                                        TestOnly overridable arguments:                          \n",
+       "                                                            remoteMaxPathsPerInvoke: Overrides the number of     \n",
+       "                                                        batch commands we think can be sent to remote node.      \n",
+       "                                                            suppressTimedRequestMessage: When set to true, we    \n",
+       "                                                        suppress sending Timed Request Message.                  \n",
+       "                                                            commandRefsOverride: List of commandRefs to use for  \n",
+       "                                                        each command with the same index in `commands`.          \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - TestOnlyBatchCommandResponse                       \n",
+       " TestOnlySendCommandTimedRequestFlagWithNoTimedInvoke = async def                                                \n",
+       "                                                        TestOnlySendCommandTimedRequestFlagWithNoTimedInvoke(no… \n",
+       "                                                        'int', endpoint: 'int', payload:                         \n",
+       "                                                        'ClusterObjects.ClusterCommand', responseType=None):     \n",
+       "                                                        Please see SendCommand for description.                  \n",
+       "                                         UnpairDevice = async def UnpairDevice(nodeid: 'int') -> 'None':         \n",
+       "                                        WaitForActive = async def WaitForActive(nodeid, *, timeoutSeconds=30.0,  \n",
+       "                                                        stayActiveDurationMs=30000):                             \n",
+       "                                                        Waits a LIT ICD device to become active. Will send a     \n",
+       "                                                        StayActive command to the device on active to allow      \n",
+       "                                                        human operations.                                        \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Node ID of the LID ICD                           \n",
+       "                                                        stayActiveDurationMs: The duration in the StayActive     \n",
+       "                                                        command, in milliseconds                                 \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - StayActiveResponse on success                      \n",
+       "                                       WriteAttribute = async def WriteAttribute(nodeid: 'int', attributes:      \n",
+       "                                                        'typing.List[typing.Tuple[int,                           \n",
+       "                                                        ClusterObjects.ClusterAttributeDescriptor]]',            \n",
+       "                                                        timedRequestTimeoutMs: 'typing.Optional[int]' = None,    \n",
+       "                                                        interactionTimeoutMs: 'typing.Optional[int]' = None,     \n",
+       "                                                        busyWaitMs: 'typing.Optional[int]' = None,               \n",
+       "                                                        payloadCapability: 'int' = 0):                           \n",
+       "                                                        Write a list of attributes on a target node.             \n",
+       "                                                                                                                 \n",
+       "                                                        nodeId: Target's Node ID                                 \n",
+       "                                                        timedWriteTimeoutMs: Timeout for a timed write request.  \n",
+       "                                                        Omit or set to 'None' to indicate a non-timed request.   \n",
+       "                                                        attributes: A list of tuples of type (endpoint,          \n",
+       "                                                        cluster-object):                                         \n",
+       "                                                        interactionTimeoutMs: Overall timeout for the            \n",
+       "                                                        interaction. Omit or set to 'None' to have the SDK       \n",
+       "                                                        automatically compute the                                \n",
+       "                                                                              right timeout value based on       \n",
+       "                                                        transport characteristics as well as the responsiveness  \n",
+       "                                                        of the target.                                           \n",
+       "                                                                                                                 \n",
+       "                                                        E.g                                                      \n",
+       "                                                            (1,                                                  \n",
+       "                                                        Clusters.UnitTesting.Attributes.XYZAttribute('hello'))   \n",
+       "                                                        -- Write 'hello'                                         \n",
+       "                                                            to the XYZ attribute on the test cluster to endpoint \n",
+       "                                                        1                                                        \n",
+       "                                                                                                                 \n",
+       "                                                        Returns:                                                 \n",
+       "                                                            - [AttributeStatus] (list - one for each path)       \n",
+       "                                  WriteGroupAttribute = def WriteGroupAttribute(groupid: 'int', attributes:      \n",
+       "                                                        'typing.List[typing.Tuple[ClusterObjects.ClusterAttribu… \n",
+       "                                                        int]]', busyWaitMs: 'typing.Optional[int]' = None):      \n",
+       "                                                        Write a list of attributes on a target group.            \n",
+       "                                                                                                                 \n",
+       "                                                        groupid: Group ID to send write attribute to.            \n",
+       "                                                        attributes: A list of tuples of type (cluster-object,    \n",
+       "                                                        data-version). The data-version can be omitted.          \n",
+       "                                                                                                                 \n",
+       "                                                        E.g                                                      \n",
+       "                                                            (Clusters.UnitTesting.Attributes.XYZAttribute('hell… \n",
+       "                                                        1) -- Group Write 'hello' with data version 1            \n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ - "\u001b[34m╭─\u001b[0m\u001b[34m────────────────── \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.ChipDeviceCtrl.ChipDeviceController'\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m ───────────────────\u001b[0m\u001b[34m─╮\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[32m╭───────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[32m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x1143b3910\u001b[0m\u001b[1m>\u001b[0m \u001b[32m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[32m╰───────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mactiveList\u001b[0m = \u001b[1m{\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[39mobject at \u001b[0m\u001b[1;36m0x1143b3910\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m}\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mdevCtrl\u001b[0m = \u001b[1;35mc_void_p\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m140320379576320\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33misActive\u001b[0m = \u001b[3;92mTrue\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mstate\u001b[0m = \u001b[1m<\u001b[0m\u001b[1;95mDCState.IDLE:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mcbHandleCommissioningCompleteFunct\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbHandleCommissioningCompleteFunct\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mcbHandleKeyExchangeCompleteFunct\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbHandleKeyExchangeCompleteFunct\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mcbOnAddressUpdateComplete\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbOnAddressUpdateComplete\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mCheckIsActive\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCheckIsActive\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mCloseBLEConnection\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCloseBLEConnection\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mCloseSession\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCloseSession\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mCommission\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCommission\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mCommissionIP\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCommissionIP\u001b[0m\u001b[1m(\u001b[0mipaddr, setupPinCode, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m nodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mConnectBLE\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mConnectBLE\u001b[0m\u001b[1m(\u001b[0mdiscriminator, setupPinCode, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m nodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mConnectBle\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mConnectBle\u001b[0m\u001b[1m(\u001b[0mbleConnection\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mDiscoverAllCommissioning\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mDiscoverAllCommissioning\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mDiscoverCommissionableNodesCommissioningEn…\u001b[0m \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m = \u001b[1;31mDiscoverCommissionableNodesCommissioningEnab…\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mDiscoverCommissionableNodesDeviceType\u001b[0m = \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;31mDiscoverCommissionableNodesDeviceType\u001b[0m\u001b[1m(\u001b[0mdevice… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mDiscoverCommissionableNodesLongDiscriminat…\u001b[0m \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m = \u001b[1;31mDiscoverCommissionableNodesLongDiscriminator\u001b[0m\u001b[1m…\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mDiscoverCommissionableNodesShortDiscrimina…\u001b[0m \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m = \u001b[1;31mDiscoverCommissionableNodesShortDiscriminato…\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mDiscoverCommissionableNodesVendor\u001b[0m = \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;31mDiscoverCommissionableNodesVendor\u001b[0m\u001b[1m(\u001b[0mvendor\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mEstablishPASESessionIP\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mEstablishPASESessionIP\u001b[0m\u001b[1m(\u001b[0mipaddr, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m setupPinCode, nodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mGetAddressAndPort\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetAddressAndPort\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mGetClusterHandler\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetClusterHandler\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mGetCompressedFabricId\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetCompressedFabricId\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mGetConnectedDeviceSync\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetConnectedDeviceSync\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mGetFabricId\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetFabricId\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mGetIPForDiscoveredDevice\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetIPForDiscoveredDevice\u001b[0m\u001b[1m(\u001b[0midx, addrStr, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m length\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mGetLogFilter\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetLogFilter\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mIsConnected\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mIsConnected\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mOpenCommissioningWindow\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mOpenCommissioningWindow\u001b[0m\u001b[1m(\u001b[0mnodeid, timeout, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m iteration, discriminator, option\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mParseQRCode\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mParseQRCode\u001b[0m\u001b[1m(\u001b[0mqrCode, output\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mPrintDiscoveredDevices\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mPrintDiscoveredDevices\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mReadAttribute\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mReadAttribute\u001b[0m\u001b[1m(\u001b[0mnodeid: int, attributes: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m List\u001b[1m[\u001b[0mUnion\u001b[1m[\u001b[0mNoneType, Tuple\u001b[1m[\u001b[0mint\u001b[1m]\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mType\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.Clus… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mType\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.Clus… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mint, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Type\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.Cluster\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mint, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Type\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.ClusterAtt… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m returnClusterObject: bool = \u001b[3;91mFalse\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m reportInterval: Tuple\u001b[1m[\u001b[0mint, int\u001b[1m]\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m fabricFiltered: bool = \u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mRead a list of attributes from a target node\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mattributes: A list of tuples of varying types\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mdepending on the type of read being \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mrequested:\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA.AttributeA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m:\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mAttribute = specific\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mAttribute = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mClusters.ClusterA.AttributeA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mAttribute = specific\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m endpoint: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific, Cluster = *, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mAttribute = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m Clusters.ClusterA: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mAttribute = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[2;32m'*'\u001b[0m\u001b[2m or \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *, Cluster = *, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mAttribute = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m The cluster and attributes specified \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mabove are to be selected from the generated \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mcluster objects.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m e.g.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case \u001b[0m\u001b[1;2;36m4\u001b[0m\u001b[2m \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mabove.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m Clusters.BasicInformation \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m-- case \u001b[0m\u001b[1;2;36m5\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mClusters.BasicInformation.Attributes.Location \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mcase \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mreturnClusterObject: This returns the data as\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mconsolidated cluster objects, with all \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mattributes for a cluster inside\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m a single cluster-wide \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mcluster object.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mreportInterval: A tuple of two int-s for \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;2m(\u001b[0m\u001b[2mMinIntervalFloor, MaxIntervalCeiling\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m. Used \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mby establishing subscriptions.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m When not provided, a read request will be\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2msent.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mReadEvent\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mReadEvent\u001b[0m\u001b[1m(\u001b[0mnodeid: int, events: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m List\u001b[1m[\u001b[0mUnion\u001b[1m[\u001b[0mNoneType, Tuple\u001b[1m[\u001b[0mint\u001b[1m]\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mType\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.Clus… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mType\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.Clus… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mint, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Type\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.Cluster\u001b[1m]\u001b[0m\u001b[1m]\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Tuple\u001b[1m[\u001b[0mint, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m Type\u001b[1m[\u001b[0mchip.clusters.ClusterObjects.ClusterEve… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m reportInterval: Tuple\u001b[1m[\u001b[0mint, int\u001b[1m]\u001b[0m = \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mRead a list of events from a target node\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mevents: A list of tuples of varying types \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mdepending on the type of read being \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mrequested:\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA.EventA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEvent = specific\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEvent = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mClusters.ClusterA.EventA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEvent = specific\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m endpoint: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific, Cluster = *, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEvent = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m Clusters.ClusterA: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *, Cluster = specific, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEvent = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[2;32m'*'\u001b[0m\u001b[2m or \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *, Cluster = *, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mEvent = *\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mThe cluster and events specified above are to\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mbe selected from the generated cluster \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mobjects.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2me.g.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadEvent\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case \u001b[0m\u001b[1;2;36m4\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadEvent\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m Clusters.BasicInformation \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;2;36m5\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadEvent\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mClusters.BasicInformation.Events.Location \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mabove.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mreportInterval: A tuple of two int-s for \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;2m(\u001b[0m\u001b[2mMinIntervalFloor, MaxIntervalCeiling\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m. Used \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mby establishing subscriptions.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m When not provided, a read request will be\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2msent.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mResolveNode\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mResolveNode\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mSendCommand\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSendCommand\u001b[0m\u001b[1m(\u001b[0mnodeid: int, endpoint: int, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m payload: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m chip.clusters.ClusterObjects.ClusterCommand, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mresponseType\u001b[0m=\u001b[3;35mNone\u001b[0m, timedRequestTimeoutMs: int \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m = \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mSend a cluster-object encapsulated command to\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2ma node and get returned a future that can be \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mawaited upon to receive the response.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mIf a valid responseType is passed in, that \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mwill be used to deserialize the object. If \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mnot, the type will be automatically deduced\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mfrom the metadata received over the wire.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mtimedWriteTimeoutMs: Timeout for a timed \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2minvoke request. Omit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mindicate a non-timed request.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mSetBlockingCB\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetBlockingCB\u001b[0m\u001b[1m(\u001b[0mblockingCB\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mSetLogFilter\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetLogFilter\u001b[0m\u001b[1m(\u001b[0mcategory\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mSetThreadOperationalDataset\u001b[0m = \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;31mSetThreadOperationalDataset\u001b[0m\u001b[1m(\u001b[0mthreadOperationa… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mSetWiFiCredentials\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetWiFiCredentials\u001b[0m\u001b[1m(\u001b[0mssid, credentials\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mShutdown\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mShutdown\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mShuts down this controller and reclaims any \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mused resources, including the bound\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mC++ constructor instance in the SDK.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mShutdownAll\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mShutdownAll\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[2mShut down all active \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mcontrollers and reclaim any used resources.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mWriteAttribute\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mWriteAttribute\u001b[0m\u001b[1m(\u001b[0mnodeid: int, attributes: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m List\u001b[1m[\u001b[0mTuple\u001b[1m[\u001b[0mint, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m chip.clusters.ClusterObjects.ClusterAttribut… \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m timedRequestTimeoutMs: int = \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mWrite a list of attributes on a target node.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mtimedWriteTimeoutMs: Timeout for a timed \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mwrite request. Omit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mindicate a non-timed request.\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mattributes: A list of tuples of type \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;2m(\u001b[0m\u001b[2mendpoint, cluster-object\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m:\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mE.g\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;2;35mClusters.UnitTesting.luster.Attributes.XYZAttribute\u001b[0m\u001b[1;2m…\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2m-- Write \u001b[0m\u001b[2;32m'hello'\u001b[0m\u001b[2m to the XYZ attribute on the \u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[2mtest cluster to endpoint \u001b[0m\u001b[1;2;36m1\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mZCLAttributeList\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mZCLAttributeList\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mZCLCommandList\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mZCLCommandList\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mZCLReadAttribute\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mZCLReadAttribute\u001b[0m\u001b[1m(\u001b[0mcluster, attribute, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m nodeid, endpoint, groupid, \u001b[33mblocking\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mZCLSend\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mZCLSend\u001b[0m\u001b[1m(\u001b[0mcluster, command, nodeid, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m endpoint, groupid, args, \u001b[33mblocking\u001b[0m=\u001b[3;91mFalse\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mZCLSubscribeAttribute\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mZCLSubscribeAttribute\u001b[0m\u001b[1m(\u001b[0mcluster, attribute, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m nodeid, endpoint, minInterval, maxInterval, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mblocking\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mZCLWriteAttribute\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mZCLWriteAttribute\u001b[0m\u001b[1m(\u001b[0mcluster: str, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m attribute: str, nodeid, endpoint, groupid, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m value, \u001b[33mblocking\u001b[0m=\u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m╰───────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" + "\u001b[34m╭─\u001b[0m\u001b[34m─────────────────────────────\u001b[0m\u001b[34m \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.ChipDeviceCtrl.ChipDeviceController'\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m \u001b[0m\u001b[34m──────────────────────────────\u001b[0m\u001b[34m─╮\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[36mThe ChipDeviceCommissioner binding, named as ChipDeviceController\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[36mTODO: This class contains DEPRECATED functions, we should update the test scripts to avoid the usage of those \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[36mfunctions.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────╮\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x78e55c7c3fa0\u001b[0m\u001b[1m>\u001b[0m \u001b[32m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mactiveList\u001b[0m = \u001b[1m{\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mchip.ChipDeviceCtrl.ChipDeviceController\u001b[0m\u001b[39m object at \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;36m0x78e55c7c3fa0\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1m}\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcaIndex\u001b[0m = \u001b[1;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mdevCtrl\u001b[0m = \u001b[1;35mc_void_p\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m132925546862080\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mfabricAdmin\u001b[0m = \u001b[1m<\u001b[0m\u001b[1;95mchip.FabricAdmin.FabricAdmin\u001b[0m\u001b[39m object at \u001b[0m\u001b[1;36m0x78e55c7c3be0\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mfabricId\u001b[0m = \u001b[1;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33misActive\u001b[0m = \u001b[3;92mTrue\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mname\u001b[0m = \u001b[32m'caIndex\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/fabricId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x0000000000000001\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/nodeId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x00000…\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mnodeId\u001b[0m = \u001b[1;36m112233\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mpairingDelegate\u001b[0m = \u001b[1;35mc_void_p\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m132925546882384\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcbHandleCommissioningCompleteFunct\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbHandleCommissioningCompleteFunct\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcbHandleDeviceUnpairCompleteFunct\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbHandleDeviceUnpairCompleteFunct\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcbHandleFabricCheckFunct\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbHandleFabricCheckFunct\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcbHandleOpenWindowCompleteFunct\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbHandleOpenWindowCompleteFunct\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mcbHandlePASEEstablishmentCompleteFunct\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mcbHandlePASEEstablishmentCompleteFunct\u001b[0m\u001b[1m(\u001b[0m\u001b[33m...\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCheckIsActive\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCheckIsActive\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCheckStageSuccessful\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCheckStageSuccessful\u001b[0m\u001b[1m(\u001b[0mstage: \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCheckTestCommissionerCallbacks\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCheckTestCommissionerCallbacks\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCheckTestCommissionerPaseConnection\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCheckTestCommissionerPaseConnection\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCloseBLEConnection\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCloseBLEConnection\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCloseSession\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCloseSession\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCommission\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mCommission\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m -> \u001b[32m'int'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mStart the auto-commissioning process on a node after \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mestablishing a PASE connection.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThis function is intended to be used in conjunction with\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m`EstablishPASESessionBLE` or\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m`EstablishPASESessionIP`. It can be called either before\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mor after the DevicePairingDelegate\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreceives the OnPairingComplete call. Commissioners that \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwant to perform simple\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mauto-commissioning should use the supplied \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;32m\"CommissionWithCode\"\u001b[0m\u001b[2m function, which will\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mestablish the PASE connection and commission \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mautomatically.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises a ChipStackError on failure.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - Effective Node ID of the device \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mas defined by the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2massigned NOC\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCommissioningWindowPasscode\u001b[0m = \u001b[3;96mclass \u001b[0m\u001b[1;31mCommissioningWindowPasscode\u001b[0m\u001b[1m(\u001b[0mvalue, \u001b[33mnames\u001b[0m=\u001b[3;35mNone\u001b[0m, *, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[33mmodule\u001b[0m=\u001b[3;35mNone\u001b[0m, \u001b[33mqualname\u001b[0m=\u001b[3;35mNone\u001b[0m, \u001b[33mtype\u001b[0m=\u001b[3;35mNone\u001b[0m, \u001b[33mstart\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mAn \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2menumeration.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCommissionIP\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mCommissionIP\u001b[0m\u001b[1m(\u001b[0mipaddr: \u001b[32m'str'\u001b[0m, setupPinCode: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m, nodeid: \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'int'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mDEPRECATED, DO NOT USE! Use `CommissionOnNetwork` or \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m`CommissionWithCode`\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises a ChipStackError on failure.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - Effective Node ID of the device \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mas defined by the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2massigned NOC\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCommissionOnNetwork\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mCommissionOnNetwork\u001b[0m\u001b[1m(\u001b[0mnodeId: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m setupPinCode: \u001b[32m'int'\u001b[0m, filterType: \u001b[32m'DiscoveryFilterType'\u001b[0m = \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mFilterType.NONE:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m>, filter: \u001b[0m\u001b[32m'typing.Any'\u001b[0m\u001b[39m = \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[39mdiscoveryTimeoutMsec: \u001b[0m\u001b[32m'int'\u001b[0m\u001b[39m = \u001b[0m\u001b[1;36m30000\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m -\u001b[0m\u001b[1m>\u001b[0m \u001b[32m'int'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mDoes the routine for OnNetworkCommissioning, with a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfilter for mDNS discovery.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSupported filters are:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.NONE\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.SHORT_DISCRIMINATOR\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.LONG_DISCRIMINATOR\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.VENDOR_ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.DEVICE_TYPE\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.COMMISSIONING_MODE\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.INSTANCE_NAME\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.COMMISSIONER\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m DiscoveryFilterType.COMPRESSED_FABRIC_ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThe filter can be an integer, a string or \u001b[0m\u001b[2;3;35mNone\u001b[0m\u001b[2m depending\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mon the actual type of selected filter.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises a ChipStackError on failure.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - Effective Node ID of the device \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mas defined by the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2massigned NOC\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCommissionThread\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mCommissionThread\u001b[0m\u001b[1m(\u001b[0mdiscriminator, setupPinCode, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m nodeId, threadOperationalDataset: \u001b[32m'bytes'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m isShortDiscriminator: \u001b[32m'bool'\u001b[0m = \u001b[3;91mFalse\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'int'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCommissions a Thread device over BLE\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCommissionWiFi\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mCommissionWiFi\u001b[0m\u001b[1m(\u001b[0mdiscriminator, setupPinCode, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m nodeId, ssid: \u001b[32m'str'\u001b[0m, credentials: \u001b[32m'str'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m isShortDiscriminator: \u001b[32m'bool'\u001b[0m = \u001b[3;91mFalse\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'int'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCommissions a Wi-Fi device over BLE.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCommissionWithCode\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mCommissionWithCode\u001b[0m\u001b[1m(\u001b[0msetupPayload: \u001b[32m'str'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m nodeid: \u001b[32m'int'\u001b[0m, discoveryType: \u001b[32m'DiscoveryType'\u001b[0m = \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1m<\u001b[0m\u001b[1;95mDiscoveryType.DISCOVERY_ALL:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[39m>\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m -\u001b[0m\u001b[1m>\u001b[0m \u001b[32m'int'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCommission with the given nodeid from the setupPayload.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m setupPayload may be a QR or manual code.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Raises a ChipStackError on failure.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - Effective Node ID of the device \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mas defined by the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2massigned NOC\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mComputeRoundTripTimeout\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mComputeRoundTripTimeout\u001b[0m\u001b[1m(\u001b[0mnodeid, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m upperLayerProcessingTimeoutMs: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns a computed timeout value based on the round-trip\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtime it takes for the peer at the other end of the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msession to\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreceive a message, process it and send it back. This is \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcomputed based on the session type, the type of \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtransport,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msleepy characteristics of the target and a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcaller-provided value for the time it takes to process a\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mmessage\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mat the upper layer on the target For group sessions.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThis will result in a session being established if one \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwasn't already.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mConnectBLE\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mConnectBLE\u001b[0m\u001b[1m(\u001b[0mdiscriminator: \u001b[32m'int'\u001b[0m, setupPinCode: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m, nodeid: \u001b[32m'int'\u001b[0m, isShortDiscriminator: \u001b[32m'bool'\u001b[0m = \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;91mFalse\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'int'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mConnect to a BLE device using the given discriminator \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mand setup pin code.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - Effective Node ID of the device \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mas defined by the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2massigned NOC\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mCreateManualCode\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mCreateManualCode\u001b[0m\u001b[1m(\u001b[0mdiscriminator: \u001b[32m'int'\u001b[0m, passcode: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'str'\u001b[0m: \u001b[2mCreates a standard flow manual code \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfrom the given discriminator and passcode.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mDisableICDRegistration\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mDisableICDRegistration\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mDisables ICD registration.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mDiscoverCommissionableNodes\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mDiscoverCommissionableNodes\u001b[0m\u001b[1m(\u001b[0mfilterType: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'discovery.FilterType'\u001b[0m = \u001b[1m<\u001b[0m\u001b[1;95mFilterType.NONE:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[39m>, filter: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Any'\u001b[0m\u001b[39m = \u001b[0m\u001b[3;35mNone\u001b[0m\u001b[39m, stopOnFirst: \u001b[0m\u001b[32m'bool'\u001b[0m\u001b[39m = \u001b[0m\u001b[3;91mFalse\u001b[0m\u001b[39m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[39mtimeoutSecond: \u001b[0m\u001b[32m'int'\u001b[0m\u001b[39m = \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;39m)\u001b[0m\u001b[39m -\u001b[0m\u001b[1m>\u001b[0m \u001b[32m'typing.Union\u001b[0m\u001b[32m[\u001b[0m\u001b[32mNone, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mCommissionableNode, typing.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mCommissionableNode\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mDiscover commissionable nodes via DNS-SD with specified \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfilters.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSupported filters are:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.NONE\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.SHORT_DISCRIMINATOR\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.LONG_DISCRIMINATOR\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.VENDOR_ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.DEVICE_TYPE\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.COMMISSIONING_MODE\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.INSTANCE_NAME\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.COMMISSIONER\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m discovery.FilterType.COMPRESSED_FABRIC_ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThis function will always return a list of \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCommissionableDevice. When stopOnFirst is set,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthis function will return when at least one device is \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mdiscovered or on timeout.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mEnableICDRegistration\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mEnableICDRegistration\u001b[0m\u001b[1m(\u001b[0mparameters: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'ICDRegistrationParameters'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mEnables ICD registration for the following commissioning\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msession.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mArgs:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m parameters: A ICDRegistrationParameters for the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mparameters used for ICD registration, or \u001b[0m\u001b[2;3;35mNone\u001b[0m\u001b[2m for \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mdefault arguments.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mEstablishPASESession\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mEstablishPASESession\u001b[0m\u001b[1m(\u001b[0msetUpCode: \u001b[32m'str'\u001b[0m, nodeid: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'None'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mEstablishPASESessionBLE\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mEstablishPASESessionBLE\u001b[0m\u001b[1m(\u001b[0msetupPinCode: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m discriminator: \u001b[32m'int'\u001b[0m, nodeid: \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'None'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mEstablishPASESessionIP\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mEstablishPASESessionIP\u001b[0m\u001b[1m(\u001b[0mipaddr: \u001b[32m'str'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m setupPinCode: \u001b[32m'int'\u001b[0m, nodeid: \u001b[32m'int'\u001b[0m, port: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m -> \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'None'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mExpireSessions\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mExpireSessions\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mClose all sessions with `nodeid` \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mif any existed\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m so \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthat sessions get re-established.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThis is needed to properly handle operations that \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minvalidate a node's state, such as\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mUpdateNOC.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mWARNING: ONLY CALL THIS IF YOU UNDERSTAND THE \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSIDE-EFFECTS\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mFindOrEstablishPASESession\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mFindOrEstablishPASESession\u001b[0m\u001b[1m(\u001b[0msetupCode: \u001b[32m'str'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m nodeid: \u001b[32m'int'\u001b[0m, timeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m -> \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mDeviceProxyWrapper\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m: \u001b[2mReturns \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCommissioneeDeviceProxy if we can find or establish a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mPASE connection to the specified device\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGenerateICDRegistrationParameters\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGenerateICDRegistrationParameters\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mGenerates ICD \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mregistration parameters for this controller.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetAddressAndPort\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetAddressAndPort\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetClusterHandler\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetClusterHandler\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetCompressedFabricId\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetCompressedFabricId\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetConnectedDevice\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mGetConnectedDevice\u001b[0m\u001b[1m(\u001b[0mnodeid, allowPASE: \u001b[32m'bool'\u001b[0m = \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;92mTrue\u001b[0m, timeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m payloadCapability: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mGets an OperationalDeviceProxy or \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCommissioneeDeviceProxy for the specified Node.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mallowPASE: Get a device proxy of a device being \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommissioned.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtimeoutMs: Timeout for a timed invoke request. Omit or \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mset to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to indicate a non-timed request.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - DeviceProxyWrapper on success\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetConnectedDeviceSync\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetConnectedDeviceSync\u001b[0m\u001b[1m(\u001b[0mnodeid, \u001b[33mallowPASE\u001b[0m=\u001b[3;92mTrue\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m timeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m payloadCapability: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mGets an OperationalDeviceProxy or \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCommissioneeDeviceProxy for the specified Node.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mallowPASE: Get a device proxy of a device being \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommissioned.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtimeoutMs: Timeout for a timed invoke request. Omit or \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mset to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to indicate a non-timed request.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - DeviceProxyWrapper on success\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetDiscoveredDevices\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mGetDiscoveredDevices\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetFabricCheckResult\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetFabricCheckResult\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'int'\u001b[0m: \u001b[2mReturns the fabric \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcheck result if SetCheckMatchingFabric was used.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetFabricIdInternal\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetFabricIdInternal\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mGet the fabric ID from the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mobject. Only used to validate cached value from \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mproperty.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetFabricIndexInternal\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetFabricIndexInternal\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mGet the fabric index from \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe object. Only used to validate cached value from \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mproperty.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetIPForDiscoveredDevice\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetIPForDiscoveredDevice\u001b[0m\u001b[1m(\u001b[0midx, addrStr, length\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetNodeIdInternal\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetNodeIdInternal\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'int'\u001b[0m: \u001b[2mGet the node ID from \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe object. Only used to validate cached value from \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mproperty.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetRemoteSessionParameters\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetRemoteSessionParameters\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m -> \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mSessionParameters\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns the SessionParameters of reported by the remote \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnode associated with `nodeid`.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mIf there is some error in getting SessionParameters \u001b[0m\u001b[2;3;35mNone\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mis returned.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThis will result in a session being established if one \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwasn't already established.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mGetTestCommissionerUsed\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mGetTestCommissionerUsed\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mInitGroupTestingData\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mInitGroupTestingData\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mPopulates the Device \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mController's GroupDataProvider with known test group \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minfo and keys.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mIsConnected\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mIsConnected\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mIssueNOCChain\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mIssueNOCChain\u001b[0m\u001b[1m(\u001b[0mcsr: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'Clusters.OperationalCredentials.Commands.CSRResponse'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m nodeId: \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mIssue an NOC chain using the associated \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mOperationalCredentialsDelegate.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThe NOC chain will be provided in TLV cert format.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mNOCChainCallback\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mNOCChainCallback\u001b[0m\u001b[1m(\u001b[0mnocChain\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mOpenCommissioningWindow\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mOpenCommissioningWindow\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m timeout: \u001b[32m'int'\u001b[0m, iteration: \u001b[32m'int'\u001b[0m, discriminator: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m option: \u001b[32m'CommissioningWindowPasscode'\u001b[0m\u001b[1m)\u001b[0m -> \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'CommissioningParameters'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mOpens a commissioning window on the device with the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mgiven nodeid.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeid: Node id of the device\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtimeout: Command timeout\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2miteration: The PAKE iteration count associated with \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe PAKE Passcode ID and ephemeral\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m PAKE passcode verifier to be used for \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthis commissioning. Valid range: \u001b[0m\u001b[1;2;36m1000\u001b[0m\u001b[2m - \u001b[0m\u001b[1;2;36m100000\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Ignored if option == \u001b[0m\u001b[1;2;36m0\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mdiscriminator: The long discriminator for the DNS-SD \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2madvertisement. Valid range: \u001b[0m\u001b[1;2;36m0\u001b[0m\u001b[2m-\u001b[0m\u001b[1;2;36m4095\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Ignored if option == \u001b[0m\u001b[1;2;36m0\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2moption: \u001b[0m\u001b[1;2;36m0\u001b[0m\u001b[2m = kOriginalSetupCode\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m = kTokenWithRandomPIN\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns CommissioningParameters\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mRead\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mRead\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, attributes: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Union\u001b[0m\u001b[32m[\u001b[0m\u001b[32mNone, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterAttribut…\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, typing.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterAttributeDescriptor\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mClusterAttribute.AttributePath\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m dataVersionFilters: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m events: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Union\u001b[0m\u001b[32m[\u001b[0m\u001b[32mNone, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mstr, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, typing.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterEvent\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, typing.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterEvent\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;35mNone\u001b[0m, eventNumberFilter: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m returnClusterObject: \u001b[32m'bool'\u001b[0m = \u001b[3;91mFalse\u001b[0m, reportInterval: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m fabricFiltered: \u001b[32m'bool'\u001b[0m = \u001b[3;92mTrue\u001b[0m, keepSubscriptions: \u001b[32m'bool'\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m = \u001b[3;91mFalse\u001b[0m, autoResubscribe: \u001b[32m'bool'\u001b[0m = \u001b[3;92mTrue\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m payloadCapability: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRead a list of attributes and/or events from a target \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnode\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mattributes: A list of tuples of varying types depending \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mon the type of read being requested:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA.AttributeA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = specific, Attribute = \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mspecific\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = specific, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mClusters.ClusterA.AttributeA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = specific, Attribute = \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mspecific\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m endpoint: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = *, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Clusters.ClusterA: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = specific, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[2;32m'*'\u001b[0m\u001b[2m or \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = *, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m The cluster and attributes specified above are to be\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mselected from the generated cluster objects.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m e.g.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case \u001b[0m\u001b[1;2;36m4\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m Clusters.BasicInformation \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m-- case \u001b[0m\u001b[1;2;36m5\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mClusters.BasicInformation.Attributes.Location \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcase \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m An AttributePath can also be specified directly by \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2m[\u001b[0m\u001b[1;2;35mchip.cluster.Attribute.AttributePath\u001b[0m\u001b[1;2m(\u001b[0m\u001b[2;33m...\u001b[0m\u001b[1;2m)\u001b[0m\u001b[1;2m]\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mdataVersionFilters: A list of tuples of \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcluster, data version\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mevents: A list of tuples of varying types depending on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe type of read being requested:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA.EventA, urgent\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m …\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Event = specific, Urgent = \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA, urgent\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m …\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Event = *, Urgent = \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mClusters.ClusterA.EventA, urgent\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m …\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Event = specific, Urgent = \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m endpoint: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = *, Event = *, Urgent =\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Clusters.ClusterA: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = specific, Event = *, Urgent =\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[2;32m'*'\u001b[0m\u001b[2m or \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = *, Event = *, Urgent = \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2meventNumberFilter: Optional minimum event number filter.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreturnClusterObject: This returns the data as \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mconsolidated cluster objects, with all attributes for a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcluster inside\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m a single cluster-wide cluster \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mobject.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreportInterval: A tuple of two int-s for \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2m(\u001b[0m\u001b[2mMinIntervalFloor, MaxIntervalCeiling\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m. Used by \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mestablishing subscriptions.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m When not provided, a read request will be sent.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfabricFiltered: If \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mdefault\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m, the read/subscribe is\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfabric-filtered and will only see things associated with\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe fabric\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m of the reader/subscriber. Relevant for attributes \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwith fabric-scoped data.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mkeepSubscriptions: Keep existing subscriptions. If set \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mto \u001b[0m\u001b[2;3;91mFalse\u001b[0m\u001b[2m, existing subscriptions with this node will get\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcancelled\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m and a new one gets setup.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mautoResubscribe: Automatically resubscribe to the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msubscription if subscription is lost. The automatic \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mre-subscription only\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m applies if the subscription establishes on first \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtry. If the first subscription establishment attempt \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfails the function\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m returns right away.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - AsyncReadTransaction.ReadResponse. Please see \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReadAttribute and ReadEvent for examples of how to \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2maccess data.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - InteractionModelError \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mchip.interaction_model\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2merror\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mReadAttribute\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mReadAttribute\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, attributes: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Union\u001b[0m\u001b[32m[\u001b[0m\u001b[32mNone, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterAttribut…\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, typing.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterAttributeDescriptor\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mClusterAttribute.AttributePath\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m, dataVersionFilters: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m returnClusterObject: \u001b[32m'bool'\u001b[0m = \u001b[3;91mFalse\u001b[0m, reportInterval: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m fabricFiltered: \u001b[32m'bool'\u001b[0m = \u001b[3;92mTrue\u001b[0m, keepSubscriptions: \u001b[32m'bool'\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m = \u001b[3;91mFalse\u001b[0m, autoResubscribe: \u001b[32m'bool'\u001b[0m = \u001b[3;92mTrue\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m payloadCapability: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRead a list of attributes from a target node, this is a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwrapper of \u001b[0m\u001b[1;2;35mDeviceController.Read\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mattributes: A list of tuples of varying types depending \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mon the type of read being requested:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA.AttributeA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = specific, Attribute = \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mspecific\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = specific, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mClusters.ClusterA.AttributeA\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = specific, Attribute = \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mspecific\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m endpoint: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = *, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Clusters.ClusterA: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = specific, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[2;32m'*'\u001b[0m\u001b[2m or \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = *, Attribute = *\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m The cluster and attributes specified above are to be\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mselected from the generated cluster objects.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m e.g.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case \u001b[0m\u001b[1;2;36m4\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m Clusters.BasicInformation \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m-- case \u001b[0m\u001b[1;2;36m5\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mClusters.BasicInformation.Attributes.Location \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcase \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m An AttributePath can also be specified directly by \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2m[\u001b[0m\u001b[1;2;35mchip.cluster.Attribute.AttributePath\u001b[0m\u001b[1;2m(\u001b[0m\u001b[2;33m...\u001b[0m\u001b[1;2m)\u001b[0m\u001b[1;2m]\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreturnClusterObject: This returns the data as \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mconsolidated cluster objects, with all attributes for a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcluster inside\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m a single cluster-wide cluster \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mobject.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreportInterval: A tuple of two int-s for \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2m(\u001b[0m\u001b[2mMinIntervalFloor, MaxIntervalCeiling\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m. Used by \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mestablishing subscriptions.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m When not provided, a read request will be sent.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfabricFiltered: If \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mdefault\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m, the read/subscribe is\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfabric-filtered and will only see things associated with\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe fabric\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m of the reader/subscriber. Relevant for attributes \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwith fabric-scoped data.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mkeepSubscriptions: Keep existing subscriptions. If set \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mto \u001b[0m\u001b[2;3;91mFalse\u001b[0m\u001b[2m, existing subscriptions with this node will get\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcancelled\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m and a new one gets setup.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mautoResubscribe: Automatically resubscribe to the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msubscription if subscription is lost. The automatic \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mre-subscription only\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m applies if the subscription establishes on first \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtry. If the first subscription establishment attempt \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfails the function\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m returns right away.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - subscription request: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mClusterAttribute.SubscriptionTransaction\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m To get notified on attribute\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mchange use SetAttributeUpdateCallback on the returned\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m SubscriptionTransaction. \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThis is used to set a callback function, which is a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcallable of\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m type \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mCallable\u001b[0m\u001b[1;2m[\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mTypedAttributePath, SubscriptionTransaction\u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;3;35mNone\u001b[0m\u001b[1;2m]\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Get the attribute value from\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe change path using GetAttribute on the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSubscriptionTransaction\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m You can await changes in the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mmain loop using a trigger mechanism from the callback.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m ex. queue.SimpleQueue\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - read request: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mAsyncReadTransaction.ReadResponse.attributes.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m This is of type \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mAttributeCache.attributeCache \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mAttribute.py\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m which is a dict mapping endpoints to\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2ma list of Cluster \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mClusterObjects.py\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m classes\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mdict\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mint, List\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mCluster\u001b[0m\u001b[1;2m]\u001b[0m\u001b[1;2m]\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Access as \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreturned_object\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mendpoint_id\u001b[0m\u001b[1;2m]\u001b[0m\u001b[1;2m[\u001b[0m\u001b[1;2m<\u001b[0m\u001b[1;2;95mCluster\u001b[0m\u001b[2;39m class>\u001b[0m\u001b[1;2;39m]\u001b[0m\u001b[1;2;39m[\u001b[0m\u001b[2;39m\u001b[0m\u001b[1;2m]\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Ex. To access the OnTime attribute \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfrom the OnOff cluster on endpoint \u001b[0m\u001b[1;2;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m returned_object\u001b[0m\u001b[1;2m[\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[1;2m]\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mClusters.OnOff\u001b[0m\u001b[1;2m]\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m…\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - InteractionModelError \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mchip.interaction_model\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2merror\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mReadEvent\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mReadEvent\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, events: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Union\u001b[0m\u001b[32m[\u001b[0m\u001b[32mNone, typing.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mstr, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterEvent\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, typing.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.Cluster\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mtyping.Type\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterEvent\u001b[0m\u001b[32m]\u001b[0m\u001b[32m, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m eventNumberFilter: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m fabricFiltered: \u001b[32m'bool'\u001b[0m = \u001b[3;92mTrue\u001b[0m, reportInterval: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, int\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m keepSubscriptions: \u001b[32m'bool'\u001b[0m = \u001b[3;91mFalse\u001b[0m, autoResubscribe: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'bool'\u001b[0m = \u001b[3;92mTrue\u001b[0m, payloadCapability: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRead a list of events from a target node, this is a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwrapper of \u001b[0m\u001b[1;2;35mDeviceController.Read\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mevents: A list of tuples of varying types depending on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe type of read being requested:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA.EventA, urgent\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m …\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Event = specific, Urgent = \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, Clusters.ClusterA, urgent\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mEndpoint = specific,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m …\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Event = *, Urgent = \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mClusters.ClusterA.EventA, urgent\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mEndpoint = *,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m …\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Event = specific, Urgent = \u001b[0m\u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m endpoint: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= specific, Cluster = *, Event = *, Urgent =\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Clusters.ClusterA: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = specific, Event = *, Urgent =\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[2;32m'*'\u001b[0m\u001b[2m or \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m: Endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m= *, Cluster = *, Event = *, Urgent = \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2;3;92mTrue\u001b[0m\u001b[2m/\u001b[0m\u001b[2;3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mThe cluster and events specified above are to be \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mselected from the generated cluster objects.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2me.g.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadEvent\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case \u001b[0m\u001b[1;2;36m4\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadEvent\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m Clusters.BasicInformation \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2;36m5\u001b[0m\u001b[2m above.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2;35mReadEvent\u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mClusters.BasicInformation.Events.Location \u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- case \u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mabove.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2meventNumberFilter: Optional minimum event number filter.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreportInterval: A tuple of two int-s for \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2m(\u001b[0m\u001b[2mMinIntervalFloor, MaxIntervalCeiling\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m. Used by \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mestablishing subscriptions.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m When not provided, a read request will be sent.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mkeepSubscriptions: Keep existing subscriptions. If set \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mto \u001b[0m\u001b[2;3;91mFalse\u001b[0m\u001b[2m, existing subscriptions with this node will get\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcancelled\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m and a new one gets setup.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mautoResubscribe: Automatically resubscribe to the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msubscription if subscription is lost. The automatic \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mre-subscription only\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m applies if the subscription establishes on first \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtry. If the first subscription establishment attempt \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfails the function\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m returns right away.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - subscription request: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mClusterAttribute.SubscriptionTransaction\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m To get notified on event \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msubscriptions, use the SetEventUpdateCallback function \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mon the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m returned \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSubscriptionTransaction. This is a callable of type\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m Callable\u001b[0m\u001b[1;2m[\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mEventReadResult, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSubscriptionTransaction\u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m, \u001b[0m\u001b[2;3;35mNone\u001b[0m\u001b[1;2m]\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m You can await events using a\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtrigger mechanism in the callback. ex. queue.SimpleQueue\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - read request: \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mAsyncReadTransaction.ReadResponse.events.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m This is a List\u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mClusterEvent\u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - InteractionModelError \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mchip.interaction_model\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2merror\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mResetCommissioningParameters\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mResetCommissioningParameters\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mSets the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommissioning parameters back to the default values.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mResetTestCommissioner\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mResetTestCommissioner\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mResolveNode\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mResolveNode\u001b[0m\u001b[1m(\u001b[0mnodeid\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSendBatchCommands\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mSendBatchCommands\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, commands: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterCommand.InvokeRequestInfo\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m timedRequestTimeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m interactionTimeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m busyWaitMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m suppressResponse: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mbool\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m payloadCapability: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSend a batch of cluster-object encapsulated commands to \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2ma node and get returned a future that can be awaited \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mupon to receive\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe responses. If a valid responseType is passed in, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthat will be used to de-serialize the object. If not,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe type will be automatically deduced from the metadata\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreceived over the wire.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommands: A list of InvokeRequestInfo containing the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommands to invoke.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtimedWriteTimeoutMs: Timeout for a timed invoke request.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mOmit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to indicate a non-timed request.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minteractionTimeoutMs: Overall timeout for the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minteraction. Omit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to have the SDK \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mautomatically compute the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m right timeout value based on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtransport characteristics as well as the responsiveness \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mof the target.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mbusyWaitMs: How long to wait in ms after sending command\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mto device before performing any other operations.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msuppressResponse: Do not send a response to this action\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - List of command responses in the same order as \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwhat was given in `commands`. The type of the response \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mis defined by the command.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - A value of `\u001b[0m\u001b[2;3;35mNone\u001b[0m\u001b[2m` indicates success.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - If only a single command fails, for \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mexample with `UNSUPPORTED_COMMAND`, the corresponding \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mindex associated with the command will,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m contain \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m`interaction_model.Status.UnsupportedCommand`.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - If a command is not responded to by \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mserver, command will contain \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m`interaction_model.Status.NoCommandResponse`\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - InteractionModelError if error with sending of \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mInvokeRequestMessage fails as a whole.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSendCommand\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mSendCommand\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, endpoint: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m payload: \u001b[32m'ClusterObjects.ClusterCommand'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[33mresponseType\u001b[0m=\u001b[3;35mNone\u001b[0m, timedRequestTimeoutMs: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, interactionTimeoutMs: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, busyWaitMs: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, suppressResponse: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mbool\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, payloadCapability: \u001b[32m'int'\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSend a cluster-object encapsulated command to a node and\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mget returned a future that can be awaited upon to \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreceive\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe response. If a valid responseType is passed in, that\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mwill be used to de-serialize the object. If not,\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthe type will be automatically deduced from the metadata\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreceived over the wire.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtimedWriteTimeoutMs: Timeout for a timed invoke request.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mOmit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to indicate a non-timed request.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minteractionTimeoutMs: Overall timeout for the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minteraction. Omit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to have the SDK \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mautomatically compute the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m right timeout value based on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtransport characteristics as well as the responsiveness \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mof the target.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - command response. The type of the response is \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mdefined by the command.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - InteractionModelError on error\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSendGroupCommand\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSendGroupCommand\u001b[0m\u001b[1m(\u001b[0mgroupid: \u001b[32m'int'\u001b[0m, payload: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'ClusterObjects.ClusterCommand'\u001b[0m, busyWaitMs: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSend a group cluster-object encapsulated command to a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mgroup_id and get returned a future\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mthat can be awaited upon to get confirmation command was\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msent.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - \u001b[0m\u001b[2;3;35mNone\u001b[0m\u001b[2m: responses are not sent to group commands\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mRaises:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - InteractionModelError on error\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetCheckMatchingFabric\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetCheckMatchingFabric\u001b[0m\u001b[1m(\u001b[0mcheck: \u001b[32m'bool'\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mInstructs the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mauto-commissioner to perform a matching fabric check \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mbefore commissioning.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetDefaultNTP\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetDefaultNTP\u001b[0m\u001b[1m(\u001b[0mdefaultNTP: \u001b[32m'str'\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mSet the DefaultNTP\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mto set during commissioning\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetDSTOffset\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetDSTOffset\u001b[0m\u001b[1m(\u001b[0moffset: \u001b[32m'int'\u001b[0m, validStarting: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m validUntil: \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mSet the DST offset to set during \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommissioning. Currently only one DST entry is supported\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetIpk\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetIpk\u001b[0m\u001b[1m(\u001b[0mipk: \u001b[32m'bytes'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetSkipCommissioningComplete\u001b[0m = \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;31mSetSkipCommissioningComplete\u001b[0m\u001b[1m(\u001b[0mskipCommissioningComplete: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'bool'\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mSet whether to skip the commissioning complete \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcallback\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetTCAcknowledgements\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetTCAcknowledgements\u001b[0m\u001b[1m(\u001b[0mtcAcceptedVersion: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m tcUserResponse: \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mSet the TC acknowledgements to \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mset during commissioning\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetTestCommissionerPrematureCompleteAfter\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetTestCommissionerPrematureCompleteAfter\u001b[0m\u001b[1m(\u001b[0mstage: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetTestCommissionerSimulateFailureOnReport\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetTestCommissionerSimulateFailureOnReport\u001b[0m\u001b[1m(\u001b[0mstage: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetTestCommissionerSimulateFailureOnStage\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetTestCommissionerSimulateFailureOnStage\u001b[0m\u001b[1m(\u001b[0mstage: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetThreadOperationalDataset\u001b[0m = \u001b[3;96mdef \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;31mSetThreadOperationalDataset\u001b[0m\u001b[1m(\u001b[0mthreadOperationalDataset\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSet the Thread operational dataset to set during \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommissioning.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetTimeZone\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetTimeZone\u001b[0m\u001b[1m(\u001b[0moffset: \u001b[32m'int'\u001b[0m, validAt: \u001b[32m'int'\u001b[0m, name: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'str'\u001b[0m = \u001b[32m''\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mSet the time zone to set during \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommissioning. Currently only one time zone entry is \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msupported\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetTrustedTimeSource\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetTrustedTimeSource\u001b[0m\u001b[1m(\u001b[0mnodeId: \u001b[32m'int'\u001b[0m, endpoint: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mSet the trusted time source nodeId to set during\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommissioning. This must be a node on the commissioner \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mfabric.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mSetWiFiCredentials\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mSetWiFiCredentials\u001b[0m\u001b[1m(\u001b[0mssid: \u001b[32m'str'\u001b[0m, credentials: \u001b[32m'str'\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSet the Wi-Fi credentials to set during commissioning.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mShutdown\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mShutdown\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mShuts down this controller and reclaims any used \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mresources, including the bound\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mC++ constructor instance in the SDK.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mShutdownAll\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mShutdownAll\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m: \u001b[2mShut down all active controllers and \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mreclaim any used resources.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mTestOnlyPrepareToReceiveBdxData\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mTestOnlyPrepareToReceiveBdxData\u001b[0m\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m -> \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'asyncio.Future'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSets up the system to expect a node to initiate a BDX \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtransfer. The transfer will send data here.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - a future that will yield a BdxTransfer with the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minit message from the transfer.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mTestOnlyPrepareToSendBdxData\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mTestOnlyPrepareToSendBdxData\u001b[0m\u001b[1m(\u001b[0mdata: \u001b[32m'bytes'\u001b[0m\u001b[1m)\u001b[0m -> \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'asyncio.Future'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mSets up the system to expect a node to initiate a BDX \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtransfer. The transfer will send data to the node.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - a future that will yield a BdxTransfer with the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minit message from the transfer.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mTestOnlySendBatchCommands\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mTestOnlySendBatchCommands\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m commands: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterCommand.InvokeRequestInfo\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m timedRequestTimeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m interactionTimeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m busyWaitMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m suppressResponse: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mbool\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m remoteMaxPathsPerInvoke: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m suppressTimedRequestMessage: \u001b[32m'bool'\u001b[0m = \u001b[3;91mFalse\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m commandRefsOverride: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m = \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mPlease see SendBatchCommands for description.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mTestOnly overridable arguments:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m remoteMaxPathsPerInvoke: Overrides the number of \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mbatch commands we think can be sent to remote node.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m suppressTimedRequestMessage: When set to true, we \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2msuppress sending Timed Request Message.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m commandRefsOverride: List of commandRefs to use for \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2meach command with the same index in `commands`.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - TestOnlyBatchCommandResponse\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mTestOnlySendCommandTimedRequestFlagWithNoTimedInvoke\u001b[0m = \u001b[3;96masync def \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;31mTestOnlySendCommandTimedRequestFlagWithNoTimedInvoke\u001b[0m\u001b[1m(\u001b[0mno… \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'int'\u001b[0m, endpoint: \u001b[32m'int'\u001b[0m, payload: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'ClusterObjects.ClusterCommand'\u001b[0m, \u001b[33mresponseType\u001b[0m=\u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mPlease see SendCommand for description.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mUnpairDevice\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mUnpairDevice\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m\u001b[1m)\u001b[0m -> \u001b[32m'None'\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mWaitForActive\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mWaitForActive\u001b[0m\u001b[1m(\u001b[0mnodeid, *, \u001b[33mtimeoutSeconds\u001b[0m=\u001b[1;36m30\u001b[0m\u001b[1;36m.0\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[33mstayActiveDurationMs\u001b[0m=\u001b[1;36m30000\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mWaits a LIT ICD device to become active. Will send a \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mStayActive command to the device on active to allow \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mhuman operations.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Node ID of the LID ICD\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mstayActiveDurationMs: The duration in the StayActive \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcommand, in milliseconds\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - StayActiveResponse on success\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mWriteAttribute\u001b[0m = \u001b[3;96masync def \u001b[0m\u001b[1;31mWriteAttribute\u001b[0m\u001b[1m(\u001b[0mnodeid: \u001b[32m'int'\u001b[0m, attributes: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mClusterObjects.ClusterAttributeDescriptor\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m timedRequestTimeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m interactionTimeoutMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m busyWaitMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m, \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m payloadCapability: \u001b[32m'int'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mWrite a list of attributes on a target node.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mnodeId: Target's Node ID\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtimedWriteTimeoutMs: Timeout for a timed write request. \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mOmit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to indicate a non-timed request.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mattributes: A list of tuples of type \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mendpoint, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mcluster-object\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minteractionTimeoutMs: Overall timeout for the \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2minteraction. Omit or set to \u001b[0m\u001b[2;32m'None'\u001b[0m\u001b[2m to have the SDK \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mautomatically compute the\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m right timeout value based on \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mtransport characteristics as well as the responsiveness \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mof the target.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mE.g\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;36m1\u001b[0m\u001b[2m, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2;35mClusters.UnitTesting.Attributes.XYZAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[2;32m'hello'\u001b[0m\u001b[1;2m)\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m-- Write \u001b[0m\u001b[2;32m'hello'\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m to the XYZ attribute on the test cluster to endpoint\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mReturns:\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m - \u001b[0m\u001b[1;2m[\u001b[0m\u001b[2mAttributeStatus\u001b[0m\u001b[1;2m]\u001b[0m\u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mlist - one for each path\u001b[0m\u001b[1;2m)\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[3;33mWriteGroupAttribute\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mWriteGroupAttribute\u001b[0m\u001b[1m(\u001b[0mgroupid: \u001b[32m'int'\u001b[0m, attributes: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32m'typing.List\u001b[0m\u001b[32m[\u001b[0m\u001b[32mtyping.Tuple\u001b[0m\u001b[32m[\u001b[0m\u001b[32mClusterObjects.ClusterAttribu…\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m, busyWaitMs: \u001b[32m'typing.Optional\u001b[0m\u001b[32m[\u001b[0m\u001b[32mint\u001b[0m\u001b[32m]\u001b[0m\u001b[32m'\u001b[0m = \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mWrite a list of attributes on a target group.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mgroupid: Group ID to send write attribute to.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mattributes: A list of tuples of type \u001b[0m\u001b[1;2m(\u001b[0m\u001b[2mcluster-object, \u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mdata-version\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m. The data-version can be omitted.\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2mE.g\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[2m \u001b[0m\u001b[1;2m(\u001b[0m\u001b[1;2;35mClusters.UnitTesting.Attributes.XYZAttribute\u001b[0m\u001b[1;2m(\u001b[0m\u001b[2;32m'hell…\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;2;36m1\u001b[0m\u001b[1;2m)\u001b[0m\u001b[2m -- Group Write \u001b[0m\u001b[2;32m'hello'\u001b[0m\u001b[2m with data version \u001b[0m\u001b[1;2;36m1\u001b[0m \u001b[34m│\u001b[0m\n", + "\u001b[34m╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" ] }, "metadata": {}, @@ -917,18 +2073,18 @@ { "data": { "text/html": [ - "
╭─────────── <function mattersetlog at 0x115ea1670> ───────────╮\n",
+       "
╭───────── <function mattersetlog at 0x78e55d1fba30> ──────────╮\n",
        " def mattersetlog(level):                                     \n",
        "                                                              \n",
-       " 35 attribute(s) not shown. Run inspect(inspect) for options. \n",
+       " 36 attribute(s) not shown. Run inspect(inspect) for options. \n",
        "╰──────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ - "\u001b[34m╭─\u001b[0m\u001b[34m────────── \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mfunction\u001b[0m\u001b[39m mattersetlog at \u001b[0m\u001b[1;36m0x115ea1670\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m ──────────\u001b[0m\u001b[34m─╮\u001b[0m\n", + "\u001b[34m╭─\u001b[0m\u001b[34m────────\u001b[0m\u001b[34m \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mfunction\u001b[0m\u001b[39m mattersetlog at \u001b[0m\u001b[1;36m0x78e55d1fba30\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m \u001b[0m\u001b[34m─────────\u001b[0m\u001b[34m─╮\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[3;96mdef \u001b[0m\u001b[1;31mmattersetlog\u001b[0m\u001b[1m(\u001b[0mlevel\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;36m35\u001b[0m\u001b[3m attribute(s) not shown.\u001b[0m Run \u001b[1;35minspect\u001b[0m\u001b[1m(\u001b[0minspect\u001b[1m)\u001b[0m for options. \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;36m36\u001b[0m\u001b[3m attribute(s) not shown.\u001b[0m Run \u001b[1;35minspect\u001b[0m\u001b[1m(\u001b[0minspect\u001b[1m)\u001b[0m for options. \u001b[34m│\u001b[0m\n", "\u001b[34m╰──────────────────────────────────────────────────────────────╯\u001b[0m\n" ] }, @@ -938,26 +2094,26 @@ { "data": { "text/html": [ - "
╭───────────────── <function mattersetdebug at 0x115ea1700> ──────────────────╮\n",
+       "
╭──────────────── <function mattersetdebug at 0x78e55d1fb7f0> ────────────────╮\n",
        " def mattersetdebug(enableDebugMode: bool = True):                           \n",
        "                                                                             \n",
        " Enables debug mode that is utilized by some Matter modules                  \n",
        " to better facilitate debugging of failures (e.g throwing exceptions instead \n",
        " of returning well-formatted results).                                       \n",
        "                                                                             \n",
-       " 35 attribute(s) not shown. Run inspect(inspect) for options.                \n",
+       " 36 attribute(s) not shown. Run inspect(inspect) for options.                \n",
        "╰─────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ - "\u001b[34m╭─\u001b[0m\u001b[34m──────────────── \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mfunction\u001b[0m\u001b[39m mattersetdebug at \u001b[0m\u001b[1;36m0x115ea1700\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m ─────────────────\u001b[0m\u001b[34m─╮\u001b[0m\n", + "\u001b[34m╭─\u001b[0m\u001b[34m───────────────\u001b[0m\u001b[34m \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mfunction\u001b[0m\u001b[39m mattersetdebug at \u001b[0m\u001b[1;36m0x78e55d1fb7f0\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m \u001b[0m\u001b[34m───────────────\u001b[0m\u001b[34m─╮\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[3;96mdef \u001b[0m\u001b[1;31mmattersetdebug\u001b[0m\u001b[1m(\u001b[0menableDebugMode: bool = \u001b[3;92mTrue\u001b[0m\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[36mEnables debug mode that is utilized by some Matter modules\u001b[0m \u001b[34m│\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[36mto better facilitate debugging of failures \u001b[0m\u001b[1;36m(\u001b[0m\u001b[36me.g throwing exceptions instead\u001b[0m \u001b[34m│\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[36mof returning well-formatted results\u001b[0m\u001b[1;36m)\u001b[0m\u001b[36m.\u001b[0m \u001b[34m│\u001b[0m\n", "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;36m35\u001b[0m\u001b[3m attribute(s) not shown.\u001b[0m Run \u001b[1;35minspect\u001b[0m\u001b[1m(\u001b[0minspect\u001b[1m)\u001b[0m for options. \u001b[34m│\u001b[0m\n", + "\u001b[34m│\u001b[0m \u001b[1;36m36\u001b[0m\u001b[3m attribute(s) not shown.\u001b[0m Run \u001b[1;35minspect\u001b[0m\u001b[1m(\u001b[0minspect\u001b[1m)\u001b[0m for options. \u001b[34m│\u001b[0m\n", "\u001b[34m╰─────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" ] }, @@ -986,41 +2142,57 @@ { "data": { "text/html": [ - "
╭─ <bound method ChipDeviceController.SendCommand of <chip.ChipDeviceCtrl.ChipDeviceControl─╮\n",
-       " def ChipDeviceController.SendCommand(nodeid: int, endpoint: int, payload:                 \n",
-       " chip.clusters.ClusterObjects.ClusterCommand, responseType=None, timedRequestTimeoutMs:    \n",
-       " int = None):                                                                              \n",
-       "                                                                                           \n",
-       " Send a cluster-object encapsulated command to a node and get returned a future that can   \n",
-       " be awaited upon to receive the response.                                                  \n",
-       " If a valid responseType is passed in, that will be used to deserialize the object. If     \n",
-       " not, the type will be automatically deduced                                               \n",
-       " from the metadata received over the wire.                                                 \n",
-       "                                                                                           \n",
-       " timedWriteTimeoutMs: Timeout for a timed invoke request. Omit or set to 'None' to         \n",
-       " indicate a non-timed request.                                                             \n",
-       "                                                                                           \n",
-       " 27 attribute(s) not shown. Run inspect(inspect) for options.                              \n",
-       "╰───────────────────────────────────────────────────────────────────────────────────────────╯\n",
+       "
╭─ <bound method ChipDeviceControllerBase.SendCommand of <chip.ChipDeviceCtrl.ChipDeviceController object at 0x78─╮\n",
+       " async def ChipDeviceControllerBase.SendCommand(nodeid: 'int', endpoint: 'int', payload:                         \n",
+       " 'ClusterObjects.ClusterCommand', responseType=None, timedRequestTimeoutMs: 'typing.Optional[int]' = None,       \n",
+       " interactionTimeoutMs: 'typing.Optional[int]' = None, busyWaitMs: 'typing.Optional[int]' = None,                 \n",
+       " suppressResponse: 'typing.Optional[bool]' = None, payloadCapability: 'int' = 0):                                \n",
+       "                                                                                                                 \n",
+       " Send a cluster-object encapsulated command to a node and get returned a future that can be awaited upon to      \n",
+       " receive                                                                                                         \n",
+       " the response. If a valid responseType is passed in, that will be used to de-serialize the object. If not,       \n",
+       " the type will be automatically deduced from the metadata received over the wire.                                \n",
+       "                                                                                                                 \n",
+       " timedWriteTimeoutMs: Timeout for a timed invoke request. Omit or set to 'None' to indicate a non-timed request. \n",
+       " interactionTimeoutMs: Overall timeout for the interaction. Omit or set to 'None' to have the SDK automatically  \n",
+       " compute the                                                                                                     \n",
+       "                       right timeout value based on transport characteristics as well as the responsiveness of   \n",
+       " the target.                                                                                                     \n",
+       "                                                                                                                 \n",
+       " Returns:                                                                                                        \n",
+       "     - command response. The type of the response is defined by the command.                                     \n",
+       " Raises:                                                                                                         \n",
+       "     - InteractionModelError on error                                                                            \n",
+       "                                                                                                                 \n",
+       " 27 attribute(s) not shown. Run inspect(inspect) for options.                                                    \n",
+       "╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯\n",
        "
\n" ], "text/plain": [ - "\u001b[34m╭─\u001b[0m\u001b[34m \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mbound\u001b[0m\u001b[39m method ChipDeviceController.SendCommand of \n", - "{\n", - "'value': [\n", - "│ │ 1,\n", - "│ │ 2,\n", - "│ │ 3,\n", - "│ │ 4,\n", - "│ │ [\n", - "│ │ │ 1,\n", - "│ │ │ 2\n", - "│ │ ]\n", - "]\n", - "}\n", - "
\n" + "
\n"
       ],
+      "text/plain": []
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
       "text/plain": [
        "\n",
        "\u001b[1m{\u001b[0m\n",
@@ -1117,11 +2283,12 @@
        "\u001b[2;32m│   │   │   \u001b[0m\u001b[1;36m2\u001b[0m\n",
        "\u001b[2;32m│   │   \u001b[0m\u001b[1m]\u001b[0m\n",
        "\u001b[2;32m│   \u001b[0m\u001b[1m]\u001b[0m\n",
-       "\u001b[1m}\u001b[0m\n"
+       "\u001b[1m}\u001b[0m"
       ]
      },
+     "execution_count": 7,
      "metadata": {},
-     "output_type": "display_data"
+     "output_type": "execute_result"
     }
    ],
    "source": [
@@ -1132,9 +2299,9 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "matter-env",
+   "display_name": "Python 3 (ipykernel)",
    "language": "python",
-   "name": "matter-env"
+   "name": "python3"
   },
   "language_info": {
    "codemirror_mode": {
@@ -1146,7 +2313,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.2+chromium.10"
+   "version": "3.10.12"
   }
  },
  "nbformat": 4,
diff --git a/docs/development_controllers/chip-repl/python_chip_controller_building.md b/docs/development_controllers/chip-repl/python_chip_controller_building.md
index aa49adad246f5e..d5d660db7231b3 100644
--- a/docs/development_controllers/chip-repl/python_chip_controller_building.md
+++ b/docs/development_controllers/chip-repl/python_chip_controller_building.md
@@ -103,6 +103,8 @@ To build and run the Python CHIP controller:
     chip-repl
     ```
 
+NOTE: To get more verbose logs, pass the debug flag: `chip-repl --debug`
+
 
## Using Python CHIP Controller REPL for Matter accessory testing @@ -133,8 +135,8 @@ An uncommissioned accessory device advertises over Bluetooth LE or via mDNS if already on the network. Run the following command to scan all advertised Matter devices: -``` -devCtrl.DiscoverCommissionableNodes() +```python +await devCtrl.DiscoverCommissionableNodes() ``` ### Step 4: Set network pairing credentials @@ -173,7 +175,7 @@ network interface, such as Thread or Wi-Fi. 2. Set the previously obtained Active Operational Dataset as a byte array using the following command: - ``` + ```python thread_dataset = bytes.fromhex("0e080000000000010000000300001335060004001fffe002084fe76e9a8b5edaf50708fde46f999f0698e20510d47f5027a414ffeebaefa92285cc84fa030f4f70656e5468726561642d653439630102e49c0410b92f8c7fbb4f9f3e08492ee3915fbd2f0c0402a0fff8") devCtrl.SetThreadOperationalDataset(thread_dataset) ``` @@ -183,7 +185,7 @@ network interface, such as Thread or Wi-Fi. Assuming your Wi-Fi SSID is _TESTSSID_, and your Wi-Fi password is _P455W4RD_, set the credentials to the controller by executing the following command: -``` +```python devCtrl.SetWiFiCredentials(, ) ``` @@ -213,8 +215,8 @@ with the following assumptions for the Matter accessory device: - The setup pin code of the device is _20202021_ - The temporary Node ID is _1234_ -``` -devCtrl.ConnectBLE(3840, 20202021, 1234) +```python +await devCtrl.ConnectBLE(3840, 20202021, 1234) ``` You can skip the last parameter, the Node ID, in the command. If you skip it, @@ -230,8 +232,8 @@ CHIP:SVR: SetupQRCode: [MT:-24J0AFN00KA0648G00] Use the following command to commission the device with the QR code: -``` -devCtrl.CommissionWithCode("MT:-24J0AFN00KA0648G00", 1234) +```python +await devCtrl.CommissionWithCode("MT:-24J0AFN00KA0648G00", 1234) ``` After connecting the device over Bluetooth LE, the controller will go through @@ -262,14 +264,14 @@ the following stages: For the light bulb example, execute the following command to toggle the LED state: -``` +```python await devCtrl.SendCommand(1234, 1, Clusters.OnOff.Commands.Toggle()) ``` To change the brightness of the LED, use the following command, with the level value somewhere between 0 and 255. -``` +```python commandToSend = LevelControl.Commands.MoveToLevel(level=50, transitionTime=Null, optionsMask=0, optionsOverride=0) await devCtrl.SendCommand(1234, 1, commandToSend) ``` @@ -281,7 +283,7 @@ maintains collection of attributes that a controller can obtain from a device, such as the vendor name, the product name, or software version. Use `ReadAttribute()` command to read those values from the device: -``` +```python attributes = [ (0, Clusters.BasicInformation.Attributes.VendorName), (0, Clusters.BasicInformation.Attributes.ProductName), @@ -309,7 +311,7 @@ the full list of available commands. Provides the controller with Thread network credentials that will be used in the device commissioning procedure to configure the device with a Thread interface. -``` +```python thread_dataset = bytes.fromhex("0e080000000000010000000300001335060004001fffe002084fe76e9a8b5edaf50708fde46f999f0698e20510d47f5027a414ffeebaefa92285cc84fa030f4f70656e5468726561642d653439630102e49c0410b92f8c7fbb4f9f3e08492ee3915fbd2f0c0402a0fff8") devCtrl.SetThreadOperationalDataset(thread_dataset) ``` @@ -319,7 +321,7 @@ devCtrl.SetThreadOperationalDataset(thread_dataset) Provides the controller with Wi-Fi network credentials that will be used in the device commissioning procedure to configure the device with a Wi-Fi interface. -``` +```python devCtrl.SetWiFiCredentials('TESTSSID', 'P455W4RD') ``` @@ -328,8 +330,8 @@ devCtrl.SetWiFiCredentials('TESTSSID', 'P455W4RD') Commission with the given nodeid from the setupPayload. setupPayload may be a QR or the manual setup code. -``` -devCtrl.CommissionWithCode("MT:-24J0AFN00KA0648G00", 1234) +```python +await devCtrl.CommissionWithCode("MT:-24J0AFN00KA0648G00", 1234) ``` ### `SendCommand(: int, : int, Clusters..Commands.())` diff --git a/docs/guides/BUILDING.md b/docs/guides/BUILDING.md index 6fc46950465fb9..ae58952628c477 100644 --- a/docs/guides/BUILDING.md +++ b/docs/guides/BUILDING.md @@ -589,30 +589,77 @@ SDK source code has been executed. It also provides information on how often the Matter SDK executes segments of the code and produces a copy of the source file, annotated with execution frequencies. -Run the following command to initiate the script: +### How to Run + +``` +./scripts/build_coverage.sh [OPTIONS] +``` + +By default, the script + +Builds the Matter SDK with coverage instrumentation (unless you specify a custom +--output_root). Runs the unit tests to generate coverage data. Produces an HTML +coverage report located at: + +``` +out/coverage/coverage/html/index.html +``` + +You can extend the coverage scope and test types with the following options: + +Option Description -c, --code= Specify the scope to collect coverage +data. - core (default): Coverage from the core Matter SDK stack - clusters: +Coverage from cluster implementations - all: Coverage from the entire Matter SDK + +--yaml Also run YAML-based tests, in addition to unit tests. + +--python Also run Python-based tests, in addition to unit tests. + +-o, --output_root=DIR If specified, skip the build phase and only run coverage +on the provided build output directory. This directory must have been built with +use_coverage=true and have had tests run already. + +--target= When running unit tests, specifies a particular test target +to run (e.g., TestEmberAttributeBuffer.run). + +-h, --help Print script usage and exit. + +### Examples + +Run coverage with the default scope (core) and only unit tests: ``` ./scripts/build_coverage.sh ``` -By default, the code coverage script is performed at the unit testing level. -Unit tests are created by developers, thus giving them the best overview of what -tests to include in unit testing. You can extend the coverage test by scope and -ways of execution with the following parameters: +Run coverage including YAML tests (plus the always-enabled unit tests): + +``` +./scripts/build_coverage.sh --yaml +``` + +Run coverage including Python tests (plus the always-enabled unit tests): ``` - -c, --code Specify which scope to collect coverage data. - 'core': collect coverage data from core stack in Matter SDK. --default - 'clusters': collect coverage data from clusters implementation in Matter SDK. - 'all': collect coverage data from Matter SDK. - -t, --tests Specify which tools to run the coverage check. - 'unit': Run unit test to drive the coverage check. --default - 'yaml': Run yaml test to drive the coverage check. - 'all': Run unit & yaml test to drive the coverage check. +./scripts/build_coverage.sh --python ``` -Also, see the up-to-date unit testing coverage report of the Matter SDK -(collected daily) at: +Run coverage including both YAML and Python tests: + +``` +./scripts/build_coverage.sh --yaml --python +``` + +Change coverage scope to all (core + clusters) and run YAML tests: + +``` +./scripts/build_coverage.sh --code=all --yaml +``` + +### Viewing Coverage Results + +After the script completes, open the following file in your web browser to view +the HTML coverage report: [matter coverage](https://matter-build-automation.ue.r.appspot.com). ## Maintaining Matter diff --git a/docs/platforms/android/android_building.md b/docs/platforms/android/android_building.md index 8bc480568e2230..830ff11ed3fb4b 100644 --- a/docs/platforms/android/android_building.md +++ b/docs/platforms/android/android_building.md @@ -21,7 +21,8 @@ There are following Apps on Android - [Linux](#linux) - [MacOS](#macos) - [ABIs and TARGET_CPU](#abis-and-target_cpu) - - [Gradle & JDK Version](#gradle--jdk-version) + - [Gradle \& JDK Version](#gradle--jdk-version) + - [Kotlin Version](#kotlin-version) - [Preparing for build](#preparing-for-build) - [Building Android CHIPTool from scripts](#building-android-chiptool-from-scripts) - [Building Android CHIPTool from Android Studio](#building-android-chiptool-from-android-studio) @@ -45,7 +46,7 @@ directory. You need Android SDK 26 & NDK 23.2.8568313 downloaded to your machine. Set the `$ANDROID_HOME` environment variable to where the SDK is downloaded and the `$ANDROID_NDK_HOME` environment variable to point to where the NDK package is -downloaded. The build also requires `kotlinc` to be in your `$PATH`. +downloaded. 1. Install [Android Studio](https://developer.android.com/studio) 2. Install NDK: @@ -97,22 +98,44 @@ architecture: ### Gradle & JDK Version -We are using Gradle 7.1.1 for all android project which does not support Java 17 -(https://docs.gradle.org/current/userguide/compatibility.html) while the default -JDK version on MacOS for Apple Silicon is 'openjdk 17.0.1' or above. +All Android projects utilize Gradle version 7.3.3 and JDK version 17.0. -Using JDK bundled with Android Studio will help with that. +For developer using openjdk-17-jdk in MacOS, the JAVA_HOME environment variable +can be configured as follows via `sdkman`: -Android Studio Dolphin and below: +``` +sdk install java 17.0.4.1-tem +``` + +For developer using openjdk-17-jdk in Linux, the JAVA_HOME environment variable +can be configured as follows: -```shell -export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jre/Contents/Home/ +``` +sudo apt-get install openjdk-17-jdk +export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 ``` -Android Studio Electric Eel 2022.1.1 and above: + -```shell -export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home/ +### Kotlin Version + +The build requires `kotlinc` to be in your `$PATH`. + +For Linux: + +``` +cd /usr/lib +wget -q https://github.com/JetBrains/kotlin/releases/download/v2.1.10/kotlin-compiler-2.1.10.zip +unzip kotlin-compiler-*.zip +rm kotlin-compiler-*.zip +rm -f kotlinc/bin/*.bat +export PATH=$PATH:/usr/lib/kotlinc/bin +``` + +For MacOS: + +``` +sdk install kotlin 2.1.10 ```
diff --git a/docs/platforms/esp32/config_options.md b/docs/platforms/esp32/config_options.md index 6dc94b814b8335..8055efb885c142 100644 --- a/docs/platforms/esp32/config_options.md +++ b/docs/platforms/esp32/config_options.md @@ -15,14 +15,12 @@ CONFIG_LWIP_IPV4=n ### Executable component not in "main" component The ESP-IDF framework allows renaming the main component, which can be useful if -you want to place the app_main() function in a different component. +you want to place the `app_main()` function in a different component. For required changes in the executable component, please refer to the [esp-idf documentation](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/build-system.html#renaming-main-component). -If you're building applications that support Matter and want to place app_main() -in a component other than main, use the following command: - -``` -idf.py -DEXECUTABLE_COMPONENT_NAME="your_component" build -``` +You need to list the required components in `idf_component_register()`. If this +module contains Matter related code, you may need to include +`chip, app_update, spi_flash, and nvs_flash` as `PRIV_REQUIRES`, along with any +other necessary dependencies. diff --git a/docs/tools/index.md b/docs/tools/index.md index a2ff8fd1587f89..1f7d68c47b77e1 100644 --- a/docs/tools/index.md +++ b/docs/tools/index.md @@ -28,6 +28,7 @@ Source files for these tools are located at `scripts/tools`. ../scripts/tools/memory/README ../scripts/tools/spake2p/README +../scripts/tools/ELF_SIZE_TOOLING ``` 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 index a869118b57fb33..983d6041435f73 100644 --- a/examples/air-purifier-app/air-purifier-common/air-purifier-app.zap +++ b/examples/air-purifier-app/air-purifier-common/air-purifier-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2109,14 +2111,16 @@ "code": 45, "profileId": 259, "label": "MA-air-purifier", - "name": "MA-air-purifier" + "name": "MA-air-purifier", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 45, "profileId": 259, "label": "MA-air-purifier", - "name": "MA-air-purifier" + "name": "MA-air-purifier", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2219,22 +2223,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2389,22 +2377,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2601,22 +2573,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2813,22 +2769,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3121,22 +3061,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3196,14 +3120,16 @@ "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3298,22 +3224,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3468,22 +3378,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3590,22 +3484,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3872,22 +3750,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4154,22 +4016,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4436,22 +4282,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4718,22 +4548,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5000,22 +4814,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5282,22 +5080,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5564,22 +5346,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5846,22 +5612,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6128,22 +5878,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6410,22 +6144,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6485,14 +6203,16 @@ "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -6595,22 +6315,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6765,22 +6469,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6935,22 +6623,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7010,14 +6682,16 @@ "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -7120,22 +6794,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7290,22 +6948,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7460,22 +7102,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7535,14 +7161,16 @@ "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -7645,22 +7273,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7815,22 +7427,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -8043,22 +7639,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, 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 03d4b9edfb3669..d99c2452b05671 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 @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3720,14 +3722,16 @@ "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3822,22 +3826,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3992,22 +3980,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4114,22 +4086,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4268,22 +4224,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4422,22 +4362,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4576,22 +4500,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4730,22 +4638,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4884,22 +4776,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5038,22 +4914,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5192,22 +5052,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5346,22 +5190,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5500,22 +5328,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5654,22 +5466,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5808,22 +5604,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5962,22 +5742,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/air-quality-sensor-app/telink/README.md b/examples/air-quality-sensor-app/telink/README.md index c3d403f450ee45..8d8a9132be5a9f 100644 --- a/examples/air-quality-sensor-app/telink/README.md +++ b/examples/air-quality-sensor-app/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash 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 c3586287ea4285..4949c94a7b641a 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 @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -18047,10 +18047,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "10", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -23924,10 +23924,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "10", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/all-clusters-app/ameba/README.md b/examples/all-clusters-app/ameba/README.md index cfe8e68f69202f..d00ff787640d1a 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:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/all-clusters-app/telink/README.md b/examples/all-clusters-app/telink/README.md index b702fd6e3567db..b4f746d388afdd 100644 --- a/examples/all-clusters-app/telink/README.md +++ b/examples/all-clusters-app/telink/README.md @@ -14,7 +14,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap index 82b1b2440303b7..8adf8fb9ca62bc 100644 --- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap +++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,20 +41,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -313,22 +316,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -557,22 +544,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -912,22 +883,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1240,22 +1195,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1362,22 +1301,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1468,22 +1391,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1638,22 +1545,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1874,22 +1765,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2230,22 +2105,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2494,22 +2353,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3340,22 +3183,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3640,22 +3467,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3860,22 +3671,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4141,20 +3936,23 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -4259,22 +4057,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4463,22 +4245,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4699,22 +4465,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5057,22 +4807,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5359,22 +5093,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6164,22 +5882,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -10527,20 +10229,23 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -10645,22 +10350,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -10849,22 +10538,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -11085,22 +10758,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -11255,22 +10912,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -11425,22 +11066,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -11686,22 +11311,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -11851,14 +11460,16 @@ "code": 25, "profileId": 259, "label": "MA-secondary-network-interface", - "name": "MA-secondary-network-interface" + "name": "MA-secondary-network-interface", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 25, "profileId": 259, "label": "MA-secondary-network-interface", - "name": "MA-secondary-network-interface" + "name": "MA-secondary-network-interface", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -11975,22 +11586,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -12283,22 +11878,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/all-clusters-minimal-app/ameba/README.md b/examples/all-clusters-minimal-app/ameba/README.md index 731168b86a60c9..e57074ae1621ec 100644 --- a/examples/all-clusters-minimal-app/ameba/README.md +++ b/examples/all-clusters-minimal-app/ameba/README.md @@ -27,13 +27,13 @@ The CHIP demo application is supported on - Pull docker image: ``` - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 ``` - Run docker container: ``` - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 ``` - Setup build environment: diff --git a/examples/all-clusters-minimal-app/telink/README.md b/examples/all-clusters-minimal-app/telink/README.md index 33ad1fb6cf9f8d..add462a22d9ebf 100644 --- a/examples/all-clusters-minimal-app/telink/README.md +++ b/examples/all-clusters-minimal-app/telink/README.md @@ -14,7 +14,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/android/CHIPTest/build.gradle b/examples/android/CHIPTest/build.gradle index edbb8003b1fca6..c8bc7b42700d05 100644 --- a/examples/android/CHIPTest/build.gradle +++ b/examples/android/CHIPTest/build.gradle @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = "1.8.10" + ext.kotlin_version = "2.0.0" repositories { google() mavenCentral() } dependencies { - classpath "com.android.tools.build:gradle:4.2.2" + classpath "com.android.tools.build:gradle:7.1.3" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/examples/android/CHIPTest/gradle.properties b/examples/android/CHIPTest/gradle.properties index a85d072fd2e1ed..0fb7a4bde02955 100644 --- a/examples/android/CHIPTest/gradle.properties +++ b/examples/android/CHIPTest/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/examples/android/CHIPTest/gradle/wrapper/gradle-wrapper.properties b/examples/android/CHIPTest/gradle/wrapper/gradle-wrapper.properties index f24728e6c60540..795d316d2f0075 100644 --- a/examples/android/CHIPTest/gradle/wrapper/gradle-wrapper.properties +++ b/examples/android/CHIPTest/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Aug 16 17:10:29 CST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/examples/android/CHIPTool/build.gradle b/examples/android/CHIPTool/build.gradle index 01e651929f8ec6..bda89b123d6c3d 100644 --- a/examples/android/CHIPTool/build.gradle +++ b/examples/android/CHIPTool/build.gradle @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.8.10' + ext.kotlin_version = '2.0.0' repositories { google() mavenCentral() } dependencies { - classpath "com.android.tools.build:gradle:4.2.0" + classpath "com.android.tools.build:gradle:7.1.3" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/examples/android/CHIPTool/gradle.properties b/examples/android/CHIPTool/gradle.properties index 71f72db8c81ef2..dbf2f4443b2778 100644 --- a/examples/android/CHIPTool/gradle.properties +++ b/examples/android/CHIPTool/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/examples/android/CHIPTool/gradle/wrapper/gradle-wrapper.properties b/examples/android/CHIPTool/gradle/wrapper/gradle-wrapper.properties index 05679dc3c18669..2e6e5897b5285c 100644 --- a/examples/android/CHIPTool/gradle/wrapper/gradle-wrapper.properties +++ b/examples/android/CHIPTool/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/examples/bridge-app/bridge-common/bridge-app.zap b/examples/bridge-app/bridge-common/bridge-app.zap index 3dc8efff76af5a..5ba31d456f61be 100644 --- a/examples/bridge-app/bridge-common/bridge-app.zap +++ b/examples/bridge-app/bridge-common/bridge-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/bridge-app/telink/README.md b/examples/bridge-app/telink/README.md index 00b050e93c945e..844493241d1a12 100644 --- a/examples/bridge-app/telink/README.md +++ b/examples/bridge-app/telink/README.md @@ -91,7 +91,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/chef/common/stubs.cpp b/examples/chef/common/stubs.cpp index 8c389028cd0530..16e9b1b8694c64 100644 --- a/examples/chef/common/stubs.cpp +++ b/examples/chef/common/stubs.cpp @@ -336,11 +336,11 @@ void emberAfWakeOnLanClusterInitCallback(EndpointId endpoint) void ApplicationInit() { - ChipLogProgress(NotSpecified, "Chef Application Init !!!") + ChipLogProgress(NotSpecified, "Chef Application Init !!!"); #ifdef MATTER_DM_PLUGIN_REFRIGERATOR_ALARM_SERVER - // set Parent Endpoint and Composition Type for an Endpoint - EndpointId kRefEndpointId = 1; + // set Parent Endpoint and Composition Type for an Endpoint + EndpointId kRefEndpointId = 1; EndpointId kColdCabinetEndpointId = 2; EndpointId kFreezeCabinetEndpointId = 3; SetTreeCompositionForEndpoint(kRefEndpointId); @@ -354,7 +354,7 @@ void ApplicationInit() void ApplicationShutdown() { - ChipLogProgress(NotSpecified, "Chef Application Down !!!") + ChipLogProgress(NotSpecified, "Chef Application Down !!!"); } // No-op function, used to force linking this file, diff --git a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap index c72734d55cecc1..0b3dc7d63a4af0 100644 --- a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap +++ b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3586,14 +3588,16 @@ "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap index 2530faaa456ce3..b867c1480495c0 100644 --- a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap +++ b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2283,14 +2285,16 @@ "code": 45, "profileId": 259, "label": "MA-air-purifier", - "name": "MA-air-purifier" + "name": "MA-air-purifier", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 45, "profileId": 259, "label": "MA-air-purifier", - "name": "MA-air-purifier" + "name": "MA-air-purifier", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2385,22 +2389,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2533,22 +2521,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2703,22 +2675,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2915,22 +2871,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3127,22 +3067,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3435,22 +3359,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.zap b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.zap index 53956dbbdd230f..9885c2e1a5d21b 100644 --- a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.zap +++ b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1928,14 +1930,16 @@ "code": 45, "profileId": 259, "label": "MA-air-purifier", - "name": "MA-air-purifier" + "name": "MA-air-purifier", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 45, "profileId": 259, "label": "MA-air-purifier", - "name": "MA-air-purifier" + "name": "MA-air-purifier", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2038,22 +2042,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2242,22 +2230,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2412,22 +2384,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2624,22 +2580,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2836,22 +2776,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3144,22 +3068,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3219,14 +3127,16 @@ "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3321,22 +3231,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3491,22 +3385,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3613,22 +3491,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3895,22 +3757,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4177,22 +4023,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4459,22 +4289,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4741,22 +4555,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5023,22 +4821,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5305,22 +5087,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5587,22 +5353,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5869,22 +5619,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6151,22 +5885,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6433,22 +6151,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6508,14 +6210,16 @@ "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -6618,22 +6322,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6788,22 +6476,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6958,22 +6630,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7033,14 +6689,16 @@ "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -7143,22 +6801,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7313,22 +6955,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7483,22 +7109,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7558,14 +7168,16 @@ "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -7668,22 +7280,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7838,22 +7434,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -8098,22 +7678,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap index bd93cb017f5645..4d59f2ce8c3901 100644 --- a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap +++ b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2283,14 +2285,16 @@ "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 44, "profileId": 259, "label": "MA-air-quality-sensor", - "name": "MA-air-quality-sensor" + "name": "MA-air-quality-sensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2385,22 +2389,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2555,22 +2543,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2885,22 +2857,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3023,22 +2979,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3193,22 +3133,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3363,22 +3287,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3645,22 +3553,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3927,22 +3819,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4209,22 +4085,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4491,22 +4351,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4773,22 +4617,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5055,22 +4883,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5337,22 +5149,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5619,22 +5415,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5901,22 +5681,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6183,22 +5947,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap index 0bb3ed63d078d9..f3a620a055e373 100644 --- a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap +++ b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 40, "profileId": 259, "label": "MA-basic-videoplayer", - "name": "MA-basic-videoplayer" + "name": "MA-basic-videoplayer", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 40, "profileId": 259, "label": "MA-basic-videoplayer", - "name": "MA-basic-videoplayer" + "name": "MA-basic-videoplayer", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2393,22 +2397,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2563,22 +2551,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2685,22 +2657,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2873,22 +2829,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3029,22 +2969,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3354,22 +3278,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3535,22 +3443,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3651,22 +3543,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3775,22 +3651,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3931,22 +3791,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4006,14 +3850,16 @@ "code": 34, "profileId": 259, "label": "MA-speaker", - "name": "MA-speaker" + "name": "MA-speaker", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 34, "profileId": 259, "label": "MA-speaker", - "name": "MA-speaker" + "name": "MA-speaker", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4116,22 +3962,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4264,22 +4094,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4516,22 +4330,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4686,22 +4484,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap index fc2f45d22b7dc6..e47824f7685f61 100644 --- a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap +++ b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2233,14 +2235,16 @@ "code": 268, "profileId": 259, "label": "MA-colortemperaturelight", - "name": "MA-colortemperaturelight" + "name": "MA-colortemperaturelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 268, "profileId": 259, "label": "MA-colortemperaturelight", - "name": "MA-colortemperaturelight" + "name": "MA-colortemperaturelight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap index 0e390cdb7f4a13..88d6f1d1ff0804 100644 --- a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap +++ b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,20 +2293,23 @@ "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2409,22 +2414,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2893,22 +2882,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap index bab2b45d7a4f5c..ef452c9d0d72f4 100644 --- a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap +++ b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,20 +2293,23 @@ "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -3089,22 +3094,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3211,22 +3200,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_contactsensor_lightsensor_occupancysensor_temperaturesensor_pressuresensor_flowsensor_humiditysensor_airqualitysensor_powersource_367e7cea91.zap b/examples/chef/devices/rootnode_contactsensor_lightsensor_occupancysensor_temperaturesensor_pressuresensor_flowsensor_humiditysensor_airqualitysensor_powersource_367e7cea91.zap index 05d1c22eb23062..6e6b2f98c3bc2f 100644 --- a/examples/chef/devices/rootnode_contactsensor_lightsensor_occupancysensor_temperaturesensor_pressuresensor_flowsensor_humiditysensor_airqualitysensor_powersource_367e7cea91.zap +++ b/examples/chef/devices/rootnode_contactsensor_lightsensor_occupancysensor_temperaturesensor_pressuresensor_flowsensor_humiditysensor_airqualitysensor_powersource_367e7cea91.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap index 2e215aa472f07a..4ac9eb780a4d12 100644 --- a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap +++ b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2323,14 +2325,16 @@ "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.zap b/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.zap index 3ba91647fadc90..01f5ba46043293 100644 --- a/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.zap +++ b/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 267, "profileId": 259, "label": "MA-dimmablepluginunit", - "name": "MA-dimmablepluginunit" + "name": "MA-dimmablepluginunit", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 267, "profileId": 259, "label": "MA-dimmablepluginunit", - "name": "MA-dimmablepluginunit" + "name": "MA-dimmablepluginunit", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2401,22 +2405,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2605,22 +2593,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2841,22 +2813,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3125,22 +3081,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3295,22 +3235,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3548,22 +3472,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap b/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap index 3ad6e7deb236e0..db9648ba10cd21 100644 --- a/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap +++ b/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -900,7 +902,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -916,7 +918,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -932,23 +934,7 @@ "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": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -964,7 +950,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2808,14 +2794,16 @@ "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3050,22 +3038,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3259,10 +3231,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "3", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3384,22 +3356,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3540,22 +3496,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3728,22 +3668,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap index 1c9d2505fc684a..3fdf68887366c1 100644 --- a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap +++ b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,20 +2293,23 @@ "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2409,22 +2414,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2579,22 +2568,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2893,22 +2866,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3649,22 +3606,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap index c5008df0c2ad30..f1bfab36f73b3a 100644 --- a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap +++ b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap b/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap index 39239eaef90230..790dd1d52a5773 100644 --- a/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap +++ b/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap index b1a23b03ad6d3d..35a9468a241bf5 100644 --- a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap +++ b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 774, "profileId": 259, "label": "MA-flowsensor", - "name": "MA-flowsensor" + "name": "MA-flowsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 774, "profileId": 259, "label": "MA-flowsensor", - "name": "MA-flowsensor" + "name": "MA-flowsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap b/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap index 6860a53833d87f..7b88c8d5368811 100644 --- a/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap +++ b/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1928,20 +1930,23 @@ "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2046,22 +2051,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2232,22 +2221,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2546,22 +2519,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2684,22 +2641,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap index 79ec3559c8319f..86fdf7ce19432c 100644 --- a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap +++ b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1928,20 +1930,23 @@ "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2046,22 +2051,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2232,22 +2221,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2546,22 +2519,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2684,22 +2641,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap index 9c52de3b16f942..761124d6e52f12 100644 --- a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap +++ b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 768, "profileId": 259, "label": "MA-heatcool", - "name": "MA-heatcool" + "name": "MA-heatcool", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 768, "profileId": 259, "label": "MA-heatcool", - "name": "MA-heatcool" + "name": "MA-heatcool", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_heatpump_87ivjRAECh.zap b/examples/chef/devices/rootnode_heatpump_87ivjRAECh.zap index e05f413a910b46..93108596b55037 100644 --- a/examples/chef/devices/rootnode_heatpump_87ivjRAECh.zap +++ b/examples/chef/devices/rootnode_heatpump_87ivjRAECh.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -2449,7 +2449,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4382,6 +4382,4 @@ "parentEndpointIdentifier": null } ] -} - - +} \ No newline at end of file diff --git a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap index f62c601c05aecf..fbb878242bb837 100644 --- a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap +++ b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_laundrydryer_01796fe396.zap b/examples/chef/devices/rootnode_laundrydryer_01796fe396.zap index a00af798c9823b..9476e57f31ed17 100644 --- a/examples/chef/devices/rootnode_laundrydryer_01796fe396.zap +++ b/examples/chef/devices/rootnode_laundrydryer_01796fe396.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -938,22 +940,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2808,14 +2794,16 @@ "code": 124, "profileId": 259, "label": "MA-laundry-dryer", - "name": "MA-laundry-dryer" + "name": "MA-laundry-dryer", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 124, "profileId": 259, "label": "MA-laundry-dryer", - "name": "MA-laundry-dryer" + "name": "MA-laundry-dryer", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3050,22 +3038,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3220,22 +3192,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3330,7 +3286,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3368,22 +3324,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3612,22 +3552,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap index 4de60f90e7afa2..d2ff10e83beb0c 100644 --- a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap +++ b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap index 833cca12b97c4b..730d061e2cea83 100644 --- a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap +++ b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 262, "profileId": 259, "label": "MA-lightsensor", - "name": "MA-lightsensor" + "name": "MA-lightsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 262, "profileId": 259, "label": "MA-lightsensor", - "name": "MA-lightsensor" + "name": "MA-lightsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap index 05d6200c7917d0..c0cdfbfb02275a 100644 --- a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap +++ b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 263, "profileId": 259, "label": "MA-occupancysensor", - "name": "MA-occupancysensor" + "name": "MA-occupancysensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 263, "profileId": 259, "label": "MA-occupancysensor", - "name": "MA-occupancysensor" + "name": "MA-occupancysensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap index 36b41b59f189f7..7d494cb7023933 100644 --- a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap +++ b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_onofflight_samplemei.zap b/examples/chef/devices/rootnode_onofflight_samplemei.zap index 23543f053ded81..95cb46797553e2 100644 --- a/examples/chef/devices/rootnode_onofflight_samplemei.zap +++ b/examples/chef/devices/rootnode_onofflight_samplemei.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3339,22 +3343,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap index a4823ec9c13bd7..af688a150bd896 100644 --- a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap +++ b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 259, "profileId": 259, "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" + "name": "MA-onofflightswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 259, "profileId": 259, "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" + "name": "MA-onofflightswitch", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap index b13e31cb33d3d1..fb0dcdcb600e6b 100644 --- a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap +++ b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 266, "profileId": 259, "label": "MA-onoffpluginunit", - "name": "MA-onoffpluginunit" + "name": "MA-onoffpluginunit", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 266, "profileId": 259, "label": "MA-onoffpluginunit", - "name": "MA-onoffpluginunit" + "name": "MA-onoffpluginunit", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap index f473e3dc7eb5d1..de963bf381e317 100644 --- a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap +++ b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2349,14 +2351,16 @@ "code": 773, "profileId": 259, "label": "MA-pressuresensor", - "name": "MA-pressuresensor" + "name": "MA-pressuresensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 773, "profileId": 259, "label": "MA-pressuresensor", - "name": "MA-pressuresensor" + "name": "MA-pressuresensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2830,4 +2834,4 @@ "parentEndpointIdentifier": null } ] -} +} \ No newline at end of file diff --git a/examples/chef/devices/rootnode_pump_5f904818cc.zap b/examples/chef/devices/rootnode_pump_5f904818cc.zap index a64d2c9c63f730..15aff7e84682e4 100644 --- a/examples/chef/devices/rootnode_pump_5f904818cc.zap +++ b/examples/chef/devices/rootnode_pump_5f904818cc.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2158,14 +2160,16 @@ "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2974,22 +2978,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3128,22 +3116,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3282,22 +3254,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_pump_a811bb33a0.zap b/examples/chef/devices/rootnode_pump_a811bb33a0.zap index dba461f0635e91..e42dbfc991f647 100644 --- a/examples/chef/devices/rootnode_pump_a811bb33a0.zap +++ b/examples/chef/devices/rootnode_pump_a811bb33a0.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2158,14 +2160,16 @@ "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap index c2f352d7d8f5a1..3d1e207faf8d57 100644 --- a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap +++ b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2670,14 +2672,16 @@ "code": 112, "profileId": 259, "label": "MA-refrigerator", - "name": "MA-refrigerator" + "name": "MA-refrigerator", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 112, "profileId": 259, "label": "MA-refrigerator", - "name": "MA-refrigerator" + "name": "MA-refrigerator", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2934,22 +2938,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3088,22 +3076,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3172,14 +3144,16 @@ "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3614,22 +3588,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3689,14 +3647,16 @@ "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4131,22 +4091,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap index 202206a9889908..243d63af397ab9 100644 --- a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap +++ b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1928,20 +1930,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 116, "profileId": 259, "label": "MA-robotic-vacuum-cleaner", - "name": "MA-robotic-vacuum-cleaner" + "name": "MA-robotic-vacuum-cleaner", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2046,22 +2051,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2250,22 +2239,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2420,22 +2393,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2638,22 +2595,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2794,22 +2735,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2950,22 +2875,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3178,22 +3087,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap index f32262142ce86b..5103c29c2a9406 100644 --- a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap +++ b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1928,14 +1930,16 @@ "code": 114, "profileId": 259, "label": "MA-room-airconditioner", - "name": "MA-room-airconditioner" + "name": "MA-room-airconditioner", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 114, "profileId": 259, "label": "MA-room-airconditioner", - "name": "MA-room-airconditioner" + "name": "MA-room-airconditioner", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2038,22 +2042,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2374,22 +2362,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2544,22 +2516,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2884,22 +2840,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3112,22 +3052,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3250,22 +3174,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3325,14 +3233,16 @@ "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3435,22 +3345,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3605,22 +3499,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3759,22 +3637,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3834,14 +3696,16 @@ "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 775, "profileId": 259, "label": "MA-humiditysensor", - "name": "MA-humiditysensor" + "name": "MA-humiditysensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3944,22 +3808,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4114,22 +3962,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4268,22 +4100,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap index 41d0fde16ae6aa..3bfa89f3b173a9 100644 --- a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap +++ b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1928,20 +1930,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 118, "profileId": 259, "label": "MA-smokecoalarm", - "name": "MA-smokecoalarm" + "name": "MA-smokecoalarm", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2046,22 +2051,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2404,22 +2393,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2622,22 +2595,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2955,22 +2912,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap index 9c2bea2037f5e5..985a8ba432e807 100644 --- a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap +++ b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 34, "profileId": 259, "label": "MA-speaker", - "name": "MA-speaker" + "name": "MA-speaker", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 34, "profileId": 259, "label": "MA-speaker", - "name": "MA-speaker" + "name": "MA-speaker", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap index 0395fbd3633f57..41b9d8ec41018f 100644 --- a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap +++ b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap index 90c10742060ebd..fe60e587b36b7c 100644 --- a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap +++ b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2455,14 +2457,16 @@ "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/rootnode_waterleakdetector_0b067acfa3.zap b/examples/chef/devices/rootnode_waterleakdetector_0b067acfa3.zap index 34e2b90f20c398..ff3b777af7aad5 100644 --- a/examples/chef/devices/rootnode_waterleakdetector_0b067acfa3.zap +++ b/examples/chef/devices/rootnode_waterleakdetector_0b067acfa3.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -2059,22 +2059,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2263,22 +2247,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2433,22 +2401,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2747,22 +2699,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2869,22 +2805,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2975,22 +2895,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_watervalve_6bb39f1f67.matter b/examples/chef/devices/rootnode_watervalve_6bb39f1f67.matter index 7105d9904673da..017be5921fdf81 100644 --- a/examples/chef/devices/rootnode_watervalve_6bb39f1f67.matter +++ b/examples/chef/devices/rootnode_watervalve_6bb39f1f67.matter @@ -1777,8 +1777,8 @@ endpoint 0 { } } endpoint 1 { - device type ma_powersource = 66, version 1; - device type ma_water_valve = 17, version 1; + device type ma_powersource = 17, version 1; + device type ma_water_valve = 66, version 1; server cluster Identify { diff --git a/examples/chef/devices/rootnode_watervalve_6bb39f1f67.zap b/examples/chef/devices/rootnode_watervalve_6bb39f1f67.zap index ba64c26fcf9d2b..398645c9b6e333 100644 --- a/examples/chef/devices/rootnode_watervalve_6bb39f1f67.zap +++ b/examples/chef/devices/rootnode_watervalve_6bb39f1f67.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -794,22 +796,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2074,20 +2060,23 @@ "code": 66, "profileId": 259, "label": "MA-water-valve", - "name": "MA-water-valve" + "name": "MA-water-valve", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 66, "profileId": 259, "label": "MA-water-valve", - "name": "MA-water-valve" + "name": "MA-water-valve", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2095,8 +2084,8 @@ 1 ], "deviceIdentifiers": [ - 17, - 66 + 66, + 17 ], "deviceTypeName": "MA-water-valve", "deviceTypeCode": 66, @@ -2192,22 +2181,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2362,22 +2335,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2692,22 +2649,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2896,22 +2837,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap index 23e48363583170..e608fff6c2c2ab 100644 --- a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap +++ b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2291,14 +2293,16 @@ "code": 514, "profileId": 259, "label": "MA-windowcovering", - "name": "MA-windowcovering" + "name": "MA-windowcovering", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 514, "profileId": 259, "label": "MA-windowcovering", - "name": "MA-windowcovering" + "name": "MA-windowcovering", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/chef/devices/template.zap b/examples/chef/devices/template.zap index 2eec4460e870b9..807be8cfdc8015 100644 --- a/examples/chef/devices/template.zap +++ b/examples/chef/devices/template.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1936,14 +1938,16 @@ "code": 4293984259, "profileId": 259, "label": "MA-all-clusters-app", - "name": "MA-all-clusters-app" + "name": "MA-all-clusters-app", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 4293984259, "profileId": 259, "label": "MA-all-clusters-app", - "name": "MA-all-clusters-app" + "name": "MA-all-clusters-app", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2046,22 +2050,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2250,22 +2238,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2420,22 +2392,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/chip-tool/BUILD.gn b/examples/chip-tool/BUILD.gn index 992fbd53e4ecf5..74d713d85c5d3a 100644 --- a/examples/chip-tool/BUILD.gn +++ b/examples/chip-tool/BUILD.gn @@ -47,6 +47,10 @@ config("config") { defines += [ "CONFIG_USE_LOCAL_STORAGE" ] } + if (config_enable_https_requests) { + defines += [ "CONFIG_ENABLE_HTTPS_REQUESTS" ] + } + cflags = [ "-Wconversion" ] } diff --git a/examples/chip-tool/chip-tool.gni b/examples/chip-tool/chip-tool.gni index b85f1f32340ed5..0bc5dcbb5cbed4 100644 --- a/examples/chip-tool/chip-tool.gni +++ b/examples/chip-tool/chip-tool.gni @@ -21,4 +21,5 @@ declare_args() { config_use_interactive_mode = true config_enable_yaml_tests = true config_use_local_storage = true + config_enable_https_requests = true } diff --git a/examples/chip-tool/commands/clusters/ModelCommand.h b/examples/chip-tool/commands/clusters/ModelCommand.h index f9ae83aed79f0a..d3e45101b5b830 100644 --- a/examples/chip-tool/commands/clusters/ModelCommand.h +++ b/examples/chip-tool/commands/clusters/ModelCommand.h @@ -28,8 +28,10 @@ class ModelCommand : public CHIPCommand { public: - ModelCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, bool supportsMultipleEndpoints = false) : - CHIPCommand(commandName, credsIssuerConfig), mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), + ModelCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, bool supportsMultipleEndpoints = false, + const char * helpText = nullptr) : + CHIPCommand(commandName, credsIssuerConfig, helpText), + mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this), mSupportsMultipleEndpoints(supportsMultipleEndpoints) {} diff --git a/examples/chip-tool/commands/clusters/ReportCommand.h b/examples/chip-tool/commands/clusters/ReportCommand.h index e2c0f1db785900..f9d1d1e9ba33ac 100644 --- a/examples/chip-tool/commands/clusters/ReportCommand.h +++ b/examples/chip-tool/commands/clusters/ReportCommand.h @@ -26,8 +26,9 @@ class ReportCommand : public InteractionModelReports, public ModelCommand, public chip::app::ReadClient::Callback { public: - ReportCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) : - InteractionModelReports(this), ModelCommand(commandName, credsIssuerConfig, /* supportsMultipleEndpoints = */ true) + ReportCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, const char * helpText = nullptr) : + InteractionModelReports(this), + ModelCommand(commandName, credsIssuerConfig, /* supportsMultipleEndpoints = */ true, helpText) {} /////////// ReadClient Callback Interface ///////// @@ -133,8 +134,8 @@ class ReportCommand : public InteractionModelReports, public ModelCommand, publi class ReadCommand : public ReportCommand { protected: - ReadCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) : - ReportCommand(commandName, credsIssuerConfig) + ReadCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, const char * helpText = nullptr) : + ReportCommand(commandName, credsIssuerConfig, helpText) {} void OnDone(chip::app::ReadClient * aReadClient) override @@ -147,8 +148,8 @@ class ReadCommand : public ReportCommand class SubscribeCommand : public ReportCommand { protected: - SubscribeCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) : - ReportCommand(commandName, credsIssuerConfig) + SubscribeCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, const char * helpText = nullptr) : + ReportCommand(commandName, credsIssuerConfig, helpText) {} void OnSubscriptionEstablished(chip::SubscriptionId subscriptionId) override @@ -187,7 +188,8 @@ class SubscribeCommand : public ReportCommand class ReadAttribute : public ReadCommand { public: - ReadAttribute(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-by-id", credsIssuerConfig) + ReadAttribute(CredentialIssuerCommands * credsIssuerConfig) : + ReadCommand("read-by-id", credsIssuerConfig, "Read attributes for the given attribute path (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to " @@ -198,7 +200,8 @@ class ReadAttribute : public ReadCommand } ReadAttribute(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - ReadCommand("read-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + ReadCommand("read-by-id", credsIssuerConfig, "Read attributes from this cluster; allows wildcard endpoint and attribute."), + mClusterIds(1, clusterId) { AddAttributeIdArgument(); AddCommonArguments(); @@ -245,7 +248,9 @@ class ReadAttribute : public ReadCommand class SubscribeAttribute : public SubscribeCommand { public: - SubscribeAttribute(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-by-id", credsIssuerConfig) + SubscribeAttribute(CredentialIssuerCommands * credsIssuerConfig) : + SubscribeCommand("subscribe-by-id", credsIssuerConfig, + "Subscribe to attributes for the given attribute path (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to subscribe to (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF " @@ -256,7 +261,9 @@ class SubscribeAttribute : public SubscribeCommand } SubscribeAttribute(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - SubscribeCommand("subscribe-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + SubscribeCommand("subscribe-by-id", credsIssuerConfig, + "Subscribe to attributes from this cluster; allows wildcard endpoint and attribute."), + mClusterIds(1, clusterId) { AddAttributeIdArgument(); AddCommonArguments(); @@ -312,7 +319,8 @@ class SubscribeAttribute : public SubscribeCommand class ReadEvent : public ReadCommand { public: - ReadEvent(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-event-by-id", credsIssuerConfig) + ReadEvent(CredentialIssuerCommands * credsIssuerConfig) : + ReadCommand("read-event-by-id", credsIssuerConfig, "Read events for the given event path (which may include wildcards).") { AddArgument("cluster-id", 0, UINT32_MAX, &mClusterIds); AddArgument("event-id", 0, UINT32_MAX, &mEventIds); @@ -322,7 +330,8 @@ class ReadEvent : public ReadCommand } ReadEvent(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - ReadCommand("read-event-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + ReadCommand("read-event-by-id", credsIssuerConfig, "Read events from this cluster; allows wildcard endpoint and event."), + mClusterIds(1, clusterId) { AddArgument("event-id", 0, UINT32_MAX, &mEventIds); AddArgument("fabric-filtered", 0, 1, &mFabricFiltered); @@ -356,7 +365,9 @@ class ReadEvent : public ReadCommand class SubscribeEvent : public SubscribeCommand { public: - SubscribeEvent(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-event-by-id", credsIssuerConfig) + SubscribeEvent(CredentialIssuerCommands * credsIssuerConfig) : + SubscribeCommand("subscribe-event-by-id", credsIssuerConfig, + "Subscribe to events for the given event path (which may include wildcards).") { AddArgument("cluster-id", 0, UINT32_MAX, &mClusterIds); AddArgument("event-id", 0, UINT32_MAX, &mEventIds); @@ -365,7 +376,9 @@ class SubscribeEvent : public SubscribeCommand } SubscribeEvent(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - SubscribeCommand("subscribe-event-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + SubscribeCommand("subscribe-event-by-id", credsIssuerConfig, + "Subscribe to events from this cluster; allows wildcard endpoint and event."), + mClusterIds(1, clusterId) { AddArgument("event-id", 0, UINT32_MAX, &mEventIds); AddCommonArguments(); @@ -447,7 +460,8 @@ class ReadNone : public ReadCommand class ReadAll : public ReadCommand { public: - ReadAll(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-all", credsIssuerConfig) + ReadAll(CredentialIssuerCommands * credsIssuerConfig) : + ReadCommand("read-all", credsIssuerConfig, "Read attributes and events for the given paths (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to " @@ -513,7 +527,9 @@ class SubscribeNone : public SubscribeCommand class SubscribeAll : public SubscribeCommand { public: - SubscribeAll(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-all", credsIssuerConfig) + SubscribeAll(CredentialIssuerCommands * credsIssuerConfig) : + SubscribeCommand("subscribe-all", credsIssuerConfig, + "Subscribe to attributes and events for the given paths (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to " diff --git a/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp b/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp index 8745db90c6dff4..03603a8e810bea 100644 --- a/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp +++ b/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include diff --git a/examples/chip-tool/commands/dcl/HTTPSRequest.cpp b/examples/chip-tool/commands/dcl/HTTPSRequest.cpp index 29b0ed8f2726db..4075b0ec78858a 100644 --- a/examples/chip-tool/commands/dcl/HTTPSRequest.cpp +++ b/examples/chip-tool/commands/dcl/HTTPSRequest.cpp @@ -18,13 +18,17 @@ #include "HTTPSRequest.h" +#if CHIP_HAVE_CONFIG_H #include +#endif // CHIP_HAVE_CONFIG_H + #include #include #include #include #include +#ifdef CONFIG_ENABLE_HTTPS_REQUESTS #if (CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL) #include #include @@ -33,6 +37,7 @@ #define USE_CHIP_CRYPTO 1 #endif #endif //(CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL) +#endif // CONFIG_ENABLE_HTTPS_REQUESTS namespace { constexpr const char * kHttpsPrefix = "https://"; @@ -68,9 +73,18 @@ class HTTPSSessionHolder private: CHIP_ERROR LogNotImplementedError() const { +#ifndef CONFIG_ENABLE_HTTPS_REQUESTS + ChipLogError(chipTool, "HTTPS requests are disabled via build configuration (config_enable_https_requests=false)."); +#elif !(CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL) ChipLogError(chipTool, "HTTPS requests are not available because neither OpenSSL nor BoringSSL is enabled. Contributions for " "alternative implementations are welcome!"); +#elif !defined(SHA256_DIGEST_LENGTH) + ChipLogError(chipTool, + "HTTPS requests are not available because SHA256_DIGEST_LENGTH is not defined, meaning response integrity " + "verification via SHA-256 digest checking cannot be performed."); +#endif + return CHIP_ERROR_NOT_IMPLEMENTED; } }; @@ -83,6 +97,38 @@ constexpr const char * kErrorSSLContextCreate = "Failed to create SSL context constexpr const char * kErrorSSLObjectCreate = "Failed to create SSL object"; constexpr const char * kErrorSSLHandshake = "SSL handshake failed"; constexpr const char * kErrorDigestMismatch = "The response digest does not match the expected digest"; +class AddressInfoHolder +{ +public: + AddressInfoHolder(std::string & hostname, uint16_t port) + { + struct addrinfo hints = {}; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + int err = getaddrinfo(hostname.c_str(), std::to_string(port).c_str(), &hints, &mRes); +#if CHIP_ERROR_LOGGING + constexpr const char * kErrorGetAddressInfo = "Failed to get address info: "; + VerifyOrDo(nullptr != mRes, ChipLogError(chipTool, "%s%s", kErrorGetAddressInfo, gai_strerror(err))); +#else + (void) err; +#endif + } + + ~AddressInfoHolder() + { + if (mRes != nullptr) + { + freeaddrinfo(mRes); + } + } + + bool HasInfo() const { return mRes != nullptr; } + struct addrinfo * Get() const { return mRes; } + +private: + struct addrinfo * mRes = nullptr; +}; + class HTTPSSessionHolder { public: @@ -90,10 +136,16 @@ class HTTPSSessionHolder ~HTTPSSessionHolder() { - VerifyOrReturn(nullptr != mContext); - SSL_free(mSSL); - SSL_CTX_free(mContext); - close(mSock); + if (nullptr != mContext) + { + SSL_free(mSSL); + SSL_CTX_free(mContext); + } + + if (mSock >= 0) + { + close(mSock); + } #if !defined(OPENSSL_IS_BORINGSSL) EVP_cleanup(); @@ -134,23 +186,30 @@ class HTTPSSessionHolder private: CHIP_ERROR InitSocket(std::string & hostname, uint16_t port, int & sock) { - auto * server = gethostbyname(hostname.c_str()); - VerifyOrReturnError(nullptr != server, CHIP_ERROR_NOT_CONNECTED); - - sock = socket(AF_INET, SOCK_STREAM, 0); - VerifyOrReturnError(sock >= 0, CHIP_ERROR_NOT_CONNECTED); - - struct sockaddr_in server_addr; - memset(&server_addr, 0, sizeof(server_addr)); - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(port); - memcpy(&server_addr.sin_addr.s_addr, server->h_addr, (size_t) server->h_length); + AddressInfoHolder addressInfoHolder(hostname, port); + VerifyOrReturnError(addressInfoHolder.HasInfo(), CHIP_ERROR_NOT_CONNECTED); - int rv = connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr)); - VerifyOrReturnError(rv >= 0, CHIP_ERROR_POSIX(errno), - ChipLogError(chipTool, "%s%s:%u", kErrorConnection, hostname.c_str(), port)); + auto * res = addressInfoHolder.Get(); + for (struct addrinfo * p = res; p != nullptr; p = p->ai_next) + { + sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol); + if (sock < 0) + { + continue; // Try the next address + } + + if (connect(sock, p->ai_addr, p->ai_addrlen) != 0) + { + close(sock); + sock = -1; + continue; // Try the next address + } + + return CHIP_NO_ERROR; + } - return CHIP_NO_ERROR; + ChipLogError(chipTool, "%s%s:%u", kErrorConnection, hostname.c_str(), port); + return CHIP_ERROR_NOT_CONNECTED; } CHIP_ERROR InitSSL(int sock) diff --git a/examples/common/pigweed/rpc_services/Attributes.h b/examples/common/pigweed/rpc_services/Attributes.h index cfbb400ae2f7f2..eff2af5d66db31 100644 --- a/examples/common/pigweed/rpc_services/Attributes.h +++ b/examples/common/pigweed/rpc_services/Attributes.h @@ -192,7 +192,7 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service return ::pw::Status::NotFound(); } - Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kPase }; + Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kInternalDeviceAccess }; app::DataModel::WriteAttributeRequest write_request; write_request.path = path; write_request.operationFlags.Set(app::DataModel::OperationFlags::kInternal); @@ -343,7 +343,7 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service ::pw::Status ReadAttributeIntoTlvBuffer(const app::ConcreteAttributePath & path, MutableByteSpan & tlvBuffer) { - Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kPase }; + Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kInternalDeviceAccess }; app::AttributeReportIBs::Builder attributeReports; TLV::TLVWriter writer; TLV::TLVType outer; diff --git a/examples/contact-sensor-app/bouffalolab/data_model/contact-sensor-app.zap b/examples/contact-sensor-app/bouffalolab/data_model/contact-sensor-app.zap index bce092c500a726..f7e49f345b57fc 100644 --- a/examples/contact-sensor-app/bouffalolab/data_model/contact-sensor-app.zap +++ b/examples/contact-sensor-app/bouffalolab/data_model/contact-sensor-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -3857,10 +3857,10 @@ "side": "server", "type": "OperatingModeEnum", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3937,10 +3937,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x000f", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.zap b/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.zap index 1aac3415237235..1bea47c36e1140 100644 --- a/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.zap +++ b/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4028,14 +4030,16 @@ "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap b/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap index 6658c278e98850..6f1610e03e32ad 100644 --- a/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap +++ b/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -3840,10 +3840,10 @@ "side": "server", "type": "OperatingModeEnum", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3920,10 +3920,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x000F", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap b/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap index 3110fe05f2eef0..a9d4fff846880d 100644 --- a/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap +++ b/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -3766,10 +3766,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/contact-sensor-app/telink/README.md b/examples/contact-sensor-app/telink/README.md index 27d5721953c261..12306f01e5b637 100755 --- a/examples/contact-sensor-app/telink/README.md +++ b/examples/contact-sensor-app/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/darwin-framework-tool/BUILD.gn b/examples/darwin-framework-tool/BUILD.gn index 07b45733161761..e0224cc6865fbe 100644 --- a/examples/darwin-framework-tool/BUILD.gn +++ b/examples/darwin-framework-tool/BUILD.gn @@ -189,6 +189,9 @@ executable("darwin-framework-tool") { "${chip_root}/examples/chip-tool/commands/common/Commands.cpp", "${chip_root}/examples/chip-tool/commands/common/Commands.h", "${chip_root}/examples/chip-tool/commands/common/HexConversion.h", + "${chip_root}/examples/chip-tool/commands/dcl/DCLClient.cpp", + "${chip_root}/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp", + "${chip_root}/examples/chip-tool/commands/dcl/JsonSchemaMacros.cpp", "${chip_root}/examples/common/websocket-server/WebSocketServer.cpp", "${chip_root}/examples/common/websocket-server/WebSocketServer.h", "${chip_root}/zzz_generated/chip-tool/zap-generated/cluster/ComplexArgumentParser.cpp", @@ -220,6 +223,7 @@ executable("darwin-framework-tool") { "commands/configuration/ResetMRPParametersCommand.mm", "commands/configuration/SetMRPParametersCommand.h", "commands/configuration/SetMRPParametersCommand.mm", + "commands/dcl/HTTPSRequest.mm", "commands/delay/Commands.h", "commands/delay/SleepCommand.h", "commands/delay/SleepCommand.mm", diff --git a/examples/darwin-framework-tool/commands/dcl/HTTPSRequest.mm b/examples/darwin-framework-tool/commands/dcl/HTTPSRequest.mm new file mode 100644 index 00000000000000..1959d8222eb3ab --- /dev/null +++ b/examples/darwin-framework-tool/commands/dcl/HTTPSRequest.mm @@ -0,0 +1,325 @@ +/* + * Copyright (c) 2025 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 + +#include +#include + +#include + +namespace { +constexpr const char * kHttpsPrefix = "https://"; +constexpr uint16_t kHttpsPort = 443; +constexpr const char * kErrorJsonParse = "Failed to parse JSON: "; +constexpr const char * kErrorHTTPSPrefix = "URL must start with 'https://': "; +constexpr const char * kErrorHTTPSPort = "Invalid port: 0"; +constexpr const char * kErrorHTTPSHostName = "Invalid hostname: empty"; +constexpr const char * kErrorBase64Decode = "Error while decoding base64 data"; +constexpr const char * kErrorSizeMismatch = "The response size does not match the expected size: "; +} // namespace + +namespace chip { +namespace tool { + namespace https { + namespace { + constexpr uint16_t kResponseBufferSize = 4096; + constexpr uint64_t kConnectionTimeoutSeconds = 10; + constexpr uint64_t kSendTimeoutSeconds = 10; + constexpr uint64_t kReceiveTimeoutSeconds = 10; + constexpr const char * kDispatchQueueName = "com.chip.httpsrequest"; + constexpr const char * kContentContextName = "httpsrequest"; + constexpr const char * kErrorSendHTTPRequest = "Failed to send HTTP request"; + constexpr const char * kErrorSendHTTPRequestTimeout = "Failed to send HTTP request: timeout"; + constexpr const char * kErrorReceiveHTTPResponse = "Failed to read HTTP response"; + constexpr const char * kErrorReceiveHTTPResponseTimeout = "Failed to read HTTP response: timeout"; + constexpr const char * kErrorConnection = "Failed to connect to: "; + constexpr const char * kErrorConnectionTimeout = "Timeout connecting to: "; + constexpr const char * kErrorConnectionUnknowState = "Unknown connection state"; + constexpr const char * kErrorDigestMismatch = "The response digest does not match the expected digest"; + class HTTPSSessionHolder { + public: + HTTPSSessionHolder() {}; + + ~HTTPSSessionHolder() + { + VerifyOrReturn(nullptr != mConnection); + nw_connection_cancel(mConnection); + mConnection = nullptr; + } + + CHIP_ERROR Init(std::string & hostname, uint16_t port) + { + __auto_type semaphore = dispatch_semaphore_create(0); + __block CHIP_ERROR result = CHIP_NO_ERROR; + + __auto_type endpoint = nw_endpoint_create_host(hostname.c_str(), std::to_string(port).c_str()); + nw_parameters_t parameters = nw_parameters_create_secure_tcp(NW_PARAMETERS_DEFAULT_CONFIGURATION, NW_PARAMETERS_DEFAULT_CONFIGURATION); + + mConnection = nw_connection_create(endpoint, parameters); + VerifyOrReturnError(nullptr != mConnection, CHIP_ERROR_INTERNAL); + + nw_connection_set_state_changed_handler(mConnection, ^(nw_connection_state_t state, nw_error_t error) { + switch (state) { + case nw_connection_state_waiting: + case nw_connection_state_preparing: + break; + case nw_connection_state_ready: + result = CHIP_NO_ERROR; + dispatch_semaphore_signal(semaphore); + break; + case nw_connection_state_failed: + case nw_connection_state_cancelled: + ChipLogError(chipTool, "%s%s", kErrorConnection, hostname.c_str()); + result = CHIP_ERROR_NOT_CONNECTED; + dispatch_semaphore_signal(semaphore); + default: + ChipLogError(chipTool, "%s", kErrorConnectionUnknowState); + break; + } + }); + + __auto_type queue = dispatch_queue_create(kDispatchQueueName, DISPATCH_QUEUE_SERIAL); + nw_connection_set_queue(mConnection, queue); + nw_connection_start(mConnection); + + if (dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, kConnectionTimeoutSeconds * NSEC_PER_SEC)) != 0) { + ChipLogError(chipTool, "%s%s", kErrorConnectionTimeout, hostname.c_str()); + return CHIP_ERROR_TIMEOUT; + } + + nw_connection_set_state_changed_handler(mConnection, nullptr); + return result; + } + + CHIP_ERROR SendRequest(std::string & request) + { + __auto_type semaphore = dispatch_semaphore_create(0); + __block CHIP_ERROR result = CHIP_NO_ERROR; + + __auto_type context = nw_content_context_create(kContentContextName); + __auto_type data = dispatch_data_create(request.c_str(), request.size(), dispatch_get_main_queue(), DISPATCH_DATA_DESTRUCTOR_DEFAULT); + nw_connection_send(mConnection, data, context, true, ^(nw_error_t error) { + if (nullptr != error) { + ChipLogError(chipTool, "%s", kErrorSendHTTPRequest); + result = CHIP_ERROR_BAD_REQUEST; + } + dispatch_semaphore_signal(semaphore); + }); + + if (dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, kSendTimeoutSeconds * NSEC_PER_SEC)) != 0) { + ChipLogError(chipTool, "%s", kErrorSendHTTPRequestTimeout); + return CHIP_ERROR_TIMEOUT; + } + + return result; + } + + CHIP_ERROR ReceiveResponse(std::string & response) + { + __auto_type semaphore = dispatch_semaphore_create(0); + __block CHIP_ERROR result = CHIP_NO_ERROR; + __block std::string receivedData; + + nw_connection_receive(mConnection, 1, kResponseBufferSize, ^(dispatch_data_t content, nw_content_context_t context, bool isComplete, nw_error_t error) { + if (nullptr != error) { + ChipLogError(chipTool, "%s", kErrorReceiveHTTPResponse); + result = CHIP_ERROR_INTERNAL; + } else if (nullptr != content) { + size_t total_size = dispatch_data_get_size(content); + receivedData.reserve(total_size); + + dispatch_data_apply(content, ^(dispatch_data_t region, size_t offset, const void * buffer, size_t size) { + receivedData.append(static_cast(buffer), size); + return true; + }); + + result = CHIP_NO_ERROR; + } + + dispatch_semaphore_signal(semaphore); + }); + + if (dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, kReceiveTimeoutSeconds * NSEC_PER_SEC)) != 0) { + ChipLogError(chipTool, "%s", kErrorReceiveHTTPResponseTimeout); + return CHIP_ERROR_TIMEOUT; + } + + response = receivedData; + return result; + } + + private: + nw_connection_t mConnection = nullptr; + }; + + std::string BuildRequest(std::string & hostname, std::string & path) + { + return "GET " + path + " HTTP/1.1\r\n" + // + "Host: " + hostname + "\r\n" + // + "Accept: application/json\r\n" + // + "Connection: close\r\n\r\n"; // + } + + CHIP_ERROR RemoveHeader(std::string & response) + { + size_t headerEnd = response.find("\r\n\r\n"); + VerifyOrReturnError(std::string::npos != headerEnd, CHIP_ERROR_INVALID_ARGUMENT); + + auto body = response.substr(headerEnd + 4); + response = body; + + return CHIP_NO_ERROR; + } + + CHIP_ERROR MaybeCheckResponseSize(const std::string & response, const chip::Optional & optionalExpectedSize) + { + VerifyOrReturnError(optionalExpectedSize.HasValue(), CHIP_NO_ERROR); + VerifyOrReturnError(chip::CanCastTo(response.size()), CHIP_ERROR_INVALID_ARGUMENT); + + uint32_t responseSize = static_cast(response.size()); + uint32_t expectedSize = optionalExpectedSize.Value(); + VerifyOrReturnError(expectedSize == responseSize, CHIP_ERROR_INVALID_ARGUMENT, + ChipLogError(chipTool, "%s%u != %u", kErrorSizeMismatch, responseSize, expectedSize)); + return CHIP_NO_ERROR; + } + + CHIP_ERROR MaybeCheckResponseDigest(const std::string & response, const chip::Optional & optionalExpectedDigest) + { + VerifyOrReturnError(optionalExpectedDigest.HasValue(), CHIP_NO_ERROR); + VerifyOrReturnError(CanCastTo(strlen(optionalExpectedDigest.Value())), CHIP_ERROR_INVALID_ARGUMENT); + + const char * encodedData = optionalExpectedDigest.Value(); + uint16_t encodedDataSize = static_cast(strlen(encodedData)); + + size_t expectedMaxDecodedSize = BASE64_MAX_DECODED_LEN(encodedDataSize); + chip::Platform::ScopedMemoryBuffer decodedData; + VerifyOrReturnError(decodedData.Calloc(expectedMaxDecodedSize + 1 /* for null */), CHIP_ERROR_INVALID_ARGUMENT); + + size_t decodedDataSize = chip::Base64Decode(encodedData, encodedDataSize, decodedData.Get()); + VerifyOrReturnError(0 != decodedDataSize, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorBase64Decode)); + + // Compute the SHA-256 hash of the response + unsigned char responseDigest[CC_SHA256_DIGEST_LENGTH]; + CC_SHA256(reinterpret_cast(response.c_str()), static_cast(response.size()), responseDigest); + + VerifyOrReturnError(memcmp(responseDigest, decodedData.Get(), CC_SHA256_DIGEST_LENGTH) == 0, CHIP_ERROR_INVALID_ARGUMENT, + ChipLogError(chipTool, "%s", kErrorDigestMismatch)); + + return CHIP_NO_ERROR; + } + + CHIP_ERROR ConvertResponseToJSON(std::string & body, Json::Value & jsonResponse) + { + + Json::CharReaderBuilder readerBuilder; + std::string errors; + std::istringstream jsonStream(body); + bool success = Json::parseFromStream(readerBuilder, jsonStream, &jsonResponse, &errors); + VerifyOrReturnError(success, CHIP_ERROR_INTERNAL, ChipLogError(chipTool, "%s%s", kErrorJsonParse, errors.c_str())); + + return CHIP_NO_ERROR; + } + + CHIP_ERROR ExtractHostAndPath(const std::string & url, std::string & hostAndPort, std::string & outPath) + { + VerifyOrReturnError(url.compare(0, strlen(kHttpsPrefix), kHttpsPrefix) == 0, CHIP_ERROR_INVALID_ARGUMENT, + ChipLogError(chipTool, "%s%s", kErrorHTTPSPrefix, url.c_str())); + + auto strippedUrl = url.substr(strlen(kHttpsPrefix)); + VerifyOrReturnError("" != strippedUrl, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorHTTPSHostName)); + + size_t position = strippedUrl.find('/'); + if (position == std::string::npos) { + hostAndPort = strippedUrl; + outPath = "/"; + } else { + hostAndPort = strippedUrl.substr(0, position); + outPath = strippedUrl.substr(position); + } + + return CHIP_NO_ERROR; + } + + CHIP_ERROR ExtractHostAndPort(const std::string & hostAndPort, std::string & outHostName, uint16_t & outPort) + { + size_t position = hostAndPort.find(':'); + if (position == std::string::npos) { + outHostName = hostAndPort; + outPort = kHttpsPort; + } else { + outHostName = hostAndPort.substr(0, position); + auto portString = hostAndPort.substr(position + 1); + outPort = static_cast(std::atoi(portString.c_str())); + VerifyOrReturnError(0 != outPort, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorHTTPSPort)); + } + + return CHIP_NO_ERROR; + } + + CHIP_ERROR ExtractHostNamePortPath(std::string url, std::string & outHostName, uint16_t & outPort, std::string & outPath) + { + std::string hostAndPort; + ReturnErrorOnFailure(ExtractHostAndPath(url, hostAndPort, outPath)); + ReturnErrorOnFailure(ExtractHostAndPort(hostAndPort, outHostName, outPort)); + + return CHIP_NO_ERROR; + } + } // namespace + + CHIP_ERROR Request(std::string url, Json::Value & jsonResponse, const Optional & optionalExpectedSize, + const Optional & optionalExpectedDigest) + { + std::string hostname; + uint16_t port; + std::string path; + ReturnErrorOnFailure(ExtractHostNamePortPath(url, hostname, port, path)); + return Request(hostname, port, path, jsonResponse, optionalExpectedSize, optionalExpectedDigest); + } + + CHIP_ERROR Request(std::string hostname, uint16_t port, std::string path, Json::Value & jsonResponse, + const Optional & optionalExpectedSize, const Optional & optionalExpectedDigest) + { + VerifyOrDo(port != 0, port = kHttpsPort); + + ChipLogDetail(chipTool, "HTTPS request to %s:%u%s", hostname.c_str(), port, path.c_str()); + + std::string request = BuildRequest(hostname, path); + std::string response; + + HTTPSSessionHolder session; + ReturnErrorOnFailure(session.Init(hostname, port)); + ReturnErrorOnFailure(session.SendRequest(request)); + ReturnErrorOnFailure(session.ReceiveResponse(response)); + ReturnErrorOnFailure(RemoveHeader(response)); + ReturnErrorOnFailure(MaybeCheckResponseSize(response, optionalExpectedSize)); + ReturnErrorOnFailure(MaybeCheckResponseDigest(response, optionalExpectedDigest)); + ReturnErrorOnFailure(ConvertResponseToJSON(response, jsonResponse)); + return CHIP_NO_ERROR; + } + + } // namespace https +} // namespace tool +} // namespace chip diff --git a/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.h b/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.h index b5f3d4625e6ec2..c6e88d78f4a6a4 100644 --- a/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.h +++ b/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.h @@ -63,6 +63,10 @@ class PairingCommandBridge : public CHIPCommandBridge break; case PairingMode::Code: AddArgument("payload", &mOnboardingPayload); + AddArgument("dcl-hostname", &mDCLHostName, + "Hostname of the DCL server to fetch information from. Defaults to 'on.dcl.csa-iot.org'."); + AddArgument("dcl-port", 0, UINT16_MAX, &mDCLPort, "Port number for connecting to the DCL server. Defaults to '443'."); + AddArgument("use-dcl", 0, 1, &mUseDCL, "Use DCL to fetch onboarding information"); break; case PairingMode::Ble: AddArgument("setup-pin-code", 0, 134217727, &mSetupPINCode); @@ -71,6 +75,10 @@ class PairingCommandBridge : public CHIPCommandBridge case PairingMode::AlreadyDiscoveredByIndex: AddArgument("payload", &mOnboardingPayload); AddArgument("index", 0, UINT16_MAX, &mIndex); + AddArgument("dcl-hostname", &mDCLHostName, + "Hostname of the DCL server to fetch information from. Defaults to 'on.dcl.csa-iot.org'."); + AddArgument("dcl-port", 0, UINT16_MAX, &mDCLPort, "Port number for connecting to the DCL server. Defaults to '443'."); + AddArgument("use-dcl", 0, 1, &mUseDCL, "Use DCL to fetch onboarding information"); break; } @@ -95,7 +103,8 @@ class PairingCommandBridge : public CHIPCommandBridge void PairWithIndex(NSError * __autoreleasing * error); void PairWithPayload(NSError * __autoreleasing * error); void Unpair(); - void SetUpDeviceControllerDelegate(); + void SetUpDeviceControllerDelegate(NSError * __autoreleasing * error); + void MaybeDisplayTermsAndConditions(MTRCommissioningParameters * params, NSError * __autoreleasing * error); const PairingMode mPairingMode; const CommissioningType mCommissioningType; @@ -110,4 +119,7 @@ class PairingCommandBridge : public CHIPCommandBridge chip::Optional mUseDeviceAttestationDelegate; chip::Optional mDeviceAttestationFailsafeTime; chip::Optional mCountryCode; + chip::Optional mDCLHostName; + chip::Optional mDCLPort; + chip::Optional mUseDCL; }; diff --git a/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.mm b/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.mm index 3ec4aee9e2e1e2..6cdb37de7a7d94 100644 --- a/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.mm +++ b/examples/darwin-framework-tool/commands/pairing/PairingCommandBridge.mm @@ -22,6 +22,8 @@ #include "../common/CertificateIssuer.h" #include "DeviceControllerDelegateBridge.h" #include "PairingCommandBridge.h" +#include +#include #include #import "MTRError_Utils.h" @@ -47,7 +49,7 @@ - (void)deviceAttestationCompletedForController:(MTRDeviceController *)controlle @end -void PairingCommandBridge::SetUpDeviceControllerDelegate() +void PairingCommandBridge::SetUpDeviceControllerDelegate(NSError * __autoreleasing * error) { CHIPToolDeviceControllerDelegate * deviceControllerDelegate = [[CHIPToolDeviceControllerDelegate alloc] init]; [deviceControllerDelegate setCommandBridge:this]; @@ -85,6 +87,8 @@ - (void)deviceAttestationCompletedForController:(MTRDeviceController *)controlle params.countryCode = [NSString stringWithUTF8String:mCountryCode.Value()]; } + MaybeDisplayTermsAndConditions(params, error); + VerifyOrReturn(*error == nil); [deviceControllerDelegate setParams:params]; } @@ -94,6 +98,39 @@ - (void)deviceAttestationCompletedForController:(MTRDeviceController *)controlle [commissioner setDeviceControllerDelegate:deviceControllerDelegate queue:callbackQueue]; } +void PairingCommandBridge::MaybeDisplayTermsAndConditions(MTRCommissioningParameters * params, NSError * __autoreleasing * error) +{ + VerifyOrReturn(mUseDCL.ValueOr(false)); + + Json::Value tc; + auto client = tool::dcl::DCLClient(mDCLHostName, mDCLPort); + CHIP_ERROR err = client.TermsAndConditions(mOnboardingPayload, tc); + + if (CHIP_NO_ERROR != err) { + auto errorString = [NSString stringWithFormat:@"Error retrieving terms and conditions."]; + *error = [[NSError alloc] initWithDomain:@"PairingDomain" + code:MTRErrorCodeGeneralError + userInfo:@ { NSLocalizedDescriptionKey : NSLocalizedString(errorString, nil) }]; + return; + } + + if (tc != Json::nullValue) { + uint16_t version = 0; + uint16_t userResponse = 0; + err = tool::dcl::DisplayTermsAndConditions(tc, version, userResponse, mCountryCode); + if (CHIP_NO_ERROR != err) { + auto errorString = [NSString stringWithFormat:@"Error displaying terms and conditions."]; + *error = [[NSError alloc] initWithDomain:@"PairingDomain" + code:MTRErrorCodeGeneralError + userInfo:@ { NSLocalizedDescriptionKey : NSLocalizedString(errorString, nil) }]; + return; + } + + params.acceptedTermsAndConditions = @(userResponse); + params.acceptedTermsAndConditionsVersion = @(version); + } +} + CHIP_ERROR PairingCommandBridge::RunCommand() { NSError * error; @@ -120,7 +157,9 @@ - (void)deviceAttestationCompletedForController:(MTRDeviceController *)controlle void PairingCommandBridge::PairWithCode(NSError * __autoreleasing * error) { - SetUpDeviceControllerDelegate(); + SetUpDeviceControllerDelegate(error); + VerifyOrReturn(*error == nil); + auto * payload = [[MTRSetupPayload alloc] initWithSetupPasscode:@(mSetupPINCode) discriminator:@(mDiscriminator)]; MTRDeviceController * commissioner = CurrentCommissioner(); [commissioner setupCommissioningSessionWithPayload:payload newNodeID:@(mNodeId) error:error]; @@ -128,9 +167,10 @@ - (void)deviceAttestationCompletedForController:(MTRDeviceController *)controlle void PairingCommandBridge::PairWithIndex(NSError * __autoreleasing * error) { - SetUpDeviceControllerDelegate(); - MTRDeviceController * commissioner = CurrentCommissioner(); + SetUpDeviceControllerDelegate(error); + VerifyOrReturn(*error == nil); + MTRDeviceController * commissioner = CurrentCommissioner(); if (mIndex >= [gDiscoveredDevices count]) { auto errorString = [NSString stringWithFormat:@"Error retrieving discovered device at index %@", @(mIndex)]; *error = [[NSError alloc] initWithDomain:@"PairingDomain" @@ -152,7 +192,9 @@ - (void)deviceAttestationCompletedForController:(MTRDeviceController *)controlle void PairingCommandBridge::PairWithPayload(NSError * __autoreleasing * error) { NSString * onboardingPayload = [NSString stringWithUTF8String:mOnboardingPayload]; - SetUpDeviceControllerDelegate(); + SetUpDeviceControllerDelegate(error); + VerifyOrReturn(*error == nil); + auto * payload = [MTRSetupPayload setupPayloadWithOnboardingPayload:onboardingPayload error:error]; if (payload == nil) { return; diff --git a/examples/darwin-framework-tool/main.mm b/examples/darwin-framework-tool/main.mm index e0c6e94224ebec..e89c033633e182 100644 --- a/examples/darwin-framework-tool/main.mm +++ b/examples/darwin-framework-tool/main.mm @@ -24,6 +24,7 @@ #include "commands/bdx/Commands.h" #include "commands/common/Commands.h" #include "commands/configuration/Commands.h" +#include "commands/dcl/Commands.h" #include "commands/delay/Commands.h" #include "commands/discover/Commands.h" #include "commands/interactive/Commands.h" @@ -44,6 +45,7 @@ int main(int argc, const char * argv[]) Commands commands; registerCommandsBdx(commands); registerCommandsPairing(commands); + registerCommandsDCL(commands); registerCommandsDelay(commands); registerCommandsDiscover(commands); registerCommandsInteractive(commands); diff --git a/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap b/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap index 857f5a0192f38f..23191697a3d1eb 100644 --- a/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap +++ b/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2802,14 +2804,16 @@ "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/dishwasher-app/silabs/data_model/dishwasher-thread-app.zap b/examples/dishwasher-app/silabs/data_model/dishwasher-thread-app.zap index f7927d1a6aaecc..53cba02a444a6f 100644 --- a/examples/dishwasher-app/silabs/data_model/dishwasher-thread-app.zap +++ b/examples/dishwasher-app/silabs/data_model/dishwasher-thread-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -747,24 +749,6 @@ "isIncoming": 0, "isEnabled": 1 } - ], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "client", - "type": "int16u", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "1", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } ] }, { @@ -3644,14 +3628,16 @@ "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3754,22 +3740,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3924,22 +3894,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4258,22 +4212,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4333,14 +4271,16 @@ "code": 1296, "profileId": 259, "label": "MA-electricalsensor", - "name": "MA-electricalsensor" + "name": "MA-electricalsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 1296, "profileId": 259, "label": "MA-electricalsensor", - "name": "MA-electricalsensor" + "name": "MA-electricalsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4457,22 +4397,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4867,22 +4791,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5030,22 +4938,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5177,22 +5069,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5252,14 +5128,16 @@ "code": 1293, "profileId": 259, "label": "Device Energy Management", - "name": "Device Energy Management" + "name": "Device Energy Management", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 1293, "profileId": 259, "label": "Device Energy Management", - "name": "Device Energy Management" + "name": "Device Energy Management", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -5376,22 +5254,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5677,22 +5539,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5832,38 +5678,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "StartUpMode", - "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": "OnMode", - "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": "GeneratedCommandList", "code": 65528, @@ -5896,22 +5710,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/dishwasher-app/silabs/data_model/dishwasher-wifi-app.zap b/examples/dishwasher-app/silabs/data_model/dishwasher-wifi-app.zap index 61d3ad5f4c8fab..0b92935808f8f5 100644 --- a/examples/dishwasher-app/silabs/data_model/dishwasher-wifi-app.zap +++ b/examples/dishwasher-app/silabs/data_model/dishwasher-wifi-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 100, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -747,24 +749,6 @@ "isIncoming": 0, "isEnabled": 1 } - ], - "attributes": [ - { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "client", - "type": "int16u", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "1", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - } ] }, { @@ -1936,7 +1920,7 @@ ] }, { - "name": "WiFi Network Diagnostics", + "name": "Wi-Fi Network Diagnostics", "code": 54, "mfgCode": null, "define": "WIFI_NETWORK_DIAGNOSTICS_CLUSTER", @@ -2828,14 +2812,16 @@ "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 117, "profileId": 259, "label": "MA-dishwasher", - "name": "MA-dishwasher" + "name": "MA-dishwasher", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2938,22 +2924,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3108,22 +3078,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3442,22 +3396,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3517,14 +3455,16 @@ "code": 1296, "profileId": 259, "label": "MA-electricalsensor", - "name": "MA-electricalsensor" + "name": "MA-electricalsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 1296, "profileId": 259, "label": "MA-electricalsensor", - "name": "MA-electricalsensor" + "name": "MA-electricalsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3641,22 +3581,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3714,7 +3638,6 @@ "define": "ELECTRICAL_POWER_MEASUREMENT_CLUSTER", "side": "server", "enabled": 1, - "apiMaturity": "provisional", "attributes": [ { "name": "PowerMode", @@ -4052,22 +3975,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4134,7 +4041,6 @@ "define": "ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER", "side": "server", "enabled": 1, - "apiMaturity": "provisional", "attributes": [ { "name": "Accuracy", @@ -4216,22 +4122,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4298,7 +4188,6 @@ "define": "POWER_TOPOLOGY_CLUSTER", "side": "server", "enabled": 1, - "apiMaturity": "provisional", "attributes": [ { "name": "AvailableEndpoints", @@ -4364,22 +4253,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4439,14 +4312,16 @@ "code": 1293, "profileId": 259, "label": "Device Energy Management", - "name": "Device Energy Management" + "name": "Device Energy Management", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 1293, "profileId": 259, "label": "Device Energy Management", - "name": "Device Energy Management" + "name": "Device Energy Management", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4563,22 +4438,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4605,7 +4464,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4621,7 +4480,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "2", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4789,7 +4648,7 @@ "code": 5, "mfgCode": null, "side": "server", - "type": "array", + "type": "PowerAdjustCapabilityStruct", "included": 1, "storageOption": "External", "singleton": 0, @@ -4864,22 +4723,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5019,38 +4862,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "StartUpMode", - "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": "OnMode", - "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": "GeneratedCommandList", "code": 65528, @@ -5083,22 +4894,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5125,7 +4920,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/energy-management-app/energy-management-common/energy-management-app.zap b/examples/energy-management-app/energy-management-common/energy-management-app.zap index ee365c7ec5c32e..9a1f4549b73051 100644 --- a/examples/energy-management-app/energy-management-common/energy-management-app.zap +++ b/examples/energy-management-app/energy-management-common/energy-management-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/fabric-admin/README.md b/examples/fabric-admin/README.md index 93ad5e3dd0a259..600d50cd5a4ffa 100644 --- a/examples/fabric-admin/README.md +++ b/examples/fabric-admin/README.md @@ -23,13 +23,13 @@ For Raspberry Pi 4 example: ### Pull Docker Images ``` -docker pull ghcr.io/project-chip/chip-build-crosscompile:97 +docker pull ghcr.io/project-chip/chip-build-crosscompile:104 ``` ### Run docker ``` -docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:97 /bin/bash +docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:104 /bin/bash ``` ### Build diff --git a/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.zap b/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.zap index 653742177876cd..c023f88780be3b 100644 --- a/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.zap +++ b/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3979,14 +3981,16 @@ "code": 14, "profileId": 259, "label": "MA-aggregator", - "name": "MA-aggregator" + "name": "MA-aggregator", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 14, "profileId": 259, "label": "MA-aggregator", - "name": "MA-aggregator" + "name": "MA-aggregator", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4353,7 +4357,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4369,23 +4373,7 @@ "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": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4401,7 +4389,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/fabric-bridge-app/linux/README.md b/examples/fabric-bridge-app/linux/README.md index e7b4c02923c84e..20889041007b97 100644 --- a/examples/fabric-bridge-app/linux/README.md +++ b/examples/fabric-bridge-app/linux/README.md @@ -100,13 +100,13 @@ defined: Pull Docker Images ``` - docker pull ghcr.io/project-chip/chip-build-crosscompile:97 + docker pull ghcr.io/project-chip/chip-build-crosscompile:104 ``` Run docker ``` - docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:97 /bin/bash + docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:104 /bin/bash ``` Build diff --git a/examples/fabric-bridge-app/linux/main.cpp b/examples/fabric-bridge-app/linux/main.cpp index 8c622cac541004..4ba1e65ebc2b28 100644 --- a/examples/fabric-bridge-app/linux/main.cpp +++ b/examples/fabric-bridge-app/linux/main.cpp @@ -122,9 +122,24 @@ class AdministratorCommissioningCommandHandler : public CommandHandlerInterface CommandHandlerInterface(Optional::Missing(), AdministratorCommissioning::Id) {} + CHIP_ERROR Init(); + void InvokeCommand(HandlerContext & handlerContext) override; + +private: + CommandHandlerInterface * mOriginalCommandHandlerInterface = nullptr; }; +CHIP_ERROR AdministratorCommissioningCommandHandler::Init() +{ + mOriginalCommandHandlerInterface = + CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(kRootEndpointId, AdministratorCommissioning::Id); + VerifyOrReturnError(mOriginalCommandHandlerInterface, CHIP_ERROR_INTERNAL); + ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler(mOriginalCommandHandlerInterface)); + ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(this)); + return CHIP_NO_ERROR; +} + void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & handlerContext) { using Protocols::InteractionModel::Status; @@ -136,6 +151,7 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha endpointId == kRootEndpointId) { // Proceed with default handling in Administrator Commissioning Server + mOriginalCommandHandlerInterface->InvokeCommand(handlerContext); return; } @@ -252,9 +268,11 @@ void ApplicationInit() ChipLogDetail(NotSpecified, "Fabric-Bridge: ApplicationInit()"); MatterEcosystemInformationPluginServerInitCallback(); - CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&bridge::gAdministratorCommissioningCommandHandler); - CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&bridge::gBridgedDeviceInformationCommandHandler); - AttributeAccessInterfaceRegistry::Instance().Register(&bridge::gBridgedDeviceBasicInformationAttributes); + VerifyOrDieWithMsg(CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler( + &bridge::gBridgedDeviceInformationCommandHandler) == CHIP_NO_ERROR, + NotSpecified, "Failed to register bridged device command handler"); + VerifyOrDieWithMsg(AttributeAccessInterfaceRegistry::Instance().Register(&bridge::gBridgedDeviceBasicInformationAttributes), + NotSpecified, "Failed to register bridged device attribute access"); #if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE bridge::SetRpcRemoteServerPort(gFabricAdminServerPort); @@ -264,6 +282,8 @@ void ApplicationInit() bridge::BridgedDeviceManager::Instance().Init(); VerifyOrDie(bridge::gBridgedAdministratorCommissioning.Init() == CHIP_NO_ERROR); + VerifyOrDieWithMsg(bridge::gAdministratorCommissioningCommandHandler.Init() == CHIP_NO_ERROR, NotSpecified, + "Failed to initialize Commissioner command handler"); VerifyOrDieWithMsg(bridge::CommissionerControlInit() == CHIP_NO_ERROR, NotSpecified, "Failed to initialize Commissioner Control Server"); diff --git a/examples/fabric-sync/README.md b/examples/fabric-sync/README.md index 254eb6ba1562e3..64fee61b3431de 100644 --- a/examples/fabric-sync/README.md +++ b/examples/fabric-sync/README.md @@ -92,13 +92,13 @@ defined: Pull Docker Images ```sh - docker pull ghcr.io/project-chip/chip-build-crosscompile:97 + docker pull ghcr.io/project-chip/chip-build-crosscompile:104 ``` Run docker ```sh - docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:97 /bin/bash + docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:104 /bin/bash ``` Build diff --git a/examples/fabric-sync/bridge/fabric-bridge.zap b/examples/fabric-sync/bridge/fabric-bridge.zap index 653742177876cd..dfaf7131d84784 100644 --- a/examples/fabric-sync/bridge/fabric-bridge.zap +++ b/examples/fabric-sync/bridge/fabric-bridge.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3979,14 +3981,16 @@ "code": 14, "profileId": 259, "label": "MA-aggregator", - "name": "MA-aggregator" + "name": "MA-aggregator", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 14, "profileId": 259, "label": "MA-aggregator", - "name": "MA-aggregator" + "name": "MA-aggregator", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4353,7 +4357,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4369,23 +4373,7 @@ "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": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4401,7 +4389,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/fabric-sync/bridge/src/Bridge.cpp b/examples/fabric-sync/bridge/src/Bridge.cpp index 770509957b99a5..458a7fdc889ff6 100644 --- a/examples/fabric-sync/bridge/src/Bridge.cpp +++ b/examples/fabric-sync/bridge/src/Bridge.cpp @@ -53,9 +53,24 @@ class AdministratorCommissioningCommandHandler : public CommandHandlerInterface CommandHandlerInterface(Optional::Missing(), AdministratorCommissioning::Id) {} + CHIP_ERROR Init(); + void InvokeCommand(HandlerContext & handlerContext) override; + +private: + CommandHandlerInterface * mOriginalCommandHandlerInterface = nullptr; }; +CHIP_ERROR AdministratorCommissioningCommandHandler::Init() +{ + mOriginalCommandHandlerInterface = + CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(kRootEndpointId, AdministratorCommissioning::Id); + VerifyOrReturnError(mOriginalCommandHandlerInterface, CHIP_ERROR_INTERNAL); + ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler(mOriginalCommandHandlerInterface)); + ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(this)); + return CHIP_NO_ERROR; +} + void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & handlerContext) { using Protocols::InteractionModel::Status; @@ -66,6 +81,7 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha endpointId == kRootEndpointId) { // Proceed with default handling in Administrator Commissioning Server + mOriginalCommandHandlerInterface->InvokeCommand(handlerContext); return; } @@ -200,9 +216,11 @@ BridgedDeviceInformationCommandHandler gBridgedDeviceInformationCommandHandler; CHIP_ERROR BridgeInit(FabricAdminDelegate * delegate) { MatterEcosystemInformationPluginServerInitCallback(); - CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gAdministratorCommissioningCommandHandler); - CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gBridgedDeviceInformationCommandHandler); - AttributeAccessInterfaceRegistry::Instance().Register(&gBridgedDeviceBasicInformationAttributes); + ReturnErrorOnFailure(gAdministratorCommissioningCommandHandler.Init()); + ReturnErrorOnFailure( + CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gBridgedDeviceInformationCommandHandler)); + VerifyOrReturnError(AttributeAccessInterfaceRegistry::Instance().Register(&gBridgedDeviceBasicInformationAttributes), + CHIP_ERROR_INTERNAL); BridgedDeviceManager::Instance().Init(); FabricBridge::Instance().SetDelegate(delegate); diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt index 1758fbd868fbfb..ff9cd06d436ef7 100644 --- a/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt @@ -58,10 +58,12 @@ class PairOnNetworkLongImReadCommand( event.getJson().toString() == """{"0:STRUCT":{"0:UINT":1}}""" fun checkAllAttributesJsonForFixedLabel(cluster: String): Boolean { + // TODO: this hard-codes the array and as a result it is order-dependend. This should + // be changed to be order-independent. val expected = """{"65528:ARRAY-?":[],"0:ARRAY-STRUCT":[{"0:STRING":"room","1:STRING":"bedroom 2"},""" + """{"0:STRING":"orientation","1:STRING":"North"},{"0:STRING":"floor","1:STRING":"2"},""" + - """{"0:STRING":"direction","1:STRING":"up"}],"65531:ARRAY-UINT":[0,65528,65529,65531,65532,65533],""" + + """{"0:STRING":"direction","1:STRING":"up"}],"65531:ARRAY-UINT":[0,65532,65533,65528,65529,65531],""" + """"65533:UINT":1,"65529:ARRAY-?":[],"65532:UINT":0}""" return cluster.equals(expected) } diff --git a/examples/laundry-washer-app/nxp/zap/laundry-washer-app.zap b/examples/laundry-washer-app/nxp/zap/laundry-washer-app.zap index 9a8d968d15c421..1cbadd09632346 100644 --- a/examples/laundry-washer-app/nxp/zap/laundry-washer-app.zap +++ b/examples/laundry-washer-app/nxp/zap/laundry-washer-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -3879,22 +3879,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4001,22 +3985,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4123,22 +4091,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4245,22 +4197,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4433,22 +4369,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4603,22 +4523,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4751,22 +4655,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4995,22 +4883,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5098,4 +4970,4 @@ "parentEndpointIdentifier": null } ] -} +} \ No newline at end of file diff --git a/examples/light-switch-app/ameba/README.md b/examples/light-switch-app/ameba/README.md index 4b79744e03751d..a57df10e44e032 100644 --- a/examples/light-switch-app/ameba/README.md +++ b/examples/light-switch-app/ameba/README.md @@ -26,11 +26,11 @@ The CHIP demo application is supported on - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/light-switch-app/light-switch-common/icd-lit-light-switch-app.zap b/examples/light-switch-app/light-switch-common/icd-lit-light-switch-app.zap index bc81c51ff705c8..54396602d8350a 100644 --- a/examples/light-switch-app/light-switch-common/icd-lit-light-switch-app.zap +++ b/examples/light-switch-app/light-switch-common/icd-lit-light-switch-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -4493,10 +4493,10 @@ "side": "server", "type": "OperatingModeEnum", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4525,10 +4525,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.zap b/examples/light-switch-app/light-switch-common/light-switch-app.zap index 595b0d8f838a7d..d0f7a6a638b8a8 100644 --- a/examples/light-switch-app/light-switch-common/light-switch-app.zap +++ b/examples/light-switch-app/light-switch-common/light-switch-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4369,10 +4371,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4405,14 +4407,16 @@ "code": 259, "profileId": 259, "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" + "name": "MA-onofflightswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 259, "profileId": 259, "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" + "name": "MA-onofflightswitch", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -5175,14 +5179,16 @@ "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/light-switch-app/qpg/zap/switch.zap b/examples/light-switch-app/qpg/zap/switch.zap index 5e0a5474ab6e64..5553d5e9198823 100644 --- a/examples/light-switch-app/qpg/zap/switch.zap +++ b/examples/light-switch-app/qpg/zap/switch.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -165,22 +167,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -351,22 +337,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -809,22 +779,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1062,22 +1016,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1383,22 +1321,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1619,22 +1541,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1951,22 +1857,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2075,22 +1965,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2545,22 +2419,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3621,22 +3479,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3801,22 +3643,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4101,22 +3927,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4321,22 +4131,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4443,22 +4237,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4565,22 +4343,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4816,10 +4578,10 @@ "side": "server", "type": "OperatingModeEnum", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4857,22 +4619,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4896,10 +4642,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0007", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4932,14 +4678,16 @@ "code": 261, "profileId": 259, "label": "MA-colordimmerswitch", - "name": "MA-colordimmerswitch" + "name": "MA-colordimmerswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 261, "profileId": 259, "label": "MA-colordimmerswitch", - "name": "MA-colordimmerswitch" + "name": "MA-colordimmerswitch", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -5068,22 +4816,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5478,22 +5210,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5600,22 +5316,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5808,14 +5508,16 @@ "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 15, "profileId": 259, "label": "MA-genericswitch", - "name": "MA-genericswitch" + "name": "MA-genericswitch", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -5918,22 +5620,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6088,22 +5774,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6242,22 +5912,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/light-switch-app/telink/README.md b/examples/light-switch-app/telink/README.md index b2c75f1fc28fb9..087ef533a648cb 100755 --- a/examples/light-switch-app/telink/README.md +++ b/examples/light-switch-app/telink/README.md @@ -17,7 +17,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/lighting-app-data-mode-no-unique-id/lighting-common/lighting-app.zap b/examples/lighting-app-data-mode-no-unique-id/lighting-common/lighting-app.zap index 986b06ef58a81b..48cfce34f6c54e 100644 --- a/examples/lighting-app-data-mode-no-unique-id/lighting-common/lighting-app.zap +++ b/examples/lighting-app-data-mode-no-unique-id/lighting-common/lighting-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/lighting-app/ameba/README.md b/examples/lighting-app/ameba/README.md index ce6ae8402bcd58..ad6e173246489e 100644 --- a/examples/lighting-app/ameba/README.md +++ b/examples/lighting-app/ameba/README.md @@ -23,11 +23,11 @@ The CHIP demo application is supported on - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.zap b/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.zap index 5115fe9657926f..5e2fb2a77cde22 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.zap +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2444,14 +2446,16 @@ "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.zap b/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.zap index f3e9a7c5ce2aba..6298c0fd751b6b 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.zap +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3420,14 +3422,16 @@ "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.zap b/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.zap index 2afef0893a4091..711fa3801f906d 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.zap +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2627,14 +2629,16 @@ "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/lighting-app/lighting-common/lighting-app.zap b/examples/lighting-app/lighting-common/lighting-app.zap index e714f74af15315..1195ca24f4963b 100644 --- a/examples/lighting-app/lighting-common/lighting-app.zap +++ b/examples/lighting-app/lighting-common/lighting-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -17,13 +17,6 @@ } ], "package": [ - { - "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", - "category": "matter", - "version": "chip-v1" - }, { "pathRelativity": "relativeToZap", "path": "../../../src/app/zap-templates/zcl/zcl.json", @@ -31,6 +24,13 @@ "category": "matter", "version": 1, "description": "Matter SDK ZCL data" + }, + { + "pathRelativity": "relativeToZap", + "path": "../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", + "category": "matter", + "version": "chip-v1" } ], "endpointTypes": [ @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3992,14 +3994,16 @@ "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.zap b/examples/lighting-app/nxp/zap/lighting-on-off.zap index f8293b8cfc4e25..602644eaa421c7 100644 --- a/examples/lighting-app/nxp/zap/lighting-on-off.zap +++ b/examples/lighting-app/nxp/zap/lighting-on-off.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2985,14 +2987,16 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/lighting-app/qpg/zap/light.zap b/examples/lighting-app/qpg/zap/light.zap index b744892b3b9423..c6b77575ea86fc 100644 --- a/examples/lighting-app/qpg/zap/light.zap +++ b/examples/lighting-app/qpg/zap/light.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4118,14 +4120,16 @@ "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/lighting-app/silabs/data_model/lighting-thread-app.zap b/examples/lighting-app/silabs/data_model/lighting-thread-app.zap index 6e7931fbcf0f68..c8c15db0dc8c8d 100644 --- a/examples/lighting-app/silabs/data_model/lighting-thread-app.zap +++ b/examples/lighting-app/silabs/data_model/lighting-thread-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3103,14 +3105,16 @@ "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 269, "profileId": 259, "label": "MA-extendedcolorlight", - "name": "MA-extendedcolorlight" + "name": "MA-extendedcolorlight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3213,22 +3217,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3417,22 +3405,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3653,22 +3625,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4049,22 +4005,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4219,22 +4159,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4480,22 +4404,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5076,22 +4984,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/lighting-app/silabs/data_model/lighting-wifi-app.zap b/examples/lighting-app/silabs/data_model/lighting-wifi-app.zap index a0b64b71934eea..36a9bdee26ea05 100644 --- a/examples/lighting-app/silabs/data_model/lighting-wifi-app.zap +++ b/examples/lighting-app/silabs/data_model/lighting-wifi-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2580,20 +2582,23 @@ "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2698,22 +2703,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2902,22 +2891,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3138,22 +3111,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3534,22 +3491,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3704,22 +3645,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3986,22 +3911,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4255,22 +4164,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/lighting-app/telink/README.md b/examples/lighting-app/telink/README.md index 1a142507652784..ba41630d9ff37f 100644 --- a/examples/lighting-app/telink/README.md +++ b/examples/lighting-app/telink/README.md @@ -15,7 +15,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap index 18c561cfbf3314..db31e23cda9236 100644 --- a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap +++ b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,20 +41,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -173,22 +176,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -359,22 +346,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -714,22 +685,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1010,22 +965,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1246,22 +1185,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1554,22 +1477,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1750,22 +1657,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2554,22 +2445,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2854,22 +2729,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3074,22 +2933,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3441,10 +3284,10 @@ "side": "server", "type": "OperatingModeEnum", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3498,22 +3341,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3537,10 +3364,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x000F", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3573,14 +3400,16 @@ "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 21, "profileId": 259, "label": "MA-contactsensor", - "name": "MA-contactsensor" + "name": "MA-contactsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3683,22 +3512,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3853,22 +3666,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3975,22 +3772,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/lock-app/lock-common/lock-app.zap b/examples/lock-app/lock-common/lock-app.zap index 07c256d1cb1851..26b5479634070d 100644 --- a/examples/lock-app/lock-common/lock-app.zap +++ b/examples/lock-app/lock-common/lock-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -4643,10 +4643,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lock-app/nxp/zap/lock-app.zap b/examples/lock-app/nxp/zap/lock-app.zap index e888db45055184..065627216cd93f 100644 --- a/examples/lock-app/nxp/zap/lock-app.zap +++ b/examples/lock-app/nxp/zap/lock-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -96,7 +98,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -112,7 +114,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -128,7 +130,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -165,22 +167,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -250,7 +236,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -266,7 +252,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -351,22 +337,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -452,7 +422,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -468,7 +438,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -484,7 +454,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -500,7 +470,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -516,7 +486,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -532,7 +502,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -548,7 +518,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -564,7 +534,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -580,7 +550,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -596,7 +566,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -612,7 +582,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -713,22 +683,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -966,22 +920,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1074,7 +1012,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1090,7 +1028,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1127,22 +1065,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1363,22 +1285,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1695,22 +1601,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1819,22 +1709,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1962,7 +1836,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2031,22 +1905,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3232,22 +3090,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3404,22 +3246,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3704,22 +3530,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3924,22 +3734,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4078,22 +3872,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4117,10 +3895,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4153,14 +3931,16 @@ "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4263,22 +4043,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4433,22 +4197,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5317,22 +5065,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/lock-app/qpg/zap/lock.zap b/examples/lock-app/qpg/zap/lock.zap index f8a1eee9ae162d..d201f869a01d23 100644 --- a/examples/lock-app/qpg/zap/lock.zap +++ b/examples/lock-app/qpg/zap/lock.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4197,22 +4199,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4236,10 +4222,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4272,14 +4258,16 @@ "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/lock-app/silabs/data_model/lock-app.zap b/examples/lock-app/silabs/data_model/lock-app.zap index e3488a663bc5d9..72c0be53a2e728 100644 --- a/examples/lock-app/silabs/data_model/lock-app.zap +++ b/examples/lock-app/silabs/data_model/lock-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,20 +41,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -173,22 +176,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -359,22 +346,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -817,22 +788,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1135,22 +1090,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1337,22 +1276,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1582,22 +1505,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1890,22 +1797,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2226,22 +2117,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4083,22 +3958,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4383,22 +4242,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4603,22 +4446,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4848,10 +4675,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4884,20 +4711,23 @@ "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 10, "profileId": 259, "label": "MA-doorlock", - "name": "MA-doorlock" + "name": "MA-doorlock", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -5002,22 +4832,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5172,22 +4986,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5422,22 +5220,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6146,22 +5928,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/lock-app/telink/README.md b/examples/lock-app/telink/README.md index 9f6e8671ccbb3b..49e63e0c01e3a9 100755 --- a/examples/lock-app/telink/README.md +++ b/examples/lock-app/telink/README.md @@ -15,7 +15,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/log-source-app/log-source-common/log-source-app.zap b/examples/log-source-app/log-source-common/log-source-app.zap index dff2d9fcc35ed8..4291a3724d2e9f 100644 --- a/examples/log-source-app/log-source-common/log-source-app.zap +++ b/examples/log-source-app/log-source-common/log-source-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 4293984259, "profileId": 259, "label": "MA-all-clusters-app", - "name": "MA-all-clusters-app" + "name": "MA-all-clusters-app", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 4293984259, "profileId": 259, "label": "MA-all-clusters-app", - "name": "MA-all-clusters-app" + "name": "MA-all-clusters-app", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter index bf5f45f4027a80..57fd7ea5b7eb87 100644 --- a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter +++ b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter @@ -1713,7 +1713,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute attributeList; ram attribute featureMap default = 0; - ram attribute clusterRevision default = 4; + ram attribute clusterRevision default = 5; handle command Identify; handle command TriggerEffect; @@ -1772,7 +1772,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute attributeList; ram attribute featureMap default = 0; - ram attribute clusterRevision default = 2; + ram attribute clusterRevision default = 3; handle command Pause; handle command Stop; diff --git a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap index 03113285ad2567..85e1153437fcb9 100644 --- a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap +++ b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -793,22 +795,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2678,14 +2664,16 @@ "code": 121, "profileId": 259, "label": "MA-microwave-oven", - "name": "MA-microwave-oven" + "name": "MA-microwave-oven", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 121, "profileId": 259, "label": "MA-microwave-oven", - "name": "MA-microwave-oven" + "name": "MA-microwave-oven", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2830,7 +2818,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "5", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -2942,22 +2930,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3080,22 +3052,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3316,22 +3272,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3560,22 +3500,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3618,7 +3542,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "2", + "defaultValue": "3", "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/network-manager-app/network-manager-common/network-manager-app.zap b/examples/network-manager-app/network-manager-common/network-manager-app.zap index dd4232bae2c4c2..98816f931961b6 100644 --- a/examples/network-manager-app/network-manager-common/network-manager-app.zap +++ b/examples/network-manager-app/network-manager-common/network-manager-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap b/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap index eb621485f6d0d4..909d520c0a6406 100644 --- a/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap +++ b/examples/ota-provider-app/ota-provider-common/ota-provider-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/ota-requestor-app/ameba/README.md b/examples/ota-requestor-app/ameba/README.md index c78e030ca6dc4b..f7c2fef69b37e3 100644 --- a/examples/ota-requestor-app/ameba/README.md +++ b/examples/ota-requestor-app/ameba/README.md @@ -6,11 +6,11 @@ A prototype application that demonstrates OTA Requestor capabilities. - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap index ab924da3dfabc7..628714cfbd077e 100644 --- a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap +++ b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,20 +41,23 @@ "code": 18, "profileId": 259, "label": "MA-otarequestor", - "name": "MA-otarequestor" + "name": "MA-otarequestor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 18, "profileId": 259, "label": "MA-otarequestor", - "name": "MA-otarequestor" + "name": "MA-otarequestor", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -173,22 +176,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -359,22 +346,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -817,22 +788,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1070,22 +1025,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1329,22 +1268,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1637,22 +1560,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1913,22 +1820,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2102,22 +1993,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2402,22 +2277,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2622,22 +2481,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2813,14 +2656,16 @@ "code": 259, "profileId": 259, "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" + "name": "MA-onofflightswitch", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 259, "profileId": 259, "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" + "name": "MA-onofflightswitch", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3400,14 +3245,16 @@ "code": 25, "profileId": 259, "label": "MA-secondary-network-interface", - "name": "MA-secondary-network-interface" + "name": "MA-secondary-network-interface", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 25, "profileId": 259, "label": "MA-secondary-network-interface", - "name": "MA-secondary-network-interface" + "name": "MA-secondary-network-interface", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3524,22 +3371,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3832,22 +3663,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/ota-requestor-app/telink/README.md b/examples/ota-requestor-app/telink/README.md index 0c359b3af5ac01..d3e9f8a3cc201b 100755 --- a/examples/ota-requestor-app/telink/README.md +++ b/examples/ota-requestor-app/telink/README.md @@ -8,7 +8,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/pigweed-app/ameba/README.md b/examples/pigweed-app/ameba/README.md index 9e5c4b2dc47eb2..286090e10dce01 100644 --- a/examples/pigweed-app/ameba/README.md +++ b/examples/pigweed-app/ameba/README.md @@ -31,11 +31,11 @@ following features are available: - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/placeholder/linux/apps/app1/config.zap b/examples/placeholder/linux/apps/app1/config.zap index 248e02c0537aa5..7db61d0f75b00b 100644 --- a/examples/placeholder/linux/apps/app1/config.zap +++ b/examples/placeholder/linux/apps/app1/config.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -41,20 +41,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -173,22 +176,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -359,22 +346,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -868,22 +839,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1029,22 +984,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1183,22 +1122,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1289,22 +1212,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1907,22 +1814,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2177,22 +2068,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2485,22 +2360,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2761,22 +2620,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5064,22 +4907,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5438,22 +5265,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5658,22 +5469,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -10899,14 +10694,16 @@ "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -14241,10 +14038,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x00", + "defaultValue": null, "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -14289,10 +14086,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x00", + "defaultValue": null, "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -14337,10 +14134,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x00", + "defaultValue": null, "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -14591,22 +14388,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/placeholder/linux/apps/app2/config.zap b/examples/placeholder/linux/apps/app2/config.zap index 463c73a9c42371..4c43d0b427a458 100644 --- a/examples/placeholder/linux/apps/app2/config.zap +++ b/examples/placeholder/linux/apps/app2/config.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,20 +41,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -173,22 +176,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -359,22 +346,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -868,22 +839,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1029,22 +984,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1183,22 +1122,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1305,22 +1228,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1923,22 +1830,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2193,22 +2084,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2501,22 +2376,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2777,22 +2636,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5080,22 +4923,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5454,22 +5281,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5674,22 +5485,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -10981,14 +10776,16 @@ "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -14053,10 +13850,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x00", + "defaultValue": null, "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -14101,10 +13898,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x00", + "defaultValue": null, "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -14149,10 +13946,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x00", + "defaultValue": null, "reportable": 1, "minInterval": 0, "maxInterval": 65344, diff --git a/examples/platform/silabs/BaseApplication.cpp b/examples/platform/silabs/BaseApplication.cpp index 9b0cf784fb4428..9ceef7fc7dab75 100644 --- a/examples/platform/silabs/BaseApplication.cpp +++ b/examples/platform/silabs/BaseApplication.cpp @@ -44,10 +44,10 @@ #endif // ENABLE_CHIP_SHELL #endif // CHIP_CONFIG_ENABLE_ICD_SERVER -#include #include #include #include +#include #include #include #include diff --git a/examples/platform/silabs/FreeRTOSConfig.h b/examples/platform/silabs/FreeRTOSConfig.h index 462f923aff895b..2d061fad9159be 100644 --- a/examples/platform/silabs/FreeRTOSConfig.h +++ b/examples/platform/silabs/FreeRTOSConfig.h @@ -174,11 +174,8 @@ extern uint32_t SystemCoreClock; /* Software timer related definitions. */ #define configUSE_TIMERS (1) -#ifdef SLI_SI917 +// Keep the timerTask at the highest prio as some of our stacks tasks leverage eventing with timers. #define configTIMER_TASK_PRIORITY (55) /* Highest priority */ -#else -#define configTIMER_TASK_PRIORITY (40) /* Highest priority */ -#endif // SLI_SI917 #define configTIMER_QUEUE_LENGTH (10) #define configTIMER_TASK_STACK_DEPTH (1024) @@ -313,7 +310,7 @@ standard names. */ /* Thread local storage pointers used by the SDK */ #ifndef configNUM_USER_THREAD_LOCAL_STORAGE_POINTERS -#define configNUM_USER_THREAD_LOCAL_STORAGE_POINTERS 2 +#define configNUM_USER_THREAD_LOCAL_STORAGE_POINTERS 0 #endif #ifndef configNUM_SDK_THREAD_LOCAL_STORAGE_POINTERS diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp index 1d94da32b45909..bac4016e6c1094 100644 --- a/examples/platform/silabs/MatterConfig.cpp +++ b/examples/platform/silabs/MatterConfig.cpp @@ -53,10 +53,10 @@ static chip::DeviceLayer::Internal::Efr32PsaOperationalKeystore gOperationalKeystore; #endif -#include #include #include #include +#include #ifdef SL_MATTER_TEST_EVENT_TRIGGER_ENABLED #include "SilabsTestEventTriggerDelegate.h" // nogncheck diff --git a/examples/platform/silabs/SiWx917/BUILD.gn b/examples/platform/silabs/SiWx917/BUILD.gn index 3087a5f64ba9b8..527f83b6a86b5b 100644 --- a/examples/platform/silabs/SiWx917/BUILD.gn +++ b/examples/platform/silabs/SiWx917/BUILD.gn @@ -18,11 +18,15 @@ import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") import("${chip_root}/examples/platform/silabs/args.gni") import("${chip_root}/src/lib/lib.gni") import("${chip_root}/src/platform/device.gni") -import("${chip_root}/src/platform/silabs/provision/args.gni") import("${chip_root}/src/platform/silabs/wifi/args.gni") import("${chip_root}/third_party/silabs/silabs_board.gni") import("${silabs_sdk_build_root}/SiWx917_sdk.gni") +import("${matter_support_root}/provision/args.gni") # Seperate import since the + # matter_support_root is + # defined in the + # ef32_sdk.gni + declare_args() { enable_heap_monitoring = false @@ -68,7 +72,7 @@ source_set("test-event-trigger") { "${silabs_common_plat_dir}/SilabsTestEventTriggerDelegate.h", ] - deps = [ "${sl_provision_root}:provision-headers" ] + deps = [ "${sl_provision_root}:headers" ] public_configs = [ ":test-event-trigger-config" ] public_deps = [ "${chip_root}/src/app:test-event-trigger", diff --git a/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp b/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp index cacb60555b6085..4d99346b4e5831 100644 --- a/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp +++ b/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp @@ -17,7 +17,7 @@ */ #include "SilabsTestEventTriggerDelegate.h" -#include +#include using namespace ::chip::DeviceLayer; diff --git a/examples/platform/silabs/efr32/BUILD.gn b/examples/platform/silabs/efr32/BUILD.gn index 8b54549ad64528..25d0156d271a91 100644 --- a/examples/platform/silabs/efr32/BUILD.gn +++ b/examples/platform/silabs/efr32/BUILD.gn @@ -18,10 +18,13 @@ import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") import("${chip_root}/src/app/icd/icd.gni") import("${chip_root}/src/lib/lib.gni") import("${chip_root}/src/platform/device.gni") -import("${chip_root}/src/platform/silabs/provision/args.gni") import("${silabs_sdk_build_root}/efr32_sdk.gni") import("${silabs_sdk_build_root}/silabs_board.gni") +import("${matter_support_root}/provision/args.gni") # Seperate import since the + # matter_support_root is + # defined in the + # ef32_sdk.gni declare_args() { enable_heap_monitoring = false @@ -72,7 +75,7 @@ source_set("test-event-trigger") { "${silabs_common_plat_dir}/SilabsTestEventTriggerDelegate.h", ] - deps = [ "${sl_provision_root}:provision-headers" ] + deps = [ "${sl_provision_root}:headers" ] public_configs = [ ":test-event-trigger-config" ] public_deps = [ "${chip_root}/src/app:test-event-trigger", diff --git a/examples/platform/silabs/provision/BUILD.gn b/examples/platform/silabs/provision/BUILD.gn index 1ab4744a2e12e4..79931e3c609568 100644 --- a/examples/platform/silabs/provision/BUILD.gn +++ b/examples/platform/silabs/provision/BUILD.gn @@ -14,7 +14,6 @@ import("//build_overrides/chip.gni") import("//build_overrides/efr32_sdk.gni") -import("${chip_root}/src/platform/silabs/provision/args.gni") import("${silabs_sdk_build_root}/silabs_board.gni") if (wifi_soc) { @@ -23,6 +22,8 @@ if (wifi_soc) { import("${silabs_sdk_build_root}/efr32_sdk.gni") } +# Seperate import since the matter_support_root is defined in the ef32_sdk.gni / SiWx917_sdk.gni +import("${matter_support_root}/provision/args.gni") source_set("storage") { sources = [ "ProvisionStorageCustom.cpp" ] @@ -34,22 +35,22 @@ source_set("storage") { if (wifi_soc) { if (sl_si91x_crypto_flavor == "psa") { - libs = - [ "${sdk_support_root}/matter/provision/lib/libProvisionPSA_si917.a" ] + libs = [ "${sl_provision_root}/libs/libProvisionPSA_si917.a" ] } else { - libs = [ "${sdk_support_root}/matter/provision/lib/libProvision_si917.a" ] + libs = [ "${sl_provision_root}/libs/libProvision_si917.a" ] } } else { if (use_provision_flash_storage) { - libs = [ "${sdk_support_root}/matter/provision/lib/libProvisionFlash_${silabs_family}.a" ] + libs = + [ "${sl_provision_root}/libs/libProvisionFlash_${silabs_family}.a" ] } else { - libs = [ "${sdk_support_root}/matter/provision/lib/libProvision_${silabs_family}.a" ] + libs = [ "${sl_provision_root}/libs/libProvision_${silabs_family}.a" ] } } deps = [ "${chip_root}/src/lib" ] - public_deps = [ "${sl_provision_root}:provision-headers" ] + public_deps = [ "${sl_provision_root}:headers" ] if (sl_enable_test_event_trigger) { # Temporary workaround since we have duplicated configurations diff --git a/examples/platform/silabs/provision/ProvisionStorageCustom.cpp b/examples/platform/silabs/provision/ProvisionStorageCustom.cpp index 1c069fe096cc1c..22f3a75a19d87c 100644 --- a/examples/platform/silabs/provision/ProvisionStorageCustom.cpp +++ b/examples/platform/silabs/provision/ProvisionStorageCustom.cpp @@ -15,8 +15,8 @@ * limitations under the License. */ #include +#include #include -#include #include namespace chip { diff --git a/examples/platform/silabs/provision/ProvisionStorageDefault.cpp b/examples/platform/silabs/provision/ProvisionStorageDefault.cpp index f58969734f520c..c395e2858effea 100644 --- a/examples/platform/silabs/provision/ProvisionStorageDefault.cpp +++ b/examples/platform/silabs/provision/ProvisionStorageDefault.cpp @@ -14,9 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "AttestationKey.h" -#include "ProvisionStorage.h" #include +#include +#include #include #include #include diff --git a/examples/platform/silabs/provision/ProvisionStorageFlash.cpp b/examples/platform/silabs/provision/ProvisionStorageFlash.cpp index b7642150e194dd..ebfd3ec53124cf 100644 --- a/examples/platform/silabs/provision/ProvisionStorageFlash.cpp +++ b/examples/platform/silabs/provision/ProvisionStorageFlash.cpp @@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "AttestationKey.h" -#include "ProvisionEncoder.h" -#include "ProvisionStorage.h" #include #include +#include +#include +#include #include #include #include diff --git a/examples/pump-app/pump-common/pump-app.zap b/examples/pump-app/pump-common/pump-app.zap index 4e4fe6570db239..eecdab3fdb5a22 100644 --- a/examples/pump-app/pump-common/pump-app.zap +++ b/examples/pump-app/pump-common/pump-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2797,14 +2799,16 @@ "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/pump-app/silabs/data_model/pump-thread-app.zap b/examples/pump-app/silabs/data_model/pump-thread-app.zap index e26ba1cc500af1..92a85984a1a6f3 100644 --- a/examples/pump-app/silabs/data_model/pump-thread-app.zap +++ b/examples/pump-app/silabs/data_model/pump-thread-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2797,14 +2799,16 @@ "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/pump-app/silabs/data_model/pump-wifi-app.zap b/examples/pump-app/silabs/data_model/pump-wifi-app.zap index e26ba1cc500af1..6999a744b68287 100644 --- a/examples/pump-app/silabs/data_model/pump-wifi-app.zap +++ b/examples/pump-app/silabs/data_model/pump-wifi-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2797,14 +2799,16 @@ "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 771, "profileId": 2457, "label": "MA-pump", - "name": "MA-pump" + "name": "MA-pump", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/pump-app/telink/README.md b/examples/pump-app/telink/README.md index 0f3337f5c08a78..8e07d65bd8050b 100755 --- a/examples/pump-app/telink/README.md +++ b/examples/pump-app/telink/README.md @@ -16,7 +16,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap b/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap index 9ef65ceeacc485..eb9a189cc01de2 100644 --- a/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap +++ b/examples/pump-controller-app/pump-controller-common/pump-controller-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2797,14 +2799,16 @@ "code": 772, "profileId": 2457, "label": "MA-pumpcontroller", - "name": "MA-pumpcontroller" + "name": "MA-pumpcontroller", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 772, "profileId": 2457, "label": "MA-pumpcontroller", - "name": "MA-pumpcontroller" + "name": "MA-pumpcontroller", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/pump-controller-app/telink/README.md b/examples/pump-controller-app/telink/README.md index 3d1cb1f204f499..f0119a54263070 100755 --- a/examples/pump-controller-app/telink/README.md +++ b/examples/pump-controller-app/telink/README.md @@ -17,7 +17,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap b/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap index 3040a2f479a904..ea0092cda71f49 100644 --- a/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap +++ b/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2662,14 +2664,16 @@ "code": 112, "profileId": 259, "label": "MA-refrigerator", - "name": "MA-refrigerator" + "name": "MA-refrigerator", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 112, "profileId": 259, "label": "MA-refrigerator", - "name": "MA-refrigerator" + "name": "MA-refrigerator", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2845,14 +2849,16 @@ "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3176,14 +3182,16 @@ "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 113, "profileId": 259, "label": "MA-temperature-controlled-cabinet", - "name": "MA-temperature-controlled-cabinet" + "name": "MA-temperature-controlled-cabinet", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/refrigerator-app/silabs/BUILD.gn b/examples/refrigerator-app/silabs/BUILD.gn index d902bb9e86da00..29ab32fc3936d8 100644 --- a/examples/refrigerator-app/silabs/BUILD.gn +++ b/examples/refrigerator-app/silabs/BUILD.gn @@ -154,7 +154,7 @@ silabs_executable("refrigerator_app") { "${efr32_sdk_root}/platform/driver/i2cspm/src/sl_i2cspm.c", "${efr32_sdk_root}/platform/emlib/src/em_i2c.c", "${examples_common_plat_dir}/TemperatureSensor.cpp", - "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_i2cspm_init.c", + "${matter_support_root}/board-support/efr32/${silabs_family}/${silabs_board}/autogen/sl_i2cspm_init.c", ] } diff --git a/examples/refrigerator-app/silabs/data_model/refrigerator-thread-app.zap b/examples/refrigerator-app/silabs/data_model/refrigerator-thread-app.zap index 47a8600389badb..a322e7435ad77e 100644 --- a/examples/refrigerator-app/silabs/data_model/refrigerator-thread-app.zap +++ b/examples/refrigerator-app/silabs/data_model/refrigerator-thread-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -3087,7 +3087,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3103,7 +3103,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3119,7 +3119,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/refrigerator-app/silabs/data_model/refrigerator-wifi-app.zap b/examples/refrigerator-app/silabs/data_model/refrigerator-wifi-app.zap index d8bb82237f84c3..b2681e6f032a69 100644 --- a/examples/refrigerator-app/silabs/data_model/refrigerator-wifi-app.zap +++ b/examples/refrigerator-app/silabs/data_model/refrigerator-wifi-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -17,13 +17,6 @@ } ], "package": [ - { - "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", - "category": "matter", - "version": "chip-v1" - }, { "pathRelativity": "relativeToZap", "path": "../../../../src/app/zap-templates/zcl/zcl.json", @@ -31,6 +24,13 @@ "category": "matter", "version": 1, "description": "Matter SDK ZCL data" + }, + { + "pathRelativity": "relativeToZap", + "path": "../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", + "category": "matter", + "version": "chip-v1" } ], "endpointTypes": [ @@ -2992,7 +2992,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3008,7 +3008,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3024,7 +3024,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/rvc-app/rvc-common/rvc-app.zap b/examples/rvc-app/rvc-common/rvc-app.zap index 770686677a8630..4e4425222fc925 100644 --- a/examples/rvc-app/rvc-common/rvc-app.zap +++ b/examples/rvc-app/rvc-common/rvc-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1517,22 +1519,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1984,14 +1970,16 @@ "code": 116, "profileId": 259, "label": "MA-robotic-vacuum-cleaner", - "name": "MA-robotic-vacuum-cleaner" + "name": "MA-robotic-vacuum-cleaner", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 116, "profileId": 259, "label": "MA-robotic-vacuum-cleaner", - "name": "MA-robotic-vacuum-cleaner" + "name": "MA-robotic-vacuum-cleaner", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2094,22 +2082,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2264,22 +2236,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2420,22 +2376,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2576,22 +2516,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2796,22 +2720,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3049,22 +2957,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/shell/telink/README.md b/examples/shell/telink/README.md index 14e8bedb1c3bf0..65272899859498 100755 --- a/examples/shell/telink/README.md +++ b/examples/shell/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.zap b/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.zap index c6da2ccc572161..71145845c66eff 100644 --- a/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.zap +++ b/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3514,10 +3516,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3550,20 +3552,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 118, "profileId": 259, "label": "MA-smokecoalarm", - "name": "MA-smokecoalarm" + "name": "MA-smokecoalarm", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -3668,22 +3673,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3978,22 +3967,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4196,22 +4169,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4529,22 +4486,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/smoke-co-alarm-app/telink/README.md b/examples/smoke-co-alarm-app/telink/README.md index a2fce29d1b1fd3..5f0b94d14d162f 100755 --- a/examples/smoke-co-alarm-app/telink/README.md +++ b/examples/smoke-co-alarm-app/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/temperature-measurement-app/telink/README.md b/examples/temperature-measurement-app/telink/README.md index 7dc9287a54ca55..2e838ca93ad12a 100644 --- a/examples/temperature-measurement-app/telink/README.md +++ b/examples/temperature-measurement-app/telink/README.md @@ -16,7 +16,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap index 691a28bdc8c682..110f2a7becf399 100644 --- a/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap +++ b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -1435,22 +1437,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2882,14 +2868,16 @@ "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 770, "profileId": 259, "label": "MA-tempsensor", - "name": "MA-tempsensor" + "name": "MA-tempsensor", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/terms-and-conditions-app/terms-and-conditions-common/terms-and-conditions-app.zap b/examples/terms-and-conditions-app/terms-and-conditions-common/terms-and-conditions-app.zap index b3f5c2dd113681..76846efb3ac347 100644 --- a/examples/terms-and-conditions-app/terms-and-conditions-common/terms-and-conditions-app.zap +++ b/examples/terms-and-conditions-app/terms-and-conditions-common/terms-and-conditions-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -2500,7 +2500,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2516,7 +2516,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2532,7 +2532,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2548,7 +2548,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2564,7 +2564,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2580,7 +2580,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2596,7 +2596,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2612,7 +2612,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2628,7 +2628,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/thermostat/nxp/zap/thermostat_matter_br.zap b/examples/thermostat/nxp/zap/thermostat_matter_br.zap index 02efbc71935f32..116d8d422d110c 100644 --- a/examples/thermostat/nxp/zap/thermostat_matter_br.zap +++ b/examples/thermostat/nxp/zap/thermostat_matter_br.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -19,18 +19,18 @@ "package": [ { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/zcl/zcl.json", - "type": "zcl-properties", + "path": "../../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", "category": "matter", - "version": 1, - "description": "Matter SDK ZCL data" + "version": "chip-v1" }, { "pathRelativity": "relativeToZap", - "path": "../../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", + "path": "../../../../src/app/zap-templates/zcl/zcl.json", + "type": "zcl-properties", "category": "matter", - "version": "chip-v1" + "version": 1, + "description": "Matter SDK ZCL data" } ], "endpointTypes": [ diff --git a/examples/thermostat/nxp/zap/thermostat_matter_thread.zap b/examples/thermostat/nxp/zap/thermostat_matter_thread.zap index 2542a8023caa35..e39b0cb78e3adb 100644 --- a/examples/thermostat/nxp/zap/thermostat_matter_thread.zap +++ b/examples/thermostat/nxp/zap/thermostat_matter_thread.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap b/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap index da639e7bc2cd08..2de2e08f06c55f 100644 --- a/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap +++ b/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 104, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { diff --git a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap index 82b782ddead7c6..ba12f9f55b4784 100644 --- a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap +++ b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3499,14 +3501,16 @@ "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 769, "profileId": 259, "label": "MA-thermostat", - "name": "MA-thermostat" + "name": "MA-thermostat", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/thermostat/telink/README.md b/examples/thermostat/telink/README.md index 26856132994c5d..a23ec166d7b130 100755 --- a/examples/thermostat/telink/README.md +++ b/examples/thermostat/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/thermostat/thermostat-common/thermostat.zap b/examples/thermostat/thermostat-common/thermostat.zap index 2a282afa2a46a1..82359181bb458e 100644 --- a/examples/thermostat/thermostat-common/thermostat.zap +++ b/examples/thermostat/thermostat-common/thermostat.zap @@ -107,7 +107,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -123,7 +123,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -139,7 +139,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -154,7 +154,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -170,7 +170,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -186,7 +186,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -303,7 +303,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -366,7 +366,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -382,7 +382,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -473,7 +473,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -489,7 +489,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -505,7 +505,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -521,7 +521,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -537,7 +537,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -553,7 +553,7 @@ "singleton": 1, "bounded": 0, "defaultValue": "", - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -569,7 +569,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -585,7 +585,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -601,7 +601,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -617,7 +617,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -633,7 +633,7 @@ "singleton": 1, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 @@ -808,7 +808,7 @@ "storageOption": "External", "singleton": 1, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -824,7 +824,7 @@ "storageOption": "External", "singleton": 1, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -840,7 +840,7 @@ "storageOption": "External", "singleton": 1, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1045,7 +1045,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1061,7 +1061,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1077,7 +1077,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1159,7 +1159,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "en-US", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1175,7 +1175,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1190,7 +1190,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1206,7 +1206,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1222,7 +1222,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1281,7 +1281,7 @@ "singleton": 0, "bounded": 0, "defaultValue": "0", - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -1526,7 +1526,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1542,7 +1542,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1558,7 +1558,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1786,7 +1786,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1802,7 +1802,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1818,7 +1818,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1995,7 +1995,7 @@ "singleton": 0, "bounded": 0, "defaultValue": null, - "reportable": 0, + "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 @@ -2106,7 +2106,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2122,7 +2122,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2138,7 +2138,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3916,7 +3916,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3932,7 +3932,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3948,7 +3948,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4200,7 +4200,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4216,7 +4216,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4232,7 +4232,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4404,7 +4404,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4420,7 +4420,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4436,7 +4436,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/thread-br-app/thread-br-common/thread-br-app.zap b/examples/thread-br-app/thread-br-common/thread-br-app.zap index 09f5a2e3a90442..ba281bf59209dd 100644 --- a/examples/thread-br-app/thread-br-common/thread-br-app.zap +++ b/examples/thread-br-app/thread-br-common/thread-br-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2040,14 +2042,16 @@ "code": 145, "profileId": 259, "label": "MA-thread-border-router", - "name": "MA-thread-border-router" + "name": "MA-thread-border-router", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 145, "profileId": 259, "label": "MA-thread-border-router", - "name": "MA-thread-border-router" + "name": "MA-thread-border-router", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2164,22 +2168,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2542,22 +2530,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2787,22 +2759,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/tv-app/android/App/build.gradle b/examples/tv-app/android/App/build.gradle index 42bb88d287a3d1..c3d68cd3a08d4e 100644 --- a/examples/tv-app/android/App/build.gradle +++ b/examples/tv-app/android/App/build.gradle @@ -1,12 +1,12 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.9.20' + ext.kotlin_version = '2.0.0' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/examples/tv-app/android/App/gradle.properties b/examples/tv-app/android/App/gradle.properties index 7357abbe5e28e8..44d1a678300aaa 100644 --- a/examples/tv-app/android/App/gradle.properties +++ b/examples/tv-app/android/App/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects @@ -24,4 +24,3 @@ matterSdkSourceBuild=false # example) to build SDK from source code and debug in Android Studio. # Set to blank to use the SDK prebuilt by scripts/build/build_examples.py. matterBuildSrcDir=out/android-arm64-chip-tvserver - diff --git a/examples/tv-app/android/App/gradle/wrapper/gradle-wrapper.properties b/examples/tv-app/android/App/gradle/wrapper/gradle-wrapper.properties index da67dc800c423c..45cc74c0d945aa 100644 --- a/examples/tv-app/android/App/gradle/wrapper/gradle-wrapper.properties +++ b/examples/tv-app/android/App/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Oct 26 11:10:18 CST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/examples/tv-app/tv-common/tv-app.zap b/examples/tv-app/tv-common/tv-app.zap index 3ea4adf772089f..2579ea82d487e2 100644 --- a/examples/tv-app/tv-common/tv-app.zap +++ b/examples/tv-app/tv-common/tv-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4394,14 +4396,16 @@ "code": 35, "profileId": 259, "label": "MA-casting-videoplayer", - "name": "MA-casting-videoplayer" + "name": "MA-casting-videoplayer", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 35, "profileId": 259, "label": "MA-casting-videoplayer", - "name": "MA-casting-videoplayer" + "name": "MA-casting-videoplayer", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4695,22 +4699,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6315,22 +6303,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6399,14 +6371,16 @@ "code": 34, "profileId": 259, "label": "MA-speaker", - "name": "MA-speaker" + "name": "MA-speaker", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 34, "profileId": 259, "label": "MA-speaker", - "name": "MA-speaker" + "name": "MA-speaker", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -6950,14 +6924,16 @@ "code": 36, "profileId": 259, "label": "MA-contentapp", - "name": "MA-contentapp" + "name": "MA-contentapp", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 36, "profileId": 259, "label": "MA-contentapp", - "name": "MA-contentapp" + "name": "MA-contentapp", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -7132,22 +7108,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -8760,22 +8720,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/tv-casting-app/android/App/build.gradle b/examples/tv-casting-app/android/App/build.gradle index 79c656c2ab4cc1..39f7c41af45435 100644 --- a/examples/tv-casting-app/android/App/build.gradle +++ b/examples/tv-casting-app/android/App/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.2' + classpath 'com.android.tools.build:gradle:7.1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/examples/tv-casting-app/android/App/gradle.properties b/examples/tv-casting-app/android/App/gradle.properties index 9bf7e81826e3d7..a4b1a339862234 100644 --- a/examples/tv-casting-app/android/App/gradle.properties +++ b/examples/tv-casting-app/android/App/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects diff --git a/examples/tv-casting-app/tv-casting-common/tv-casting-app.zap b/examples/tv-casting-app/tv-casting-common/tv-casting-app.zap index 6f4ab131fa0672..103d4d3054919c 100644 --- a/examples/tv-casting-app/tv-casting-common/tv-casting-app.zap +++ b/examples/tv-casting-app/tv-casting-common/tv-casting-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -2715,14 +2717,16 @@ "code": 41, "profileId": 259, "label": "MA-casting-videoclient", - "name": "MA-casting-videoclient" + "name": "MA-casting-videoclient", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 41, "profileId": 259, "label": "MA-casting-videoclient", - "name": "MA-casting-videoclient" + "name": "MA-casting-videoclient", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -3982,22 +3986,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap b/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap index 16a11f8316f4e7..c2a90d68afdee7 100644 --- a/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap +++ b/examples/virtual-device-app/virtual-device-common/virtual-device-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4074,14 +4076,16 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4820,22 +4824,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5065,22 +5053,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6199,22 +6171,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6523,22 +6479,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, diff --git a/examples/water-leak-detector-app/water-leak-detector-common/water-leak-detector-app.zap b/examples/water-leak-detector-app/water-leak-detector-common/water-leak-detector-app.zap index 1dc7adb63ade21..d311a96ec82301 100644 --- a/examples/water-leak-detector-app/water-leak-detector-common/water-leak-detector-app.zap +++ b/examples/water-leak-detector-app/water-leak-detector-common/water-leak-detector-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -794,22 +796,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2074,20 +2060,23 @@ "code": 67, "profileId": 259, "label": "MA-water-leak-detector", - "name": "MA-water-leak-detector" + "name": "MA-water-leak-detector", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 67, "profileId": 259, "label": "MA-water-leak-detector", - "name": "MA-water-leak-detector" + "name": "MA-water-leak-detector", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -2192,22 +2181,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2396,22 +2369,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2566,22 +2523,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2896,22 +2837,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3018,22 +2943,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3124,22 +3033,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -3211,4 +3104,4 @@ "parentEndpointIdentifier": 0 } ] -} +} \ No newline at end of file diff --git a/examples/window-app/common/window-app.zap b/examples/window-app/common/window-app.zap index 64f9a634e4871a..a23d00e86f292c 100644 --- a/examples/window-app/common/window-app.zap +++ b/examples/window-app/common/window-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,20 +41,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -173,22 +176,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -359,22 +346,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -817,22 +788,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1135,22 +1090,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1401,22 +1340,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1637,22 +1560,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1945,22 +1852,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2221,22 +2112,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4047,22 +3922,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4347,22 +4206,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4567,22 +4410,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4837,22 +4664,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -4876,10 +4687,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4912,14 +4723,16 @@ "code": 514, "profileId": 259, "label": "MA-windowcovering", - "name": "MA-windowcovering" + "name": "MA-windowcovering", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 514, "profileId": 259, "label": "MA-windowcovering", - "name": "MA-windowcovering" + "name": "MA-windowcovering", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -5923,14 +5736,16 @@ "code": 514, "profileId": 259, "label": "MA-windowcovering", - "name": "MA-windowcovering" + "name": "MA-windowcovering", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 514, "profileId": 259, "label": "MA-windowcovering", - "name": "MA-windowcovering" + "name": "MA-windowcovering", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/examples/window-app/telink/README.md b/examples/window-app/telink/README.md index b40a12bf754eac..6978ce49df8f5b 100644 --- a/examples/window-app/telink/README.md +++ b/examples/window-app/telink/README.md @@ -15,7 +15,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/integrations/cloudbuild/chef.yaml b/integrations/cloudbuild/chef.yaml index 986ee6939be6d5..45c4df62387847 100644 --- a/integrations/cloudbuild/chef.yaml +++ b/integrations/cloudbuild/chef.yaml @@ -1,5 +1,5 @@ steps: - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" entrypoint: "bash" args: - "-c" @@ -7,7 +7,7 @@ steps: git config --global --add safe.directory "*" python scripts/checkout_submodules.py --shallow --recursive --platform esp32 nrfconnect silabs linux android id: Submodules - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" # NOTE: silabs boostrap is NOT done with the rest as it requests a conflicting # jinja2 version (asks for 3.1.3 when constraints.txt asks for 3.0.3) env: @@ -23,7 +23,7 @@ steps: - name: pwenv path: /pwenv timeout: 900s - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" env: - PW_ENVIRONMENT_ROOT=/pwenv args: @@ -38,7 +38,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" env: - PW_ENVIRONMENT_ROOT=/pwenv args: diff --git a/integrations/cloudbuild/smoke-test.yaml b/integrations/cloudbuild/smoke-test.yaml index c3873a9ddb2a90..715019984f2b50 100644 --- a/integrations/cloudbuild/smoke-test.yaml +++ b/integrations/cloudbuild/smoke-test.yaml @@ -1,5 +1,5 @@ steps: - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" entrypoint: "bash" args: - "-c" @@ -7,7 +7,7 @@ steps: git config --global --add safe.directory "*" python scripts/checkout_submodules.py --shallow --recursive --platform esp32 nrfconnect silabs linux android id: Submodules - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" # NOTE: silabs boostrap is NOT done with the rest as it requests a conflicting # jinja2 version (asks for 3.1.3 when constraints.txt asks for 3.0.3) env: @@ -24,7 +24,7 @@ steps: path: /pwenv timeout: 900s - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: ESP32 env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -44,7 +44,7 @@ steps: volumes: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: NRFConnect env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -65,7 +65,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: EFR32 env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -87,7 +87,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: Linux env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -140,7 +140,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:108" id: Android env: - PW_ENVIRONMENT_ROOT=/pwenv diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version index 1939f7e2b4d3b0..b0158daf675e10 100644 --- a/integrations/docker/images/base/chip-build/version +++ b/integrations/docker/images/base/chip-build/version @@ -1 +1 @@ -104 : [Telink] Update Docker image (Zephyr update) +109 : [Tizen] Fix race when storing cert credentials diff --git a/integrations/docker/images/stage-2/chip-build-java/Dockerfile b/integrations/docker/images/stage-2/chip-build-java/Dockerfile index bda9cb3e9f3c0a..a8f328153c2dff 100644 --- a/integrations/docker/images/stage-2/chip-build-java/Dockerfile +++ b/integrations/docker/images/stage-2/chip-build-java/Dockerfile @@ -6,18 +6,18 @@ LABEL org.opencontainers.image.source https://github.com/project-chip/connectedh RUN set -x \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -fy \ - openjdk-11-jdk \ + openjdk-17-jdk \ && rm -rf /var/lib/apt/lists/ \ && : # last line # Download and install kotlin compiler RUN set -x \ && cd /usr/lib \ - && wget -q https://github.com/JetBrains/kotlin/releases/download/v1.8.10/kotlin-compiler-1.8.10.zip \ + && wget -q https://github.com/JetBrains/kotlin/releases/download/v2.1.10/kotlin-compiler-2.1.10.zip \ && unzip kotlin-compiler-*.zip \ && rm kotlin-compiler-*.zip \ && rm -f kotlinc/bin/*.bat \ && : # last line ENV PATH $PATH:/usr/lib/kotlinc/bin -ENV JAVA_PATH=/usr/lib/jvm/java-11-openjdk-amd64 +ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 diff --git a/integrations/docker/images/stage-2/chip-build-tizen/Dockerfile b/integrations/docker/images/stage-2/chip-build-tizen/Dockerfile index c127296bac04f3..e08e821c5c24d9 100644 --- a/integrations/docker/images/stage-2/chip-build-tizen/Dockerfile +++ b/integrations/docker/images/stage-2/chip-build-tizen/Dockerfile @@ -7,9 +7,9 @@ LABEL org.opencontainers.image.source https://github.com/project-chip/connectedh RUN set -x \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends \ + 7zip \ cpio \ libncurses6 \ - obs-build \ openjdk-8-jre-headless \ wget \ zip \ diff --git a/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/install.sh b/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/install.sh index 59843f99ba9573..bdb0b1914951a7 100755 --- a/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/install.sh +++ b/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/install.sh @@ -26,7 +26,7 @@ SECRET_TOOL=false SCRIPT_NAME=$(basename -- "$(readlink -f "${BASH_SOURCE:?}")") SCRIPT_DIR=$(dirname -- "$(readlink -f "${BASH_SOURCE:?}")") -DEPENDENCIES=('cpio' 'openjdk-8-jre-headless' 'obs-build' 'wget' 'zip') +DEPENDENCIES=('7zip' 'cpio' 'openjdk-8-jre-headless' 'wget' 'zip') # If color is available use colors if which tput >/dev/null 2>&1 && [[ $(tput -T $TERM colors) -ge 8 ]]; then @@ -45,16 +45,18 @@ function show_help() { echo echo "Options:" echo " -h, --help Display this information" - echo " --tizen-sdk-path Set directory where Tizen will be installed. Default is $TIZEN_SDK_ROOT" - echo " --tizen-sdk-data-path Set directory where Tizen have data. Default is $TIZEN_SDK_DATA_PATH" - echo " --install-dependencies This options install all dependencies." + echo " --tizen-sdk-path Set directory for Tizen SDK installation. Default is $TIZEN_SDK_ROOT" + echo " --tizen-sdk-data-path Set directory for Tizen SDK runtime data. Default is $TIZEN_SDK_DATA_PATH" + echo " --install-dependencies This option installs all required dependencies" echo " --tizen-version Select Tizen version. Default is $TIZEN_VERSION" - echo " --override-secret-tool Circumvent the requirement of having functional D-Bus Secrets service." + echo " --override-secret-tool Circumvent the requirement of having functional D-Bus Secrets service" echo echo "Note:" - echo "The script should run fully with ubuntu. For other distributions you may have to manually" - echo "install all needed dependencies. Use the script specifying --tizen-sdk-path with or" - echo "without --tizen-version. The script will only install Tizen platform for Matter." + echo "This script does not install full Tizen SDK. It installs only the necessary" + echo "parts for Matter SDK to be able to build Tizen applications." + echo "The option '--install-dependencies' should be able to install all required" + echo "dependencies on any Debian-based distribution. For other distributions the" + echo "dependencies should be installed manually." } # ------------------------------------------------------------------------------ @@ -78,12 +80,12 @@ function warning() { # ------------------------------------------------------------------------------ # Show dependencies function show_dependencies() { - warning "Need dependencies for use this script installation SDK: cpio unrpm unzip wget" - warning "Need dependencies for Tizen SDK: JAVA JRE >=8.0" + warning "Required dependencies for Tizen SDK installation: 7z cpio unzip wget" + warning "Required dependencies for Tizen SDK: JAVA JRE >=8.0" } # ------------------------------------------------------------------------------ -# Function helper massive download +# Helper function for downloading packages. # Usage: download "url_dir_package" ${package_array[@]} function download() { echo "$COLOR_BLUE" @@ -92,6 +94,10 @@ function download() { for PKG in "${@:2}"; do PKGS+=("-A" "$PKG") done + + # Skip downloading if no packages are specified + [[ ${#PKGS[@]} -eq 0 ]] && return + wget -r -nd --no-parent -e robots=off --progress=dot:mega "${PKGS[@]}" "$1" # Check if the files have been downloaded @@ -106,7 +112,7 @@ function download() { } # ------------------------------------------------------------------------------ -# Function install all dependencies. +# Function for installing all dependencies. function install_dependencies() { if ! command -v apt-get &>/dev/null; then show_dependencies @@ -120,13 +126,22 @@ function install_dependencies() { } # ------------------------------------------------------------------------------ -# Function clean on EXIT +# Function for unpacking RPM packages. +function unrpm() { + for PKG in "${@}"; do + echo "Extracting $PKG..." + 7z x -so "$PKG" | cpio -idmv + done +} + +# ------------------------------------------------------------------------------ +# Function for cleaning up temporary files on exit. function cleanup() { rm -rf "${TMP_DIR:?}" } # ------------------------------------------------------------------------------ -# Function install tizen sdk. +# Function for installing Tizen SDK. function install_tizen_sdk() { mkdir -p "$TIZEN_SDK_ROOT" || return @@ -194,9 +209,17 @@ function install_tizen_sdk() { 'app-core-common-*.rpm' 'aul-0*.armv7l.rpm' 'aul-devel-*.armv7l.rpm' + 'bluetooth-frwk-0*.armv7l.rpm' 'bundle-0*.armv7l.rpm' 'bundle-devel-*.armv7l.rpm' 'buxton2-*.armv7l.rpm' + 'capi-network-bluetooth-0*.armv7l.rpm' + 'capi-network-bluetooth-devel-*.armv7l.rpm' + 'capi-network-nsd-*.armv7l.rpm' + 'capi-network-thread-*.armv7l.rpm' + 'capi-system-peripheral-io-*.armv7l.rpm' + 'capi-system-peripheral-io-devel-*.armv7l.rpm' + 'capi-system-resource-1*.armv7l.rpm' 'cynara-devel-*.armv7l.rpm' 'dbus-1*.armv7l.rpm' 'dbus-devel-*.armv7l.rpm' @@ -209,12 +232,14 @@ function install_tizen_sdk() { 'libcynara-commons-*.armv7l.rpm' 'libdns_sd-*.armv7l.rpm' 'libjson-glib-*.armv7l.rpm' + 'libnsd-dns-sd-*.armv7l.rpm' 'libsessiond-0*.armv7l.rpm' 'libsystemd-*.armv7l.rpm' 'libtzplatform-config-*.armv7l.rpm' 'parcel-0*.armv7l.rpm' 'parcel-devel-*.armv7l.rpm' 'pkgmgr-info-*.armv7l.rpm' + 'sensord-*.armv7l.rpm' 'sensord-devel-*.armv7l.rpm' 'sensord-dummy-*.armv7l.rpm' 'vconf-compat-*.armv7l.rpm' @@ -223,22 +248,13 @@ function install_tizen_sdk() { # Unified packages (snapshots) URL="http://download.tizen.org/snapshots/TIZEN/Tizen/Tizen-Unified/latest/repos/standard/packages/armv7l/" - PKG_ARR=( - 'bluetooth-frwk-0*.armv7l.rpm' - 'capi-network-bluetooth-0*.armv7l.rpm' - 'capi-network-bluetooth-devel-*.armv7l.rpm' - 'capi-network-nsd-*.armv7l.rpm' - 'capi-network-thread-*.armv7l.rpm' - 'capi-system-peripheral-io-*.armv7l.rpm' - 'capi-system-peripheral-io-devel-*.armv7l.rpm' - 'capi-system-resource-1*.armv7l.rpm' - 'libnsd-dns-sd-*.armv7l.rpm' - 'sensord-*.armv7l.rpm') + PKG_ARR=() download "$URL" "${PKG_ARR[@]}" # Tizen Developer Platform Certificate URL="http://download.tizen.org/sdk/extensions/Tizen_IoT_Headless/binary/" - # Tizen site do not has this package available in version 8.0. Certificates are the same for 7.0 and 8.0. + # Tizen site does not have this package available in version 8.0. + # Certificates are the same for 7.0 and 8.0, though. PKG_ARR=( "7.0-iot-things-add-ons_*_ubuntu-64.zip") download "$URL" "${PKG_ARR[@]}" @@ -255,8 +271,7 @@ function install_tizen_sdk() { # Install secret tool or not if ("$SECRET_TOOL"); then info "Overriding secret tool..." - cp "$SCRIPT_DIR/secret-tool.py" "$TIZEN_SDK_ROOT/tools/certificate-encryptor/secret-tool" - chmod 0755 "$TIZEN_SDK_ROOT/tools/certificate-encryptor/secret-tool" + install "$SCRIPT_DIR/secret-tool.py" "$TIZEN_SDK_ROOT/tools/certificate-encryptor/secret-tool" fi # Configure Tizen CLI @@ -331,7 +346,7 @@ info "Created tmp directory $TMP_DIR" # Checks if the user need install dependencies if [ "$INSTALL_DEPENDENCIES" = true ]; then if ! install_dependencies; then - error "Cannot install dependencies, please use this script as sudo user or root. Use --help" + error "Cannot install dependencies, please use this script as sudo user or root." show_dependencies exit 1 fi @@ -339,8 +354,8 @@ fi # ------------------------------------------------------------------------------ # Checking dependencies needed to install Tizen platform -info "Checking required tools: cpio, java, unrpm, unzip, wget" -for PKG in 'cpio' 'java' 'unrpm' 'unzip' 'wget'; do +info "Checking required tools: 7z, cpio, java, unzip, wget" +for PKG in '7z' 'cpio' 'java' 'unzip' 'wget'; do if ! command -v "$PKG" &>/dev/null; then error "Required tool not found: $PKG" dep_lost=1 diff --git a/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/secret-tool.py b/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/secret-tool.py index c6807ab9a6c968..e94ae54c778bb4 100755 --- a/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/secret-tool.py +++ b/integrations/docker/images/stage-2/chip-build-tizen/tizen-sdk-installer/secret-tool.py @@ -61,6 +61,7 @@ def _save(self): self.fp.seek(0) self.fp.truncate() pickle.dump(self.secrets, self.fp) + self.fp.flush() except IOError as e: print("ERROR: " + str(e), file=sys.stderr) @@ -92,14 +93,14 @@ def lookup(self, label: str, **kw): subparsers = parser.add_subparsers(dest='command', required=True) parser_clear = subparsers.add_parser( - "clear", help="Remove passward associated with given key value pairs") + "clear", help="Remove password associated with given key value pairs") parser_clear.add_argument("-l", "--label", action='store', required=True, help="label for given key value pairs") parser_clear.add_argument("kw", nargs='*', help="key value pairs") parser_store = subparsers.add_parser( - "store", help="Store passward for given key value pairs") + "store", help="Store password for given key value pairs") parser_store.add_argument("-l", "--label", action='store', required=True, help="label for given key value pairs") parser_store.add_argument("-p", "--password", action='store', required=True, @@ -108,7 +109,7 @@ def lookup(self, label: str, **kw): help="key value pairs") parser_lookup = subparsers.add_parser( - "lookup", help="Retrieve passward associated with given key value pairs") + "lookup", help="Retrieve password associated with given key value pairs") parser_lookup.add_argument("-l", "--label", action='store', required=True, help="label for given key value pairs") parser_lookup.add_argument("kw", nargs='*', diff --git a/integrations/docker/images/stage-3/chip-build-android/Dockerfile b/integrations/docker/images/stage-3/chip-build-android/Dockerfile index 219e6172902cc1..3f3d8d40f1c396 100644 --- a/integrations/docker/images/stage-3/chip-build-android/Dockerfile +++ b/integrations/docker/images/stage-3/chip-build-android/Dockerfile @@ -27,12 +27,17 @@ RUN set -x \ && : # last line # Download and install android command line tool (for installing `sdkmanager`) +# We need create latest folder inide cmdline-tools, since latest android commandline tool looks for this latest folder +# when running sdkmanager --licenses RUN set -x \ - && wget -O /tmp/android-tools.zip https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip \ + && wget -O /tmp/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \ && cd /opt/android/sdk \ - && unzip /tmp/android-tools.zip \ - && rm -f /tmp/android-tools.zip \ - && test -d /opt/android/sdk/tools \ + && mkdir -p temp \ + && unzip /tmp/cmdline-tools.zip -d temp \ + && mkdir -p cmdline-tools/latest \ + && cp -rf temp/cmdline-tools/* cmdline-tools/latest \ + && rm -rf temp \ + && test -d /opt/android/sdk/cmdline-tools \ && : # last line # Download and install android NDK diff --git a/integrations/docker/images/stage-3/chip-build-tizen-qemu/Dockerfile b/integrations/docker/images/stage-3/chip-build-tizen-qemu/Dockerfile index 2d0bb55e3afeef..d6df393614441f 100644 --- a/integrations/docker/images/stage-3/chip-build-tizen-qemu/Dockerfile +++ b/integrations/docker/images/stage-3/chip-build-tizen-qemu/Dockerfile @@ -39,7 +39,7 @@ RUN set -x \ && wget --progress=dot:giga -r -nd --no-parent -e robots=off -A 'rpi4-linux-kernel-*.src.rpm' \ http://download.tizen.org/snapshots/TIZEN/Tizen-$TIZEN_VERSION/Tizen-$TIZEN_VERSION-Unified/latest/repos/standard/source/ \ # Prepare kernel source (Linux kernel + Tizen patchset) - && unrpm rpi4-linux-kernel-*.src.rpm \ + && 7z x -so rpi4-linux-kernel-*.src.rpm | cpio -idmv \ && rm rpi4-linux-kernel-*.src.rpm \ && tar -xJf linux-kernel-*.tar.xz \ && rm linux-kernel-*.tar.xz \ diff --git a/integrations/docker/images/vscode/chip-build-vscode/Dockerfile b/integrations/docker/images/vscode/chip-build-vscode/Dockerfile index ba46b7c10f06a3..62ee7f5bd899ab 100644 --- a/integrations/docker/images/vscode/chip-build-vscode/Dockerfile +++ b/integrations/docker/images/vscode/chip-build-vscode/Dockerfile @@ -91,7 +91,7 @@ RUN set -x \ # - telnet # - srecord # For java builds: -# - openjdk-8-jdk +# - openjdk-17-jdk RUN set -x \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends \ @@ -119,7 +119,7 @@ ENV WIFI_SDK_ROOT=/opt/silabs/wifi_sdk ENV IDF_PATH=/opt/espressif/esp-idf/ ENV IDF_TOOLS_PATH=/opt/espressif/tools ENV IMX_SDK_ROOT=/opt/fsl-imx-xwayland/6.1-langdale -ENV JAVA_PATH=/usr/lib/jvm/java-8-openjdk-amd64 +ENV JAVA_PATH=/usr/lib/jvm/java-17-openjdk-amd64 ENV NRF5_TOOLS_ROOT=/opt/NordicSemiconductor/nRF5_tools ENV OPENOCD_PATH=/opt/openocd/ ENV QEMU_ESP32=/opt/espressif/qemu/qemu-system-xtensa diff --git a/kotlin-detect-config.yaml b/kotlin-detect-config.yaml index 622f7a73c14eff..d0bc6b9ed0640f 100644 --- a/kotlin-detect-config.yaml +++ b/kotlin-detect-config.yaml @@ -164,6 +164,7 @@ style: - "**/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/MultiAdminClientFragment.kt" - "**/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/clusterclient/clusterinteraction/ClusterInteractionFragment.kt" - "**/examples/android/CHIPTool/app/src/main/java/com/google/chip/chiptool/provisioning/AddressCommissioningFragment.kt" + - "**/examples/java-matter-controller/java/src/com/matter/controller/commands/pairing/PairOnNetworkLongImReadCommand.kt" - "**/src/controller/java/src/matter/onboardingpayload/QRCodeOnboardingPayloadParser.kt" ExplicitItLambdaParameter: excludes: diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py index ef34fb6e4807e5..3611e7372cb3c9 100755 --- a/scripts/build/build/targets.py +++ b/scripts/build/build/targets.py @@ -778,10 +778,9 @@ def BuildTelinkTarget(): TargetPart('tlsr9518adk80d', board=TelinkBoard.TLSR9518ADK80D), TargetPart('tlsr9528a', board=TelinkBoard.TLSR9528A), TargetPart('tlsr9528a_retention', board=TelinkBoard.TLSR9528A_RETENTION), - TargetPart('tlsr9258a', board=TelinkBoard.TLSR9258A), - TargetPart('tlsr9258a_retention', board=TelinkBoard.TLSR9258A_RETENTION), TargetPart('tl3218x', board=TelinkBoard.TL3218X), TargetPart('tl7218x', board=TelinkBoard.TL7218X), + TargetPart('tl7218x_retention', board=TelinkBoard.TL7218X_RETENTION), ]) target.AppendFixedTargets([ diff --git a/scripts/build/builders/telink.py b/scripts/build/builders/telink.py index d53a860ebcf944..b2966742179aac 100644 --- a/scripts/build/builders/telink.py +++ b/scripts/build/builders/telink.py @@ -119,10 +119,9 @@ class TelinkBoard(Enum): TLSR9518ADK80D = auto() TLSR9528A = auto() TLSR9528A_RETENTION = auto() - TLSR9258A = auto() - TLSR9258A_RETENTION = auto() TL3218X = auto() TL7218X = auto() + TL7218X_RETENTION = auto() def GnArgName(self): if self == TelinkBoard.TLRS9118BDK40D: @@ -133,14 +132,12 @@ def GnArgName(self): return 'tlsr9528a' elif self == TelinkBoard.TLSR9528A_RETENTION: return 'tlsr9528a_retention' - elif self == TelinkBoard.TLSR9258A: - return 'tlsr9258a' - elif self == TelinkBoard.TLSR9258A_RETENTION: - return 'tlsr9258a_retention' elif self == TelinkBoard.TL3218X: return 'tl3218x' elif self == TelinkBoard.TL7218X: return 'tl7218x' + elif self == TelinkBoard.TL7218X_RETENTION: + return 'tl7218x_retention' else: raise Exception('Unknown board type: %r' % self) diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt index 96a6f218d77561..590844271d3ba6 100644 --- a/scripts/build/testdata/all_targets_linux_x64.txt +++ b/scripts/build/testdata/all_targets_linux_x64.txt @@ -22,5 +22,5 @@ nuttx-x64-light qpg-qpg6105-{lock,light,shell,persistent-storage,light-switch,thermostat}[-updateimage] stm32-stm32wb5mm-dk-light tizen-arm-{all-clusters,chip-tool,light,tests}[-no-ble][-no-thread][-no-wifi][-asan][-ubsan][-coverage][-with-ui] -telink-{tlsr9118bdk40d,tlsr9518adk80d,tlsr9528a,tlsr9528a_retention,tlsr9258a,tlsr9258a_retention,tl3218x,tl7218x}-{air-quality-sensor,all-clusters,all-clusters-minimal,bridge,contact-sensor,light,light-switch,lock,ota-requestor,pump,pump-controller,shell,smoke-co-alarm,temperature-measurement,thermostat,window-covering}[-ota][-dfu][-shell][-rpc][-factory-data][-4mb][-mars][-usb][-compress-lzma][-thread-analyzer] +telink-{tlsr9118bdk40d,tlsr9518adk80d,tlsr9528a,tlsr9528a_retention,tl3218x,tl7218x,tl7218x_retention}-{air-quality-sensor,all-clusters,all-clusters-minimal,bridge,contact-sensor,light,light-switch,lock,ota-requestor,pump,pump-controller,shell,smoke-co-alarm,temperature-measurement,thermostat,window-covering}[-ota][-dfu][-shell][-rpc][-factory-data][-4mb][-mars][-usb][-compress-lzma][-thread-analyzer] openiotsdk-{shell,lock}[-mbedtls][-psa] diff --git a/scripts/build_coverage.sh b/scripts/build_coverage.sh index ef6e7b97051624..c9d942e8454e4e 100755 --- a/scripts/build_coverage.sh +++ b/scripts/build_coverage.sh @@ -46,37 +46,45 @@ CHIP_ROOT=$(_normpath "$(dirname "$0")/..") OUTPUT_ROOT="$CHIP_ROOT/out/coverage" COVERAGE_ROOT="$OUTPUT_ROOT/coverage" SUPPORTED_CODE=(core clusters all) -SUPPORTED_TESTS=(unit yaml all) CODE="core" -TESTS="unit" + skip_gn=false TEST_TARGET=check -help() { +# By default, do not run YAML or Python tests +ENABLE_YAML=false +ENABLE_PYTHON=false - echo "Usage: $file_name [--output_root=] [--code=] [--tests=]" +help() { + echo "Usage: $file_name [--output_root=] [--code=] [Test options" + echo + echo "Misc:" + echo " -h, --help Print this help, then exit." + echo + echo "Build/Output options:" + echo " -o, --output_root=DIR Set the build output directory." + echo " When set manually, script only runs lcov on the provided build output." + echo " This directory must be built with 'use_coverage=true' and 'ninja check' must have run." + echo + echo " -c, --code=TYPE Specify which scope to collect coverage data. One of:" + echo " core - (default) coverage from core stack in Matter SDK." + echo " clusters - coverage from cluster implementations in Matter SDK." + echo " all - coverage from entire Matter SDK." echo - echo "Misc: - -h, --help Print this help, then exit." + echo "Test options:" + echo " --yaml In addition to unit tests, run YAML-based tests." + echo " --python In addition to unit tests, run Python-based tests." + echo " Both can be combined if needed." + echo + echo " --target=TARGET Specific test target to run for unit tests (e.g. 'TestEmberAttributeBuffer.run')." echo - echo "Options: - -o, --output_root Set the build output directory. When set manually, performs only lcov stage - on provided build output. Assumes output_root has been built with 'use_coverage=true' - and that 'ninja check' was run. - -c, --code Specify which scope to collect coverage data. - 'core': collect coverage data from core stack in Matter SDK. --default - 'clusters': collect coverage data from clusters implementation in Matter SDK. - 'all': collect coverage data from Matter SDK. - -t, --tests Specify which tools to run the coverage check. - 'unit': Run unit test to drive the coverage check. --default - 'yaml': Run yaml test to drive the coverage check. - 'all': Run unit & yaml test to drive the coverage check. - --target Specific test target to run (e.g. TestEmberAttributeBuffer.run) - " } file_name=${0##*/} +# ------------------------------------------------------------------------------ +# Parse arguments +# ------------------------------------------------------------------------------ for i in "$@"; do case $i in -h | --help) @@ -87,12 +95,9 @@ for i in "$@"; do CODE="${i#*=}" shift ;; - -t=* | --tests=*) - TESTS="${i#*=}" - shift - ;; --target=*) TEST_TARGET="${i#*=}" + shift ;; -o=* | --output_root=*) OUTPUT_ROOT="${i#*=}" @@ -100,6 +105,14 @@ for i in "$@"; do skip_gn=true shift ;; + --yaml) + ENABLE_YAML=true + shift + ;; + --python) + ENABLE_PYTHON=true + shift + ;; *) echo "Unknown Option \"$1\"" echo @@ -109,49 +122,63 @@ for i in "$@"; do esac done +# Validate code argument if [[ ! " ${SUPPORTED_CODE[@]} " =~ " ${CODE} " ]]; then echo "ERROR: Code $CODE not supported" exit 1 fi -if [[ ! " ${SUPPORTED_TESTS[@]} " =~ " ${TESTS} " ]]; then - echo "ERROR: Tests $TESTS not supported" - exit 1 -fi - +# ------------------------------------------------------------------------------ +# Build & Test +# ------------------------------------------------------------------------------ if [ "$skip_gn" == false ]; then - # Ensure we have a compilation environment + # Ensure environment is set source "$CHIP_ROOT/scripts/activate.sh" - # Generates ninja files + # Generate ninja files EXTRA_GN_ARGS="" - if [[ "$TESTS" == "yaml" || "$TESTS" == "all" ]]; then + + # We only need 'chip_build_all_clusters_app' if we run YAML tests + if [ "$ENABLE_YAML" == true ]; then EXTRA_GN_ARGS="$EXTRA_GN_ARGS chip_build_all_clusters_app=true" else + # Otherwise skip building tools EXTRA_GN_ARGS="$EXTRA_GN_ARGS chip_build_tools=false" fi - gn --root="$CHIP_ROOT" gen "$OUTPUT_ROOT" --args="use_coverage=true$EXTRA_GN_ARGS" - # Run unit tests - if [[ "$TESTS" == "unit" || "$TESTS" == "all" ]]; then - ninja -C "$OUTPUT_ROOT" "$TEST_TARGET" - fi + gn --root="$CHIP_ROOT" gen "$OUTPUT_ROOT" --args="use_coverage=true $EXTRA_GN_ARGS" + + # + # 1) Always run unit tests + # + ninja -C "$OUTPUT_ROOT" "$TEST_TARGET" - # Run yaml tests - if [[ "$TESTS" == "yaml" || "$TESTS" == "all" ]]; then + # + # 2) Run YAML tests if requested + # + if [ "$ENABLE_YAML" == true ]; then ninja -C "$OUTPUT_ROOT" scripts/run_in_build_env.sh \ "./scripts/tests/run_test_suite.py \ - --chip-tool ""$OUTPUT_ROOT/chip-tool \ + --chip-tool \"$OUTPUT_ROOT/chip-tool\" \ run \ --iterations 1 \ --test-timeout-seconds 120 \ - --all-clusters-app ""$OUTPUT_ROOT/chip-all-clusters-app - " + --all-clusters-app \"$OUTPUT_ROOT/chip-all-clusters-app\"" + fi + + # + # 3) Run Python tests if requested + # + if [ "$ENABLE_PYTHON" == true ]; then + echo "Running Python tests ..." + # TODO: run python tests. fi - # Remove misc support components from coverage statistics + # ---------------------------------------------------------------------------- + # Remove objects we do NOT want included in coverage + # ---------------------------------------------------------------------------- rm -rf "$OUTPUT_ROOT/obj/src/app/app-platform" rm -rf "$OUTPUT_ROOT/obj/src/app/common" rm -rf "$OUTPUT_ROOT/obj/src/app/util/mock" @@ -162,24 +189,45 @@ if [ "$skip_gn" == false ]; then rm -rf "$OUTPUT_ROOT/obj/src/platform" rm -rf "$OUTPUT_ROOT/obj/src/tools" - # Remove unit test itself from coverage statistics + # Remove unit test objects from coverage find "$OUTPUT_ROOT/obj/src/" -depth -name 'tests' -exec rm -rf {} \; + # Restrict coverage to 'core' or 'clusters' if specified if [ "$CODE" == "core" ]; then rm -rf "$OUTPUT_ROOT/obj/src/app/clusters" elif [ "$CODE" == "clusters" ]; then mv "$OUTPUT_ROOT/obj/src/app/clusters" "$OUTPUT_ROOT/obj/clusters" rm -rf "$OUTPUT_ROOT/obj/src" - mkdir "$OUTPUT_ROOT/obj/src" + mkdir -p "$OUTPUT_ROOT/obj/src" mv "$OUTPUT_ROOT/obj/clusters" "$OUTPUT_ROOT/obj/src/clusters" fi fi +# ------------------------------------------------------------------------------ +# Coverage Generation +# ------------------------------------------------------------------------------ mkdir -p "$COVERAGE_ROOT" -lcov --initial --capture --directory "$OUTPUT_ROOT/obj/src" --exclude="$PWD"/zzz_generated/* --exclude="$PWD"/third_party/* --exclude=/usr/include/* --output-file "$COVERAGE_ROOT/lcov_base.info" -lcov --capture --directory "$OUTPUT_ROOT/obj/src" --exclude="$PWD"/zzz_generated/* --exclude="$PWD"/third_party/* --exclude=/usr/include/* --output-file "$COVERAGE_ROOT/lcov_test.info" -lcov --add-tracefile "$COVERAGE_ROOT/lcov_base.info" --add-tracefile "$COVERAGE_ROOT/lcov_test.info" --output-file "$COVERAGE_ROOT/lcov_final.info" -genhtml "$COVERAGE_ROOT/lcov_final.info" --output-directory "$COVERAGE_ROOT/html" --title "SHA:$(git rev-parse HEAD)" --header-title "Matter SDK Coverage Report" -# Copy webapp's YAML file to the coverage output directory -cp "$CHIP_ROOT/integrations/appengine/webapp_config.yaml" "$COVERAGE_ROOT/webapp_config.yaml" +lcov --initial --capture --directory "$OUTPUT_ROOT/obj/src" \ + --exclude="$PWD"/zzz_generated/* \ + --exclude="$PWD"/third_party/* \ + --exclude=/usr/include/* \ + --output-file "$COVERAGE_ROOT/lcov_base.info" + +lcov --capture --directory "$OUTPUT_ROOT/obj/src" \ + --exclude="$PWD"/zzz_generated/* \ + --exclude="$PWD"/third_party/* \ + --exclude=/usr/include/* \ + --output-file "$COVERAGE_ROOT/lcov_test.info" + +lcov --add-tracefile "$COVERAGE_ROOT/lcov_base.info" \ + --add-tracefile "$COVERAGE_ROOT/lcov_test.info" \ + --output-file "$COVERAGE_ROOT/lcov_final.info" + +genhtml "$COVERAGE_ROOT/lcov_final.info" \ + --output-directory "$COVERAGE_ROOT/html" \ + --title "SHA:$(git rev-parse HEAD)" \ + --header-title "Matter SDK Coverage Report" + +cp "$CHIP_ROOT/integrations/appengine/webapp_config.yaml" \ + "$COVERAGE_ROOT/webapp_config.yaml" diff --git a/scripts/examples/gn_silabs_example.sh b/scripts/examples/gn_silabs_example.sh index 11f65022709a30..32c542b3efc4d5 100755 --- a/scripts/examples/gn_silabs_example.sh +++ b/scripts/examples/gn_silabs_example.sh @@ -121,7 +121,7 @@ if [ "$#" == "0" ]; then (default: /third_party/silabs/slc_gen//) sl_pre_gen_path Allow users to define a path to pre-generated board files - (default: /third_party/silabs/matter_support/matter///) + (default: third_party/silabs/matter_support/board-support///) sl_matter_version Use provided software version at build time sl_matter_version_str @@ -379,7 +379,7 @@ else fi # search bootloader directory for the respective bootloaders for the input board - bootloaderFiles=("$(find "$MATTER_ROOT/third_party/silabs/matter_support/matter/efr32/bootloader_binaries/" -maxdepth 1 -name "*$SILABS_BOARD*" | tr '\n' ' ')") + bootloaderFiles=("$(find "$MATTER_ROOT/third_party/silabs/matter_support/board-support/efr32/bootloader_binaries/" -maxdepth 1 -name "*$SILABS_BOARD*" | tr '\n' ' ')") if [ "${#bootloaderFiles[@]}" -gt 1 ]; then for i in "${!bootloaderFiles[@]}"; do diff --git a/scripts/jupyterlab_requirements.txt b/scripts/jupyterlab_requirements.txt index 2a2c2c30b9b0fa..a05aca00091f5d 100644 --- a/scripts/jupyterlab_requirements.txt +++ b/scripts/jupyterlab_requirements.txt @@ -4,10 +4,10 @@ # jupyter-lab # # -------------------------------------- -# import chip.native -# import pkgutil -# module = pkgutil.get_loader('chip.ChipReplStartup') -# %run {module.path} +# %reset -f +# import importlib.util +# spec = importlib.util.find_spec('chip.ChipReplStartup') +# %run {spec.origin} # -------------------------------------- # @@ -15,3 +15,4 @@ jupyterlab ipykernel jupyterlab-lsp python-lsp-server +jupyterlab-git diff --git a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja index 954bd7de57dcbf..dd2627221c08fa 100644 --- a/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja +++ b/scripts/py_matter_idl/matter_idl/generators/java/ChipClusters_java.jinja @@ -105,6 +105,7 @@ import chip.devicecontroller.model.NodeState; import chip.devicecontroller.model.Status; import javax.annotation.Nullable; +import java.lang.ref.Cleaner; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -169,10 +170,23 @@ public class ChipClusters { private Optional timeoutMillis = Optional.empty(); + private final Cleaner.Cleanable cleanable; + public BaseChipCluster(long devicePtr, int endpointId, long clusterId) { this.devicePtr = devicePtr; this.endpointId = endpointId; this.clusterId = clusterId; + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (chipClusterPtr != 0) { + deleteCluster(chipClusterPtr); + chipClusterPtr = 0; + } + }); } /** @@ -241,15 +255,6 @@ public class ChipClusters { @Deprecated public void deleteCluster(long chipClusterPtr) {} - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (chipClusterPtr != 0) { - deleteCluster(chipClusterPtr); - chipClusterPtr = 0; - } - } } abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback, ResubscriptionAttemptCallback { diff --git a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java index 037870ee206c5a..997631bb47d546 100644 --- a/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java +++ b/scripts/py_matter_idl/matter_idl/tests/outputs/several_clusters/java/ChipClusters.java @@ -28,6 +28,7 @@ import chip.devicecontroller.model.Status; import javax.annotation.Nullable; +import java.lang.ref.Cleaner; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -92,10 +93,23 @@ public static abstract class BaseChipCluster { private Optional timeoutMillis = Optional.empty(); + private final Cleaner.Cleanable cleanable; + public BaseChipCluster(long devicePtr, int endpointId, long clusterId) { this.devicePtr = devicePtr; this.endpointId = endpointId; this.clusterId = clusterId; + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (chipClusterPtr != 0) { + deleteCluster(chipClusterPtr); + chipClusterPtr = 0; + } + }); } /** @@ -164,15 +178,6 @@ protected void invoke( @Deprecated public void deleteCluster(long chipClusterPtr) {} - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (chipClusterPtr != 0) { - deleteCluster(chipClusterPtr); - chipClusterPtr = 0; - } - } } abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback, ResubscriptionAttemptCallback { diff --git a/scripts/spec_xml/spec_revision_diff_summary.py b/scripts/spec_xml/spec_revision_diff_summary.py index bf735e8d09908f..69d19eb3260300 100644 --- a/scripts/spec_xml/spec_revision_diff_summary.py +++ b/scripts/spec_xml/spec_revision_diff_summary.py @@ -59,8 +59,8 @@ def str_element_changes(element, old, new): def diff_clusters(prior_revision: PrebuiltDataModelDirectory, new_revision: PrebuiltDataModelDirectory) -> None: - prior_clusters, _ = build_xml_clusters(PrebuiltDataModelDirectory.k1_3) - new_clusters, _ = build_xml_clusters(PrebuiltDataModelDirectory.k1_4) + prior_clusters, _ = build_xml_clusters(prior_revision) + new_clusters, _ = build_xml_clusters(new_revision) additional_clusters, removed_clusters, same_cluster_ids = get_changes(prior_clusters, new_clusters) @@ -168,7 +168,9 @@ def get_all_provisional_device_types(new_revision: PrebuiltDataModelDirectory): REVISIONS = {'1.3': PrebuiltDataModelDirectory.k1_3, - '1.4': PrebuiltDataModelDirectory.k1_4, 'master': PrebuiltDataModelDirectory.kMaster} + '1.4': PrebuiltDataModelDirectory.k1_4, + '1.4.1': PrebuiltDataModelDirectory.k1_4_1, + 'master': PrebuiltDataModelDirectory.kMaster} @click.command() diff --git a/scripts/tests/chiptest/__init__.py b/scripts/tests/chiptest/__init__.py index 5cb891a0144b3e..6d15c68349f5c3 100644 --- a/scripts/tests/chiptest/__init__.py +++ b/scripts/tests/chiptest/__init__.py @@ -207,7 +207,6 @@ def _GetDarwinFrameworkToolUnsupportedTests() -> Set[str]: "Test_TC_DGTHREAD_2_2", # Thread Network Diagnostics is not implemented under darwin. "Test_TC_DGTHREAD_2_3", # Thread Network Diagnostics is not implemented under darwin. "Test_TC_DGTHREAD_2_4", # Thread Network Diagnostics is not implemented under darwin. - "Test_TC_FLABEL_2_1", # darwin-framework-tool does not support writing readonly attributes by name "Test_TC_GRPKEY_2_1", # darwin-framework-tool does not support writing readonly attributes by name "Test_TC_LCFG_2_1", # darwin-framework-tool does not support writing readonly attributes by name "Test_TC_OPCREDS_3_7", # darwin-framework-tool does not support the GetCommissionerRootCertificate command. diff --git a/scripts/tools/ELF_SIZE_TOOLING.md b/scripts/tools/ELF_SIZE_TOOLING.md new file mode 100644 index 00000000000000..7e7e9883afabfa --- /dev/null +++ b/scripts/tools/ELF_SIZE_TOOLING.md @@ -0,0 +1,63 @@ +# ELF binary size information + +## Individual size information + +`file_size_from_nm.py` is able to build an interactive tree map of +methods/namespaces sizes within an elf binary. + +Use it to determine how much space specific parts of the code take. For example: + +``` +./scripts/tools/file_size_from_nm.py \ + --zoom '::chip::app' \ + ./out/qpg-qpg6105-light/chip-qpg6105-lighting-example.out +``` + +could result in a graph like: + +![image](./FileSizeOutputExample.png) + +## Determine difference between two binaries + +`binary_elf_size_diff` provides the ability to compare two elf files. Usually +you can build the master branch of a binary and save it somewhere like +`./out/master.elf` and then re-build with changes and compare. + +Example runs: + +``` +> ~/devel/chip-scripts/bindiff.py \ + ./out/qpg-qpg6105-light/chip-qpg6105-lighting-example.out \ + ./out/qpg-master.out + +Type Size Function +------- ------ ----------------------------------------------------------------------------------------------------------------------- +CHANGED -128 chip::app::CodegenDataModelProvider::WriteAttribute(chip::app::DataModel::WriteAttributeRequest const&, chip::app::A... +CHANGED -76 chip::app::InteractionModelEngine::CheckCommandExistence(chip::app::ConcreteCommandPath const&, chip::app::DataModel... +CHANGED -74 chip::app::reporting::Engine::CheckAccessDeniedEventPaths(chip::TLV::TLVWriter&, bool&, chip::app::ReadHandler*) +REMOVED -58 chip::app::DataModel::EndpointFinder::EndpointFinder(chip::app::DataModel::ProviderMetadataTree*) +REMOVED -44 chip::app::DataModel::EndpointFinder::Find(unsigned short) +CHANGED 18 chip::app::WriteHandler::WriteClusterData(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributePa... +ADDED 104 chip::app::DataModel::ValidateClusterPath(chip::app::DataModel::ProviderMetadataTree*, chip::app::ConcreteClusterPat... +ADDED 224 chip::app::WriteHandler::CheckWriteAllowed(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributeP... +TOTAL -34 + + +``` + +``` +> ~/devel/chip-scripts/bindiff.py \ + --output csv --skip-total \ + ./out/qpg-qpg6105-light/chip-qpg6105-lighting-example.out ./out/qpg-master.out + +Type,Size,Function +CHANGED,-128,"chip::app::CodegenDataModelProvider::WriteAttribute(chip::app::DataModel::WriteAttributeRequest const&, chip::app::AttributeValueDecoder&)" +CHANGED,-76,"chip::app::InteractionModelEngine::CheckCommandExistence(chip::app::ConcreteCommandPath const&, chip::app::DataModel::AcceptedCommandEntry&)" +CHANGED,-74,"chip::app::reporting::Engine::CheckAccessDeniedEventPaths(chip::TLV::TLVWriter&, bool&, chip::app::ReadHandler*)" +REMOVED,-58,chip::app::DataModel::EndpointFinder::EndpointFinder(chip::app::DataModel::ProviderMetadataTree*) +REMOVED,-44,chip::app::DataModel::EndpointFinder::Find(unsigned short) +CHANGED,18,"chip::app::WriteHandler::WriteClusterData(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributePath const&, chip::TLV::TLVReader&)" +ADDED,104,"chip::app::DataModel::ValidateClusterPath(chip::app::DataModel::ProviderMetadataTree*, chip::app::ConcreteClusterPath const&, chip::Protocols::InteractionModel::Status)" +ADDED,224,"chip::app::WriteHandler::CheckWriteAllowed(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributePath const&)" + +``` diff --git a/scripts/tools/FileSizeOutputExample.png b/scripts/tools/FileSizeOutputExample.png new file mode 100644 index 00000000000000..263ed2cac2d563 Binary files /dev/null and b/scripts/tools/FileSizeOutputExample.png differ diff --git a/scripts/tools/binary_elf_size_diff.py b/scripts/tools/binary_elf_size_diff.py new file mode 100755 index 00000000000000..f982f54ed696fa --- /dev/null +++ b/scripts/tools/binary_elf_size_diff.py @@ -0,0 +1,218 @@ +#!/usr/bin/env -S python3 -B +# +# Copyright (c) 2025 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. +# + +# Processes 2 ELF files via `nm` and outputs the +# diferences in size. Example calls: +# +# scripts/tools/bindiff.py \ +# ./out/updated_binary.elf \ +# ./out/master_build.elf +# +# scripts/tools/bindiff.py \ +# --output csv \ +# --no-demangle \ +# ./out/updated_binary.elf \ +# ./out/master_build.elf +# +# +# Requires: +# - click +# - coloredlogs +# - cxxfilt +# - tabulate + +import csv +import logging +import os +import subprocess +import sys +from dataclasses import dataclass +from enum import Enum, auto +from pathlib import Path + +import click +import coloredlogs +import cxxfilt +import tabulate + + +@dataclass +class Symbol: + symbol_type: str + name: str + size: int + + +# Supported log levels, mapping string values required for argument +# parsing into logging constants +__LOG_LEVELS__ = { + "debug": logging.DEBUG, + "info": logging.INFO, + "warn": logging.WARN, + "fatal": logging.FATAL, +} + + +class OutputType(Enum): + TABLE = (auto(),) + CSV = (auto(),) + + +__OUTPUT_TYPES__ = { + "table": OutputType.TABLE, + "csv": OutputType.CSV, +} + + +def get_sizes(p: Path, no_demangle: bool): + output = subprocess.check_output( + ["nm", "--print-size", "--size-sort", "--radix=d", p.as_posix()] + ).decode("utf8") + + result = {} + + for line in output.split("\n"): + if not line.strip(): + continue + + _, size, t, name = line.split(" ") + size = int(size, 10) + + if not no_demangle: + name = cxxfilt.demangle(name) + + result[name] = Symbol(symbol_type=t, name=name, size=size) + + return result + + +def default_cols(): + try: + # if terminal output, try to fit + return os.get_terminal_size().columns - 29 + except Exception: + return 120 + + +@click.command() +@click.option( + "--log-level", + default="INFO", + show_default=True, + type=click.Choice(list(__LOG_LEVELS__.keys()), case_sensitive=False), + help="Determines the verbosity of script output.", +) +@click.option( + "--output", + default="TABLE", + show_default=True, + type=click.Choice(list(__OUTPUT_TYPES__.keys()), case_sensitive=False), + help="Determines the type of the output (use CSV for easier parsing).", +) +@click.option( + "--skip-total", + default=False, + is_flag=True, + help="Skip the output of a TOTAL line (i.e. a sum of all size deltas)" +) +@click.option( + "--no-demangle", + default=False, + is_flag=True, + help="Skip CXX demangling. Note that this will not deduplicate inline method instantiations." +) +@click.option( + "--style", + default="simple", + show_default=True, + help="tablefmt style for table output (e.g.: simple, plain, grid, fancy_grid, pipe, orgtbl, jira, presto, pretty, psql, rst)", +) +@click.option( + "--name-truncate", + default=default_cols(), + show_default=True, + type=int, + help="Truncate function name to this length (for table output only). use <= 10 to disable", +) +@click.argument("f1", type=Path) +@click.argument("f2", type=Path) +def main( + log_level, + output, + skip_total, + no_demangle, + style: str, + name_truncate: int, + f1: Path, + f2: Path, +): + log_fmt = "%(asctime)s %(levelname)-7s %(message)s" + coloredlogs.install(level=__LOG_LEVELS__[log_level], fmt=log_fmt) + + r1 = get_sizes(f1, no_demangle) + r2 = get_sizes(f2, no_demangle) + + output_type = __OUTPUT_TYPES__[output] + + # at this point every key has a size information + # We are interested in sizes that are DIFFERENT (add/remove or changed) + delta = [] + total = 0 + for k in set(r1.keys()) | set(r2.keys()): + if k in r1 and k in r2 and r1[k].size == r2[k].size: + continue + + # At this point the value is in v1 or v2 + s1 = r1[k].size if k in r1 else 0 + s2 = r2[k].size if k in r2 else 0 + name = r1[k].name if k in r1 else r2[k].name + + if k in r1 and k in r2: + change = "CHANGED" + elif k in r1: + change = "ADDED" + else: + change = "REMOVED" + + if ( + output_type == OutputType.TABLE + and name_truncate > 10 + and len(name) > name_truncate + ): + name = name[: name_truncate - 4] + "..." + + delta.append([change, s1 - s2, name]) + total += s1 - s2 + + delta.sort(key=lambda x: x[1]) + if not skip_total: + delta.append(["TOTAL", total, ""]) + + HEADER = ["Type", "Size", "Function"] + + if output_type == OutputType.TABLE: + print(tabulate.tabulate(delta, headers=HEADER, tablefmt=style)) + elif output_type == OutputType.CSV: + writer = csv.writer(sys.stdout) + writer.writerow(HEADER) + writer.writerows(delta) + else: + raise Exception("Unknown output type: %r" % output) + + +if __name__ == "__main__": + main(auto_envvar_prefix="CHIP") diff --git a/scripts/tools/memory/local_sizes.py b/scripts/tools/memory/local_sizes.py new file mode 100644 index 00000000000000..c4a7ee25df57e3 --- /dev/null +++ b/scripts/tools/memory/local_sizes.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2025 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" +This Python script analyzes the memory usage of a compiled binary and generates +a JSON report. It collects memory usage details and outputs them in a structured +JSON format. + +While similar to scripts/tools/memory/gh_sizes.py, this version extracts memory +information directly from a binary built from the current working directory +(rather than a GitHub workflow) and uses the tip of the current branch instead of +targeting a specific commit. + +Usage: local_sizes.py ‹platform› ‹config› ‹target› ‹binary› [‹output›] [‹option›…] + ‹platform› - Platform name, corresponding to a config file + in scripts/tools/memory/platform/ + ‹config› - Configuration identification string. + ‹target› - Build artifact identification string. + ‹binary› - Binary build artifact. + ‹output› - Output name or directory. + ‹option›… - Other options as for report_summary. + +Default output file is {platform}-{configname}-{buildname}-sizes.json in the +binary's directory. This file has the form: + + { + "platform": "‹platform›", + "config": "‹config›", + "target": "‹target›", + "time": 1317645296, + "input": "‹binary›", + "by": "section", + "ref": "refs/pull/12345/merge" + "frames": { + "section": [ + {"section": ".bss", "size": 260496}, + {"section": ".data", "size": 1648}, + {"section": ".text", "size": 740236} + ], + "region": [ + {"region": "FLASH", "size": 262144}, + {"region": "RAM", "size": 74023} + ] + } + } + +""" + +import datetime +import logging +import pathlib +import sys + +import memdf.collect +import memdf.report +import memdf.select +import memdf.util +from memdf import Config, DFs, SectionDF + +PLATFORM_CONFIG_DIR = pathlib.Path('scripts/tools/memory/platform') + + +def main(argv): + status = 0 + + try: + _, platform, config_name, target_name, binary, *args = argv + except ValueError: + program = pathlib.Path(argv[0]) + logging.error( + """ + Usage: %s platform config target binary [output] [options] + + For other purposes, a general program for the same operations is + %s/report_summary.py + + """, program.name, program.parent) + return 1 + + try: + config_file = pathlib.Path(platform) + if config_file.is_file(): + platform = config_file.stem + else: + config_file = (PLATFORM_CONFIG_DIR / platform).with_suffix('.cfg') + + output_base = f'{platform}-{config_name}-{target_name}-sizes.json' + if args and not args[0].startswith('-'): + out, *args = args + output = pathlib.Path(out) + if out.endswith('/') and not output.exists(): + output.mkdir(parents=True) + if output.is_dir(): + output = output / output_base + else: + output = pathlib.Path(binary).parent / output_base + + config_desc = { + **memdf.util.config.CONFIG, + **memdf.collect.CONFIG, + **memdf.select.CONFIG, + **memdf.report.OUTPUT_CONFIG, + } + # In case there is no platform configuration file, default to using a popular set of section names. + config_desc['section.select']['default'] = [ + '.text', '.rodata', '.data', '.bss'] + + config = Config().init(config_desc) + config.put('output.file', output) + config.put('output.format', 'json_records') + if config_file.is_file(): + config.read_config_file(config_file) + else: + logging.warning('Missing config file: %s', config_file) + config.parse([argv[0]] + args) + + config.put('output.metadata.platform', platform) + config.put('output.metadata.config', config_name) + config.put('output.metadata.target', target_name) + config.put('output.metadata.time', int(datetime.datetime.now().timestamp())) + config.put('output.metadata.input', binary) + config.put('output.metadata.by', 'section') + + # In case there is no platform configuration file or it does not define regions, + # try to find reasonable groups. + if not config.get('region.sections'): + sections = {'FLASH': [], 'RAM': []} + for section in config.get('section.select'): + print('section:', section) + for substring, region in [('text', 'FLASH'), ('rodata', 'FLASH'), ('data', 'RAM'), ('bss', 'RAM')]: + if substring in section: + sections[region].append(section) + break + config.put('region.sections', sections) + + collected: DFs = memdf.collect.collect_files(config, [binary]) + + sections = collected[SectionDF.name] + section_summary = sections[['section', + 'size']].sort_values(by='section') + section_summary.attrs['name'] = "section" + + region_summary = memdf.select.groupby( + config, collected['section'], 'region') + region_summary.attrs['name'] = "region" + + summaries = { + 'section': section_summary, + 'region': region_summary, + } + + # Write configured (json) report to the output file. + memdf.report.write_dfs(config, summaries) + + # Write text report to stdout. + memdf.report.write_dfs(config, + summaries, + sys.stdout, + 'simple', + floatfmt='.0f') + + except Exception as exception: + raise exception + + return status + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/scripts/tools/zap/tests/inputs/all-clusters-app.zap b/scripts/tools/zap/tests/inputs/all-clusters-app.zap index 77c492dad171ef..fe24534c35af6a 100644 --- a/scripts/tools/zap/tests/inputs/all-clusters-app.zap +++ b/scripts/tools/zap/tests/inputs/all-clusters-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,20 +41,23 @@ "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 0 }, { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -329,22 +332,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -573,22 +560,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1047,22 +1018,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 1, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1389,22 +1344,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1543,22 +1482,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1665,22 +1588,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -1941,22 +1848,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2177,22 +2068,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2533,22 +2408,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2657,22 +2516,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -2949,22 +2792,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5192,22 +5019,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5492,22 +5303,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -5712,22 +5507,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6102,20 +5881,23 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -6220,22 +6002,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6424,22 +6190,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -6694,22 +6444,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7212,22 +6946,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -7578,22 +7296,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -8088,22 +7790,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -8260,22 +7946,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -8398,22 +8068,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -9124,22 +8778,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -9280,22 +8918,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -9436,22 +9058,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -10651,22 +10257,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -11131,22 +10721,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -11424,22 +10998,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -12037,24 +11595,8 @@ "reportableChange": 0 }, { - "name": "GeneratedCommandList", - "code": 65528, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, - { - "name": "AcceptedCommandList", - "code": 65529, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", "type": "array", @@ -12069,8 +11611,8 @@ "reportableChange": 0 }, { - "name": "EventList", - "code": 65530, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", "type": "array", @@ -12384,22 +11926,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -12810,22 +12336,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -13021,22 +12531,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -13338,22 +12832,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -13812,22 +13290,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -14043,22 +13505,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -14181,22 +13627,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -14337,22 +13767,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -14494,22 +13908,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -15936,22 +15334,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -22698,20 +22080,23 @@ "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 256, "profileId": 259, "label": "MA-onofflight", - "name": "MA-onofflight" + "name": "MA-onofflight", + "deviceTypeOrder": 0 }, { "code": 17, "profileId": 259, "label": "MA-powersource", - "name": "MA-powersource" + "name": "MA-powersource", + "deviceTypeOrder": 1 } ], "deviceVersions": [ @@ -22816,22 +22201,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -23020,22 +22389,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -23256,22 +22609,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -23442,22 +22779,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -23660,22 +22981,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -23937,22 +23242,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -24102,14 +23391,16 @@ "code": 25, "profileId": 259, "label": "MA-secondary-network-interface", - "name": "MA-secondary-network-interface" + "name": "MA-secondary-network-interface", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 25, "profileId": 259, "label": "MA-secondary-network-interface", - "name": "MA-secondary-network-interface" + "name": "MA-secondary-network-interface", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -24226,22 +23517,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -24534,22 +23809,6 @@ "maxInterval": 65534, "reportableChange": 0 }, - { - "name": "EventList", - "code": 65530, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "AttributeList", "code": 65531, @@ -24637,4 +23896,4 @@ "parentEndpointIdentifier": null } ] -} +} \ No newline at end of file diff --git a/scripts/tools/zap/tests/inputs/lighting-app.zap b/scripts/tools/zap/tests/inputs/lighting-app.zap index 808a1e7de7b2ae..309f8f6b1c6b3e 100644 --- a/scripts/tools/zap/tests/inputs/lighting-app.zap +++ b/scripts/tools/zap/tests/inputs/lighting-app.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ @@ -4156,14 +4158,16 @@ "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 257, "profileId": 259, "label": "MA-dimmablelight", - "name": "MA-dimmablelight" + "name": "MA-dimmablelight", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/IMClusterCommandHandler.cpp b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/IMClusterCommandHandler.cpp index 2027fc3f2a7200..9a52408b1e3ed5 100644 --- a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/IMClusterCommandHandler.cpp +++ b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/IMClusterCommandHandler.cpp @@ -37,68 +37,6 @@ namespace app { namespace Clusters { -namespace AdministratorCommissioning { - -Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath, - TLV::TLVReader & aDataTlv) -{ - CHIP_ERROR TLVError = CHIP_NO_ERROR; - bool wasHandled = false; - { - switch (aCommandPath.mCommandId) - { - case Commands::OpenCommissioningWindow::Id: { - Commands::OpenCommissioningWindow::DecodableType commandData; - TLVError = DataModel::Decode(aDataTlv, commandData); - if (TLVError == CHIP_NO_ERROR) - { - wasHandled = emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback(apCommandObj, aCommandPath, - commandData); - } - break; - } - case Commands::OpenBasicCommissioningWindow::Id: { - Commands::OpenBasicCommissioningWindow::DecodableType commandData; - TLVError = DataModel::Decode(aDataTlv, commandData); - if (TLVError == CHIP_NO_ERROR) - { - wasHandled = emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallback( - apCommandObj, aCommandPath, commandData); - } - break; - } - case Commands::RevokeCommissioning::Id: { - Commands::RevokeCommissioning::DecodableType commandData; - TLVError = DataModel::Decode(aDataTlv, commandData); - if (TLVError == CHIP_NO_ERROR) - { - wasHandled = - emberAfAdministratorCommissioningClusterRevokeCommissioningCallback(apCommandObj, aCommandPath, commandData); - } - break; - } - default: { - // Unrecognized command ID, error status will apply. - ChipLogError(Zcl, "Unknown command " ChipLogFormatMEI " for cluster " ChipLogFormatMEI, - ChipLogValueMEI(aCommandPath.mCommandId), ChipLogValueMEI(aCommandPath.mClusterId)); - return Protocols::InteractionModel::Status::UnsupportedCommand; - } - } - } - - if (CHIP_NO_ERROR != TLVError || !wasHandled) - { - ChipLogProgress(Zcl, "Failed to dispatch command, TLVError=%" CHIP_ERROR_FORMAT, TLVError.Format()); - return Protocols::InteractionModel::Status::InvalidCommand; - } - - // We use success as a marker that no special handling is required - // This is to avoid having a std::optional which uses slightly more code. - return Protocols::InteractionModel::Status::Success; -} - -} // namespace AdministratorCommissioning - namespace BooleanStateConfiguration { Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath, @@ -1851,9 +1789,6 @@ void DispatchSingleClusterCommand(const ConcreteCommandPath & aCommandPath, TLV: switch (aCommandPath.mClusterId) { - case Clusters::AdministratorCommissioning::Id: - errorStatus = Clusters::AdministratorCommissioning::DispatchServerCommand(apCommandObj, aCommandPath, aReader); - break; case Clusters::BooleanStateConfiguration::Id: errorStatus = Clusters::BooleanStateConfiguration::DispatchServerCommand(apCommandObj, aCommandPath, aReader); break; diff --git a/scripts/tools/zap/tests/outputs/lighting-app/app-templates/IMClusterCommandHandler.cpp b/scripts/tools/zap/tests/outputs/lighting-app/app-templates/IMClusterCommandHandler.cpp index 61dae1f9dafce6..cea755f6113ff9 100644 --- a/scripts/tools/zap/tests/outputs/lighting-app/app-templates/IMClusterCommandHandler.cpp +++ b/scripts/tools/zap/tests/outputs/lighting-app/app-templates/IMClusterCommandHandler.cpp @@ -37,68 +37,6 @@ namespace app { namespace Clusters { -namespace AdministratorCommissioning { - -Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath, - TLV::TLVReader & aDataTlv) -{ - CHIP_ERROR TLVError = CHIP_NO_ERROR; - bool wasHandled = false; - { - switch (aCommandPath.mCommandId) - { - case Commands::OpenCommissioningWindow::Id: { - Commands::OpenCommissioningWindow::DecodableType commandData; - TLVError = DataModel::Decode(aDataTlv, commandData); - if (TLVError == CHIP_NO_ERROR) - { - wasHandled = emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback(apCommandObj, aCommandPath, - commandData); - } - break; - } - case Commands::OpenBasicCommissioningWindow::Id: { - Commands::OpenBasicCommissioningWindow::DecodableType commandData; - TLVError = DataModel::Decode(aDataTlv, commandData); - if (TLVError == CHIP_NO_ERROR) - { - wasHandled = emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallback( - apCommandObj, aCommandPath, commandData); - } - break; - } - case Commands::RevokeCommissioning::Id: { - Commands::RevokeCommissioning::DecodableType commandData; - TLVError = DataModel::Decode(aDataTlv, commandData); - if (TLVError == CHIP_NO_ERROR) - { - wasHandled = - emberAfAdministratorCommissioningClusterRevokeCommissioningCallback(apCommandObj, aCommandPath, commandData); - } - break; - } - default: { - // Unrecognized command ID, error status will apply. - ChipLogError(Zcl, "Unknown command " ChipLogFormatMEI " for cluster " ChipLogFormatMEI, - ChipLogValueMEI(aCommandPath.mCommandId), ChipLogValueMEI(aCommandPath.mClusterId)); - return Protocols::InteractionModel::Status::UnsupportedCommand; - } - } - } - - if (CHIP_NO_ERROR != TLVError || !wasHandled) - { - ChipLogProgress(Zcl, "Failed to dispatch command, TLVError=%" CHIP_ERROR_FORMAT, TLVError.Format()); - return Protocols::InteractionModel::Status::InvalidCommand; - } - - // We use success as a marker that no special handling is required - // This is to avoid having a std::optional which uses slightly more code. - return Protocols::InteractionModel::Status::Success; -} - -} // namespace AdministratorCommissioning - namespace ColorControl { Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath, @@ -977,9 +915,6 @@ void DispatchSingleClusterCommand(const ConcreteCommandPath & aCommandPath, TLV: switch (aCommandPath.mClusterId) { - case Clusters::AdministratorCommissioning::Id: - errorStatus = Clusters::AdministratorCommissioning::DispatchServerCommand(apCommandObj, aCommandPath, aReader); - break; case Clusters::ColorControl::Id: errorStatus = Clusters::ColorControl::DispatchServerCommand(apCommandObj, aCommandPath, aReader); break; diff --git a/src/access/AccessControl.cpp b/src/access/AccessControl.cpp index ba149a6a225b54..a223d250529dda 100644 --- a/src/access/AccessControl.cpp +++ b/src/access/AccessControl.cpp @@ -98,6 +98,8 @@ char GetAuthModeStringForLogging(AuthMode authMode) { case AuthMode::kNone: return 'n'; + case AuthMode::kInternalDeviceAccess: + return 'i'; case AuthMode::kPase: return 'p'; case AuthMode::kCase: diff --git a/src/access/AuthMode.h b/src/access/AuthMode.h index c5a2d76820855a..eadaec1d1da9cf 100644 --- a/src/access/AuthMode.h +++ b/src/access/AuthMode.h @@ -27,10 +27,11 @@ namespace Access { // Auth mode should have only one value expressed, which should not be None. enum class AuthMode : uint8_t { - kNone = 0, - kPase = 1 << 5, - kCase = 1 << 6, - kGroup = 1 << 7 + kNone = 0, + kInternalDeviceAccess = 1 << 4, // Not part of an external interaction + kPase = 1 << 5, + kCase = 1 << 6, + kGroup = 1 << 7 }; } // namespace Access diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn index 642f6ee4b5f355..1a6d84ca2827f6 100644 --- a/src/app/BUILD.gn +++ b/src/app/BUILD.gn @@ -107,17 +107,22 @@ source_set("paths") { "${chip_root}/src/app/util:types", "${chip_root}/src/lib/core", "${chip_root}/src/lib/core:types", + "${chip_root}/src/lib/support", ] } source_set("global-attributes") { - sources = [ "GlobalAttributes.h" ] + sources = [ + "GlobalAttributes.cpp", + "GlobalAttributes.h", + ] # This also depends on zap-generated code which is currently impossible to split out # as a dependency public_deps = [ ":app_config", "${chip_root}/src/app/common:ids", + "${chip_root}/src/app/data-model-provider", "${chip_root}/src/lib/support", ] } @@ -263,7 +268,6 @@ static_library("interaction-model") { # We likely should formalize and change this with a proper DataModel::Provider that # is consistent instead sources += [ - "${chip_root}/src/app/util/ember-global-attribute-access-interface.cpp", "${chip_root}/src/app/util/ember-io-storage.cpp", "dynamic_server/DynamicDispatcher.cpp", ] diff --git a/src/app/GlobalAttributes.cpp b/src/app/GlobalAttributes.cpp new file mode 100644 index 00000000000000..a65f79b22bd870 --- /dev/null +++ b/src/app/GlobalAttributes.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2022-2025 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 + +using chip::Protocols::InteractionModel::Status; + +namespace chip { +namespace app { + +bool IsSupportedGlobalAttributeNotInMetadata(AttributeId attributeId) +{ + for (auto & attr : GlobalAttributesNotInMetadata) + { + if (attr == attributeId) + { + return true; + } + } + + return false; +} + +DataModel::ActionReturnStatus ReadGlobalAttributeFromMetadata(DataModel::Provider * provider, const ConcreteAttributePath & path, + AttributeValueEncoder & encoder) +{ + CHIP_ERROR err; + + switch (path.mAttributeId) + { + case Clusters::Globals::Attributes::GeneratedCommandList::Id: { + DataModel::ListBuilder builder; + err = provider->GeneratedCommands(path, builder); + if (err != CHIP_NO_ERROR) + { + break; + } + auto buffer = builder.TakeBuffer(); + + return encoder.EncodeList([&buffer](const auto & listEncodeHelper) { + for (auto id : buffer) + { + // NOTE: cast to u64 because TLV encodes all numbers the same (no TLV sideffects) + // and this reduces template variants for Encode, saving flash. + ReturnErrorOnFailure(listEncodeHelper.Encode(static_cast(id))); + } + return CHIP_NO_ERROR; + }); + } + case Clusters::Globals::Attributes::AcceptedCommandList::Id: { + DataModel::ListBuilder builder; + err = provider->AcceptedCommands(path, builder); + if (err != CHIP_NO_ERROR) + { + break; + } + auto buffer = builder.TakeBuffer(); + + return encoder.EncodeList([&buffer](const auto & listEncodeHelper) { + for (auto entry : buffer) + { + // NOTE: cast to u64 because TLV encodes all numbers the same (no TLV sideffects) + // and this reduces template variants for Encode, saving flash. + ReturnErrorOnFailure(listEncodeHelper.Encode(static_cast(entry.commandId))); + } + return CHIP_NO_ERROR; + }); + } + case Clusters::Globals::Attributes::AttributeList::Id: { + DataModel::ListBuilder builder; + err = provider->Attributes(path, builder); + if (err != CHIP_NO_ERROR) + { + break; + } + auto buffer = builder.TakeBuffer(); + + return encoder.EncodeList([&buffer](const auto & listEncodeHelper) { + for (auto entry : buffer) + { + // NOTE: cast to u64 because TLV encodes all numbers the same (no TLV sideffects) + // and this reduces template variants for Encode, saving flash. + ReturnErrorOnFailure(listEncodeHelper.Encode(static_cast(entry.attributeId))); + } + + for (auto id : GlobalAttributesNotInMetadata) + { + // NOTE: cast to u64 because TLV encodes all numbers the same (no TLV sideffects) + // and this reduces template variants for Encode, saving flash. + ReturnErrorOnFailure(listEncodeHelper.Encode(static_cast(id))); + } + + return CHIP_NO_ERROR; + }); + } + default: + return CHIP_ERROR_INVALID_ARGUMENT; + } + + // if we get here, the path was NOT valid + if (err == CHIP_ERROR_NOT_FOUND) + { + // The `Failure` here is arbitrary: we expect ReadGlobalAttributeFromMetadata to be + // an internal API used for global attributes only and call preconditions say that + // should never happen. + // + // Code only takes this path if one of + // `GeneratedCommands`/`AcceptedCommands`/`Attribute` return a NOT_FOUND and + // that would indicate an invalid cluster (which should have been pre-validated by + // the caller). + return DataModel::ValidateClusterPath(provider, path, Status::Failure); + } + return err; +} + +} // namespace app +} // namespace chip diff --git a/src/app/GlobalAttributes.h b/src/app/GlobalAttributes.h index 7cfd06d3f7bfea..e70674dbb02aa1 100644 --- a/src/app/GlobalAttributes.h +++ b/src/app/GlobalAttributes.h @@ -19,6 +19,11 @@ #include #include +#include +#include +#include +#include +#include #include namespace chip { @@ -37,18 +42,17 @@ constexpr AttributeId GlobalAttributesNotInMetadata[] = { static_assert(ArrayIsSorted(GlobalAttributesNotInMetadata), "Array of global attribute ids must be sorted"); -inline bool IsSupportedGlobalAttributeNotInMetadata(AttributeId attributeId) -{ - for (auto & attr : GlobalAttributesNotInMetadata) - { - if (attr == attributeId) - { - return true; - } - } - - return false; -} +bool IsSupportedGlobalAttributeNotInMetadata(AttributeId attributeId); + +/** + * Reads a `IsSupportedGlobalAttributeNotInMetadata` attribute into `encoder`. + * + * Preconditions: + * - `path` MUST be a valid cluster path inside `provider` and its mAttributeID + * MUST be `IsSupportedGlobalAttributeNotInMetadata` + */ +DataModel::ActionReturnStatus ReadGlobalAttributeFromMetadata(DataModel::Provider * provider, const ConcreteAttributePath & path, + AttributeValueEncoder & encoder); } // namespace app } // namespace chip diff --git a/src/app/SpecificationDefinedRevisions.h b/src/app/SpecificationDefinedRevisions.h index a883aa36d74892..8d45072750caae 100644 --- a/src/app/SpecificationDefinedRevisions.h +++ b/src/app/SpecificationDefinedRevisions.h @@ -31,7 +31,7 @@ namespace Revision { * See section 8.1.1. "Revision History" in the "Interaction Model * Specification" chapter of the core Matter specification. */ -inline constexpr InteractionModelRevision kInteractionModelRevision = 11; +inline constexpr InteractionModelRevision kInteractionModelRevision = 12; inline constexpr uint8_t kInteractionModelRevisionTag = 0xFF; /** @@ -50,7 +50,7 @@ inline constexpr uint16_t kDataModelRevision = 18; * See section 11.1.5.22. "SpecificationVersion Attribute" in "Service and * Device Management" chapter of the core Matter specification. */ -inline constexpr uint32_t kSpecificationVersion = 0x01040000; +inline constexpr uint32_t kSpecificationVersion = 0x01040100; } // namespace Revision } // namespace chip diff --git a/src/app/chip_data_model.cmake b/src/app/chip_data_model.cmake index dcafc0055de3e9..65d3c0ada5effe 100644 --- a/src/app/chip_data_model.cmake +++ b/src/app/chip_data_model.cmake @@ -162,7 +162,6 @@ function(chip_configure_data_model APP_TARGET) ${CHIP_APP_BASE_DIR}/util/attribute-table.cpp ${CHIP_APP_BASE_DIR}/util/binding-table.cpp ${CHIP_APP_BASE_DIR}/util/DataModelHandler.cpp - ${CHIP_APP_BASE_DIR}/util/ember-global-attribute-access-interface.cpp ${CHIP_APP_BASE_DIR}/util/ember-io-storage.cpp ${CHIP_APP_BASE_DIR}/util/generic-callback-stubs.cpp ${CHIP_APP_BASE_DIR}/util/privilege-storage.cpp diff --git a/src/app/chip_data_model.gni b/src/app/chip_data_model.gni index 02be8ebaccf05b..9dbe7ec193a0e4 100644 --- a/src/app/chip_data_model.gni +++ b/src/app/chip_data_model.gni @@ -209,7 +209,6 @@ template("chip_data_model") { "${_app_root}/util/DataModelHandler.cpp", "${_app_root}/util/attribute-storage.cpp", "${_app_root}/util/attribute-table.cpp", - "${_app_root}/util/ember-global-attribute-access-interface.cpp", "${_app_root}/util/ember-io-storage.cpp", "${_app_root}/util/util.cpp", ] diff --git a/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp b/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp index 57a230de547743..b39a6d44ad8944 100644 --- a/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp +++ b/src/app/clusters/administrator-commissioning-server/administrator-commissioning-server.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include #include @@ -36,6 +38,7 @@ #include #include #include +#include using namespace chip; using namespace chip::app; @@ -45,20 +48,32 @@ using namespace chip::Protocols; using namespace chip::Crypto; using chip::Protocols::InteractionModel::Status; -class AdministratorCommissioningAttrAccess : public AttributeAccessInterface +class AdministratorCommissioningServer : public AttributeAccessInterface, public CommandHandlerInterface { public: - // Register for the OperationalCredentials cluster on all endpoints. - AdministratorCommissioningAttrAccess() : - AttributeAccessInterface(Optional::Missing(), Clusters::AdministratorCommissioning::Id) + // Register for the AdministratorCommissioning cluster on all endpoints. + AdministratorCommissioningServer() : + AttributeAccessInterface(Optional::Missing(), Clusters::AdministratorCommissioning::Id), + CommandHandlerInterface(Optional::Missing(), Clusters::AdministratorCommissioning::Id) {} CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override; + +private: + void InvokeCommand(HandlerContext & context) override; + + // Methods to handle the various commands this cluster may receive. + void OpenCommissioningWindow(HandlerContext & context, const Commands::OpenCommissioningWindow::DecodableType & commandData); +#ifdef ADMINISTRATOR_COMMISSIONING_ENABLE_OPEN_BASIC_COMMISSIONING_WINDOW_CMD + void OpenBasicCommissioningWindow(HandlerContext & context, + const Commands::OpenBasicCommissioningWindow::DecodableType & commandData); +#endif + void RevokeCommissioning(HandlerContext & context, const Commands::RevokeCommissioning::DecodableType & commandData); }; -AdministratorCommissioningAttrAccess gAdminCommissioningAttrAccess; +AdministratorCommissioningServer gAdminCommissioningServer; -CHIP_ERROR AdministratorCommissioningAttrAccess::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) +CHIP_ERROR AdministratorCommissioningServer::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) { VerifyOrDie(aPath.mClusterId == Clusters::AdministratorCommissioning::Id); @@ -80,9 +95,29 @@ CHIP_ERROR AdministratorCommissioningAttrAccess::Read(const ConcreteReadAttribut return CHIP_NO_ERROR; } -bool emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback( - app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath, - const Commands::OpenCommissioningWindow::DecodableType & commandData) +void AdministratorCommissioningServer::InvokeCommand(HandlerContext & context) +{ + switch (context.mRequestPath.mCommandId) + { + case Commands::OpenCommissioningWindow::Id: + HandleCommand( + context, [this](HandlerContext & ctx, const auto & commandData) { OpenCommissioningWindow(ctx, commandData); }); + break; +#ifdef ADMINISTRATOR_COMMISSIONING_ENABLE_OPEN_BASIC_COMMISSIONING_WINDOW_CMD + case Commands::OpenBasicCommissioningWindow::Id: + HandleCommand( + context, [this](HandlerContext & ctx, const auto & commandData) { OpenBasicCommissioningWindow(ctx, commandData); }); + break; +#endif + case Commands::RevokeCommissioning::Id: + HandleCommand( + context, [this](HandlerContext & ctx, const auto & commandData) { RevokeCommissioning(ctx, commandData); }); + break; + } +} + +void AdministratorCommissioningServer::OpenCommissioningWindow(HandlerContext & context, + const Commands::OpenCommissioningWindow::DecodableType & commandData) { MATTER_TRACE_SCOPE("OpenCommissioningWindow", "AdministratorCommissioning"); auto commissioningTimeout = System::Clock::Seconds16(commandData.commissioningTimeout); @@ -97,7 +132,7 @@ bool emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback( ChipLogProgress(Zcl, "Received command to open commissioning window"); - FabricIndex fabricIndex = commandObj->GetAccessingFabricIndex(); + FabricIndex fabricIndex = context.mCommandHandler.GetAccessingFabricIndex(); const FabricInfo * fabricInfo = Server::GetInstance().GetFabricTable().FindFabricWithIndex(fabricIndex); auto & failSafeContext = Server::GetInstance().GetFailSafeContext(); auto & commissionMgr = Server::GetInstance().GetCommissioningWindowManager(); @@ -124,7 +159,7 @@ bool emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback( if (status.HasValue()) { ChipLogError(Zcl, "Failed to open commissioning window. Cluster status 0x%02x", to_underlying(status.Value())); - commandObj->AddClusterSpecificFailure(commandPath, to_underlying(status.Value())); + context.mCommandHandler.AddClusterSpecificFailure(context.mRequestPath, to_underlying(status.Value())); } else { @@ -133,14 +168,13 @@ bool emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback( ChipLogError(Zcl, "Failed to open commissioning window. Global status " ChipLogFormatIMStatus, ChipLogValueIMStatus(globalStatus)); } - commandObj->AddStatus(commandPath, globalStatus); + context.mCommandHandler.AddStatus(context.mRequestPath, globalStatus); } - return true; } -bool emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallback( - app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath, - const Commands::OpenBasicCommissioningWindow::DecodableType & commandData) +#ifdef ADMINISTRATOR_COMMISSIONING_ENABLE_OPEN_BASIC_COMMISSIONING_WINDOW_CMD +void AdministratorCommissioningServer::OpenBasicCommissioningWindow( + CommandHandlerInterface::HandlerContext & context, const Commands::OpenBasicCommissioningWindow::DecodableType & commandData) { MATTER_TRACE_SCOPE("OpenBasicCommissioningWindow", "AdministratorCommissioning"); auto commissioningTimeout = System::Clock::Seconds16(commandData.commissioningTimeout); @@ -149,7 +183,7 @@ bool emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallbac Status globalStatus = Status::Success; ChipLogProgress(Zcl, "Received command to open basic commissioning window"); - FabricIndex fabricIndex = commandObj->GetAccessingFabricIndex(); + FabricIndex fabricIndex = context.mCommandHandler.GetAccessingFabricIndex(); const FabricInfo * fabricInfo = Server::GetInstance().GetFabricTable().FindFabricWithIndex(fabricIndex); auto & failSafeContext = Server::GetInstance().GetFailSafeContext(); auto & commissionMgr = Server::GetInstance().GetCommissioningWindowManager(); @@ -169,7 +203,7 @@ bool emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallbac if (status.HasValue()) { ChipLogError(Zcl, "Failed to open commissioning window. Cluster status 0x%02x", to_underlying(status.Value())); - commandObj->AddClusterSpecificFailure(commandPath, to_underlying(status.Value())); + context.mCommandHandler.AddClusterSpecificFailure(context.mRequestPath, to_underlying(status.Value())); } else { @@ -178,14 +212,13 @@ bool emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallbac ChipLogError(Zcl, "Failed to open commissioning window. Global status " ChipLogFormatIMStatus, ChipLogValueIMStatus(globalStatus)); } - commandObj->AddStatus(commandPath, globalStatus); + context.mCommandHandler.AddStatus(context.mRequestPath, globalStatus); } - return true; } +#endif -bool emberAfAdministratorCommissioningClusterRevokeCommissioningCallback( - app::CommandHandler * commandObj, const app::ConcreteCommandPath & commandPath, - const Commands::RevokeCommissioning::DecodableType & commandData) +void AdministratorCommissioningServer::RevokeCommissioning(CommandHandlerInterface::HandlerContext & context, + const Commands::RevokeCommissioning::DecodableType & commandData) { MATTER_TRACE_SCOPE("RevokeCommissioning", "AdministratorCommissioning"); ChipLogProgress(Zcl, "Received command to close commissioning window"); @@ -195,19 +228,19 @@ bool emberAfAdministratorCommissioningClusterRevokeCommissioningCallback( if (!Server::GetInstance().GetCommissioningWindowManager().IsCommissioningWindowOpen()) { ChipLogError(Zcl, "Commissioning window is currently not open"); - commandObj->AddClusterSpecificFailure(commandPath, to_underlying(StatusCode::kWindowNotOpen)); + context.mCommandHandler.AddClusterSpecificFailure(context.mRequestPath, to_underlying(StatusCode::kWindowNotOpen)); } else { Server::GetInstance().GetCommissioningWindowManager().CloseCommissioningWindow(); ChipLogProgress(Zcl, "Commissioning window is now closed"); - commandObj->AddStatus(commandPath, Status::Success); + context.mCommandHandler.AddStatus(context.mRequestPath, Status::Success); } - return true; } void MatterAdministratorCommissioningPluginServerInitCallback() { ChipLogProgress(Zcl, "Initiating Admin Commissioning cluster."); - AttributeAccessInterfaceRegistry::Instance().Register(&gAdminCommissioningAttrAccess); + CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gAdminCommissioningServer); + AttributeAccessInterfaceRegistry::Instance().Register(&gAdminCommissioningServer); } diff --git a/src/app/common/templates/config-data.yaml b/src/app/common/templates/config-data.yaml index 38f826c9ee6783..7dcf2b6b68ec6f 100644 --- a/src/app/common/templates/config-data.yaml +++ b/src/app/common/templates/config-data.yaml @@ -53,6 +53,7 @@ CommandHandlerInterfaceOnlyClusters: - General Diagnostics - Software Diagnostics - Wi-Fi Network Diagnostics + - Administrator Commissioning # We need a more configurable way of deciding which clusters have which init functions.... # See https://github.com/project-chip/connectedhomeip/issues/4369 diff --git a/src/app/data-model-provider/MetadataList.cpp b/src/app/data-model-provider/MetadataList.cpp index 564ccdf53f91cd..01da67ea37bfd9 100644 --- a/src/app/data-model-provider/MetadataList.cpp +++ b/src/app/data-model-provider/MetadataList.cpp @@ -82,10 +82,11 @@ CHIP_ERROR GenericAppendOnlyBuffer::EnsureAppendCapacity(size_t numElements) if (mBuffer == nullptr) { - mBuffer = static_cast(Platform::MemoryCalloc(numElements, mElementSize)); + mBuffer = static_cast(Platform::MemoryCalloc(numElements, mElementSize)); + VerifyOrReturnError(mBuffer != nullptr, CHIP_ERROR_NO_MEMORY); mCapacity = numElements; mBufferIsAllocated = true; - return mBuffer != nullptr ? CHIP_NO_ERROR : CHIP_ERROR_NO_MEMORY; + return CHIP_NO_ERROR; } // we already have the data in buffer. we have two choices: @@ -100,9 +101,9 @@ CHIP_ERROR GenericAppendOnlyBuffer::EnsureAppendCapacity(size_t numElements) else { // this is NOT an allocated buffer, but it should become one - auto new_buffer = static_cast(Platform::MemoryCalloc(mElementCount + numElements, mElementSize)); - mBufferIsAllocated = true; + auto new_buffer = static_cast(Platform::MemoryCalloc(mElementCount + numElements, mElementSize)); VerifyOrReturnError(new_buffer != nullptr, CHIP_ERROR_NO_MEMORY); + mBufferIsAllocated = true; memcpy(new_buffer, mBuffer, mElementCount * mElementSize); mBuffer = new_buffer; } @@ -119,7 +120,7 @@ CHIP_ERROR GenericAppendOnlyBuffer::AppendSingleElementRaw(const void * buffer) return CHIP_NO_ERROR; } -CHIP_ERROR GenericAppendOnlyBuffer::AppendElementArrayRaw(const void * buffer, size_t numElements) +CHIP_ERROR GenericAppendOnlyBuffer::AppendElementArrayRaw(const void * __restrict__ buffer, size_t numElements) { ReturnErrorOnFailure(EnsureAppendCapacity(numElements)); diff --git a/src/app/data-model-provider/MetadataList.h b/src/app/data-model-provider/MetadataList.h index 5086a430749b93..24a34c8223f655 100644 --- a/src/app/data-model-provider/MetadataList.h +++ b/src/app/data-model-provider/MetadataList.h @@ -47,7 +47,7 @@ class GenericAppendOnlyBuffer /// Ensure that at least the specified number of elements /// can be appended to the internal buffer; /// - /// This will cause the internal buffer to become and allocated buffer + /// This will cause the internal buffer to become an allocated buffer CHIP_ERROR EnsureAppendCapacity(size_t numElements); bool IsEmpty() const { return mElementCount == 0; } @@ -66,7 +66,10 @@ class GenericAppendOnlyBuffer /// /// This ALWAYS COPIES the elements internally. /// Additional capacity is AUTOMATICALLY ADDED. - CHIP_ERROR AppendElementArrayRaw(const void * buffer, size_t numElements); + /// + /// buffer MUST NOT point inside "own" buffer as mBuffer may be reallocated + /// as part of the appending. + CHIP_ERROR AppendElementArrayRaw(const void * __restrict__ buffer, size_t numElements); /// Appends a list of elements from a raw array. /// @@ -93,7 +96,11 @@ class GenericAppendOnlyBuffer /// Represents a RAII instance owning a buffer. /// -/// It auto-frees the owned buffer on destruction +/// It auto-frees the owned buffer on destruction via `Platform::MemoryFree`. +/// +/// This class is designed to be a storage class for `GenericAppendOnlyBuffer` and +/// its subclasses (i.e. GenericAppendOnlyBuffer uses PlatformMemory and this class +/// does the same. They MUST be kept in sync.) class ScopedBuffer { public: @@ -165,6 +172,10 @@ class ListBuilder : public detail::GenericAppendOnlyBuffer /// /// Automatically attempts to allocate sufficient space to fulfill the element /// requirements. + /// + /// `span` MUST NOT point inside "own" buffer (and generally will not + /// as this class does not expose buffer access except by releasing ownership + /// via `Take`) CHIP_ERROR AppendElements(SpanType span) { return AppendElementArrayRaw(span.data(), span.size()); } /// Append a single element. diff --git a/src/app/data-model-provider/MetadataLookup.cpp b/src/app/data-model-provider/MetadataLookup.cpp index 5ec6b451ed264d..a249b7e33caeed 100644 --- a/src/app/data-model-provider/MetadataLookup.cpp +++ b/src/app/data-model-provider/MetadataLookup.cpp @@ -82,6 +82,27 @@ std::optional EndpointFinder::Find(EndpointId endpointId) return std::nullopt; } +Protocols::InteractionModel::Status ValidateClusterPath(ProviderMetadataTree * provider, const ConcreteClusterPath & path, + Protocols::InteractionModel::Status successStatus) +{ + if (ServerClusterFinder(provider).Find(path).has_value()) + { + return successStatus; + } + + auto endpoints = provider->EndpointsIgnoreError(); + for (auto & endpointEntry : endpoints) + { + if (endpointEntry.id == path.mEndpointId) + { + // endpoint is valid + return Protocols::InteractionModel::Status::UnsupportedCluster; + } + } + + return Protocols::InteractionModel::Status::UnsupportedEndpoint; +} + } // namespace DataModel } // namespace app } // namespace chip diff --git a/src/app/data-model-provider/MetadataLookup.h b/src/app/data-model-provider/MetadataLookup.h index 1d25122e7e8281..7526bd32acc375 100644 --- a/src/app/data-model-provider/MetadataLookup.h +++ b/src/app/data-model-provider/MetadataLookup.h @@ -80,6 +80,14 @@ class EndpointFinder ReadOnlyBuffer mEndpoints; }; +/// Validates that the cluster identified by `path` exists within the given provider. +/// If the endpoint does not exist, will return Status::UnsupportedEndpoint. +/// If the endpoint exists but does not have the cluster identified by the path, will return Status::UnsupportedCluster. +/// +/// Otherwise, will return successStatus. +Protocols::InteractionModel::Status ValidateClusterPath(ProviderMetadataTree * provider, const ConcreteClusterPath & path, + Protocols::InteractionModel::Status successStatus); + } // namespace DataModel } // namespace app } // namespace chip diff --git a/src/app/data-model-provider/Provider.h b/src/app/data-model-provider/Provider.h index 13d5a4a4f55e7c..36a13d0eb810a3 100644 --- a/src/app/data-model-provider/Provider.h +++ b/src/app/data-model-provider/Provider.h @@ -58,8 +58,12 @@ class Provider : public ProviderMetadataTree // event emitting, path marking and other operations virtual InteractionModelContext CurrentContext() const { return mContext; } - /// TEMPORARY/TRANSITIONAL requirement for transitioning from ember-specific code - /// ReadAttribute is REQUIRED to respond to GlobalAttribute read requests + /// NOTE: this code is NOT required to handle `List` global attributes: + /// AcceptedCommandsList, GeneratedCommandsList OR AttributeList + /// + /// Users of DataModel::Provider are expected to get these lists + /// from ProviderMetadataTree (in particular IM Reads of these + /// attributes will the automatically filled from metadata). /// /// Return value notes: /// ActionReturnStatus::IsOutOfSpaceEncodingResponse @@ -85,6 +89,19 @@ class Provider : public ProviderMetadataTree /// This includes cases where command handling and value return will be done asynchronously. /// - returning a value other than Success implies an error reply (error and data are mutually exclusive) /// + /// Preconditions: + /// - `request.path` MUST refer to a command that actually exists. This is because in practice + /// callers must do ACL and flag checks (e.g. for timed invoke) before calling this function. + /// + /// Callers that do not care about those checks should use `ProviderMetadataTree::AcceptedCommands` + /// to check for command existence. + /// + /// - TODO: as interfaces are updated, we may want to make the above requirement more + /// relaxed, as it seems desirable for users of this interface to have guaranteed + /// behavior (like error on invalid paths) whereas today this seems unclear as some + /// command intercepts do not validate that the command is in fact accepted on the + /// endpoint provided. + /// /// Return value expectations: /// - if a response has been placed into `handler` then std::nullopt MUST be returned. In particular /// note that CHIP_NO_ERROR is NOT the same as std::nullopt: diff --git a/src/app/data-model-provider/ProviderMetadataTree.h b/src/app/data-model-provider/ProviderMetadataTree.h index cd1ff179806e3b..3b0820e6efb73e 100644 --- a/src/app/data-model-provider/ProviderMetadataTree.h +++ b/src/app/data-model-provider/ProviderMetadataTree.h @@ -60,6 +60,14 @@ class ProviderMetadataTree virtual CHIP_ERROR ClientClusters(EndpointId endpointId, ListBuilder & builder) = 0; virtual CHIP_ERROR ServerClusters(EndpointId endpointId, ListBuilder & builder) = 0; + /// Attribute lists contain all attributes EXCEPT the list attributes that + /// are part of metadata. The output from this method MUST NOT contain: + /// - AttributeList::Id + /// - AcceptedCommandList::Id + /// - GeneratedCommandList::Id + /// However it MUST ALWAYS contain: + /// - ClusterRevision::Id + /// - FeatureMap::Id virtual CHIP_ERROR Attributes(const ConcreteClusterPath & path, ListBuilder & builder) = 0; virtual CHIP_ERROR GeneratedCommands(const ConcreteClusterPath & path, ListBuilder & builder) = 0; virtual CHIP_ERROR AcceptedCommands(const ConcreteClusterPath & path, ListBuilder & builder) = 0; @@ -83,7 +91,11 @@ class ProviderMetadataTree virtual void Temporary_ReportAttributeChanged(const AttributePathParams & path) = 0; // "convenience" functions that just return the data and ignore the error - // This returns the builder as-is even after the error (e.g. not found would return empty data) + // This returns the `ListBuilder<..>::TakeBuffer` from their equivalent fuctions as-is, + // even after an error (e.g. not found would return empty data). + // + // Usage of these indicates no error handling (not even logging) and code should + // consider handling errors instead. ReadOnlyBuffer EndpointsIgnoreError(); ReadOnlyBuffer ServerClustersIgnoreError(EndpointId endpointId); ReadOnlyBuffer AttributesIgnoreError(const ConcreteClusterPath & path); diff --git a/src/app/data-model-provider/StringBuilderAdapters.cpp b/src/app/data-model-provider/StringBuilderAdapters.cpp index 5b8f6db5eab31c..69b697ac30b479 100644 --- a/src/app/data-model-provider/StringBuilderAdapters.cpp +++ b/src/app/data-model-provider/StringBuilderAdapters.cpp @@ -28,3 +28,15 @@ StatusWithSize ToString(const chip::ap } } // namespace pw +// +#if CHIP_CONFIG_TEST_GOOGLETEST +namespace chip { + +void PrintTo(const chip::app::DataModel::ActionReturnStatus & status, std::ostream * os) +{ + chip::app::DataModel::ActionReturnStatus::StringStorage storage; + *os << "ActionReturnStatus<" << status.c_str(storage) << ">"; +} + +} // namespace chip +#endif // CHIP_CONFIG_TEST_GOOGLETEST diff --git a/src/app/data-model-provider/StringBuilderAdapters.h b/src/app/data-model-provider/StringBuilderAdapters.h index 32da18f43f1681..e0649b9279891b 100644 --- a/src/app/data-model-provider/StringBuilderAdapters.h +++ b/src/app/data-model-provider/StringBuilderAdapters.h @@ -34,6 +34,7 @@ /// which is not as helpful as a full formatted output. #include +#include #include @@ -44,3 +45,11 @@ StatusWithSize ToString(const chip::ap pw::span buffer); } // namespace pw + +#if CHIP_CONFIG_TEST_GOOGLETEST +namespace chip { + +void PrintTo(const chip::app::DataModel::ActionReturnStatus & status, std::ostream * os); + +} // namespace chip +#endif // CHIP_CONFIG_TEST_GOOGLETEST diff --git a/src/app/dynamic_server/AccessControl.cpp b/src/app/dynamic_server/AccessControl.cpp index 75385f49308792..17298956eaf51a 100644 --- a/src/app/dynamic_server/AccessControl.cpp +++ b/src/app/dynamic_server/AccessControl.cpp @@ -63,7 +63,8 @@ class AccessControlDelegate : public Access::AccessControl::Delegate return CHIP_ERROR_ACCESS_DENIED; } - if (subjectDescriptor.authMode != AuthMode::kCase && subjectDescriptor.authMode != AuthMode::kPase) + if (subjectDescriptor.authMode != AuthMode::kCase && subjectDescriptor.authMode != AuthMode::kPase && + subjectDescriptor.authMode != AuthMode::kInternalDeviceAccess) { // No idea who is asking; deny for now. return CHIP_ERROR_ACCESS_DENIED; diff --git a/src/app/icd/server/tests/TestICDMonitoringTable.cpp b/src/app/icd/server/tests/TestICDMonitoringTable.cpp index 81fcb2af18a250..ffa5c349a1bc35 100644 --- a/src/app/icd/server/tests/TestICDMonitoringTable.cpp +++ b/src/app/icd/server/tests/TestICDMonitoringTable.cpp @@ -26,6 +26,10 @@ #include #include +#if CHIP_CRYPTO_PSA +#include +#endif + using namespace chip; using namespace chip::app::Clusters::IcdManagement; @@ -65,7 +69,30 @@ constexpr uint8_t kKeyBuffer3a[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f }; -TEST(TestICDMonitoringTable, TestEntryAssignationOverload) +struct TestICDMonitoringTable : public ::testing::Test +{ + void SetUp() override + { +#if CHIP_CRYPTO_PSA + ASSERT_EQ(psa_crypto_init(), PSA_SUCCESS); +#endif + } + + void ValidateHmac128(const Crypto::Hmac128KeyHandle & saved, const Crypto::Hmac128KeyHandle & loaded) + { +#if CHIP_CRYPTO_PSA + EXPECT_NE(saved.As(), loaded.As()); + EXPECT_GE(loaded.As(), to_underlying(Crypto::KeyIdBase::ICDKeyRangeStart)); + EXPECT_LE(loaded.As(), to_underlying(Crypto::KeyIdBase::Maximum)); +#else + EXPECT_EQ(memcmp(saved.As(), loaded.As(), + sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); +#endif + } +}; + +TEST_F(TestICDMonitoringTable, TestEntryAssignationOverload) { TestSessionKeystoreImpl keystore; ICDMonitoringEntry entry(&keystore); @@ -100,7 +127,7 @@ TEST(TestICDMonitoringTable, TestEntryAssignationOverload) EXPECT_TRUE(entry2.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); } -TEST(TestICDMonitoringTable, TestEntryMaximumSize) +TEST_F(TestICDMonitoringTable, TestEntryMaximumSize) { TestPersistentStorageDelegate storage; TestSessionKeystoreImpl keystore; @@ -114,7 +141,7 @@ TEST(TestICDMonitoringTable, TestEntryMaximumSize) EXPECT_EQ(CHIP_NO_ERROR, table.Set(0, entry)); } -TEST(TestICDMonitoringTable, TestEntryKeyFunctions) +TEST_F(TestICDMonitoringTable, TestEntryKeyFunctions) { TestSessionKeystoreImpl keystore; ICDMonitoringEntry entry(&keystore); @@ -140,7 +167,7 @@ TEST(TestICDMonitoringTable, TestEntryKeyFunctions) EXPECT_EQ(entry.DeleteKey(), CHIP_NO_ERROR); } -TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue) +TEST_F(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue) { TestPersistentStorageDelegate storage; TestSessionKeystoreImpl keystore; @@ -178,9 +205,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue) EXPECT_EQ(kClientNodeId12, entry.monitoredSubject); EXPECT_EQ(ClientTypeEnum::kPermanent, entry.clientType); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); - EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle); // Retrieve second entry EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry)); @@ -189,9 +214,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue) EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); EXPECT_EQ(ClientTypeEnum::kEphemeral, entry.clientType); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle); // No more entries EXPECT_EQ(CHIP_ERROR_NOT_FOUND, loading.Get(2, entry)); @@ -213,9 +236,7 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue) EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); EXPECT_EQ(ClientTypeEnum::kEphemeral, entry.clientType); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle); // Retrieve second entry EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry)); @@ -224,12 +245,10 @@ TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue) EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); EXPECT_EQ(ClientTypeEnum::kPermanent, entry.clientType); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - EXPECT_EQ(memcmp(entry4.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry4.hmacKeyHandle, entry.hmacKeyHandle); } -TEST(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues) +TEST_F(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues) { TestPersistentStorageDelegate storage; TestSessionKeystoreImpl keystore; @@ -271,7 +290,7 @@ TEST(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues) EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry5)); } -TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics) +TEST_F(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics) { TestPersistentStorageDelegate storage; TestSessionKeystoreImpl keystore; @@ -314,9 +333,7 @@ TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics) EXPECT_EQ(kClientNodeId11, entry.checkInNodeID); EXPECT_EQ(kClientNodeId12, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); - EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle); // Retrieve fabric1, second entry EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry)); @@ -324,9 +341,7 @@ TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics) EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle); // Retrieve fabric2, first entry EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry)); @@ -334,12 +349,10 @@ TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics) EXPECT_EQ(kClientNodeId21, entry.checkInNodeID); EXPECT_EQ(kClientNodeId22, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle); } -TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) +TEST_F(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) { TestPersistentStorageDelegate storage; TestSessionKeystoreImpl keystore; @@ -379,9 +392,7 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) EXPECT_EQ(kClientNodeId11, entry.checkInNodeID); EXPECT_EQ(kClientNodeId12, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); - EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry1.hmacKeyHandle, entry.hmacKeyHandle); // Retrieve second entry (not modified) EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry)); @@ -389,9 +400,7 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle); // Remove (existing) EXPECT_EQ(CHIP_NO_ERROR, table1.Remove(0)); @@ -405,9 +414,7 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry2.hmacKeyHandle, entry.hmacKeyHandle); // Retrieve fabric2, first entry EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry)); @@ -415,9 +422,7 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) EXPECT_EQ(kClientNodeId21, entry.checkInNodeID); EXPECT_EQ(kClientNodeId22, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle); // Remove all (fabric 1) EXPECT_EQ(CHIP_NO_ERROR, table1.RemoveAll()); @@ -429,9 +434,7 @@ TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) EXPECT_EQ(kClientNodeId21, entry.checkInNodeID); EXPECT_EQ(kClientNodeId22, entry.monitoredSubject); EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), - 0); + ValidateHmac128(entry3.hmacKeyHandle, entry.hmacKeyHandle); // Remove all (fabric 2) EXPECT_EQ(CHIP_NO_ERROR, table2.RemoveAll()); diff --git a/src/app/reporting/Engine.cpp b/src/app/reporting/Engine.cpp index c9d6392286affc..fbcd9d302cf1ec 100644 --- a/src/app/reporting/Engine.cpp +++ b/src/app/reporting/Engine.cpp @@ -35,9 +35,10 @@ #include #include #include -#include #include +#include + #if CHIP_CONFIG_ENABLE_ICD_SERVER #include // nogncheck #endif @@ -173,10 +174,22 @@ DataModel::ActionReturnStatus RetrieveClusterData(DataModel::Provider * dataMode DataModel::ActionReturnStatus status(CHIP_NO_ERROR); AttributeValueEncoder attributeValueEncoder(reportBuilder, subjectDescriptor, path, version, isFabricFiltered, encoderState); + // TODO: we explicitly DO NOT validate that path is a valid cluster path (even more, above serverClusterFinder + // explicitly ignores that case). This means that global attribute reads as well as ReadAttribute + // can be passed invalid paths when an invalid Read is detected and must handle them. + // + // See https://github.com/project-chip/connectedhomeip/issues/37410 + if (auto access_status = ValidateReadAttributeACL(dataModel, subjectDescriptor, path); access_status.has_value()) { status = *access_status; } + else if (IsSupportedGlobalAttributeNotInMetadata(readRequest.path.mAttributeId)) + { + // Global attributes are NOT directly handled by data model providers, instead + // the are routed through metadata. + status = ReadGlobalAttributeFromMetadata(dataModel, readRequest.path, attributeValueEncoder); + } else { status = dataModel->ReadAttribute(readRequest, attributeValueEncoder); diff --git a/src/app/tests/TestReadInteraction.cpp b/src/app/tests/TestReadInteraction.cpp index b56db3e82dc1b5..50b4b745299d02 100644 --- a/src/app/tests/TestReadInteraction.cpp +++ b/src/app/tests/TestReadInteraction.cpp @@ -15,8 +15,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include + #include #include +#include #include #include #include @@ -30,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -37,13 +41,19 @@ #include #include #include +#include +#include +#include #include #include #include #include -#include + +#include namespace { +using namespace chip::app::Clusters::Globals::Attributes; + uint8_t gDebugEventBuffer[128]; uint8_t gInfoEventBuffer[128]; uint8_t gCritEventBuffer[128]; @@ -71,7 +81,6 @@ static bool sUsingSubSync = false; const chip::Test::MockNodeConfig & TestMockNodeConfig() { using namespace chip::app; - using namespace chip::app::Clusters::Globals::Attributes; using namespace chip::Test; // clang-format off @@ -167,6 +176,36 @@ void GenerateEvents() EXPECT_EQ(logMgmt.LogEvent(&testEventGenerator, options2, eid2), CHIP_NO_ERROR); } +/// Represents an expected attribute capture +class AttributeCaptureAssertion +{ +public: + constexpr AttributeCaptureAssertion(chip::EndpointId ep, chip::ClusterId cl, chip::AttributeId at, + std::optional listSize = std::nullopt) : + mEndpoint(ep), + mCluster(cl), mAttribute(at), mListSize(listSize) + {} + + chip::app::ConcreteAttributePath Path() const { return chip::app::ConcreteAttributePath(mEndpoint, mCluster, mAttribute); } + + chip::EndpointId Endpoint() const { return mEndpoint; } + chip::ClusterId Cluster() const { return mCluster; } + chip::AttributeId Attribute() const { return mAttribute; } + std::optional ListSize() const { return mListSize; } + + bool Matches(const chip::app::ConcreteAttributePath & path, const std::optional & listSize) const + { + return (Path() == path) && (mListSize == listSize); + } + +private: + // this is split out because ConcreteAttributePath is NOT constexpr + const chip::EndpointId mEndpoint; + const chip::ClusterId mCluster; + const chip::AttributeId mAttribute; + const std::optional mListSize; +}; + class MockInteractionModelApp : public chip::app::ReadClient::Callback { public: @@ -191,13 +230,19 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback { if (status.mStatus == chip::Protocols::InteractionModel::Status::Success) { + ChipLogProgress(Test, "Attribute data received 0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI " Success: LIST: %s", + aPath.mEndpointId, ChipLogValueMEI(aPath.mClusterId), ChipLogValueMEI(aPath.mAttributeId), + aPath.IsListOperation() ? "true" : "false"); mReceivedAttributePaths.push_back(aPath); mNumAttributeResponse++; mGotReport = true; + std::optional listSize = std::nullopt; + if (aPath.IsListItemOperation()) { mNumArrayItems++; + listSize = 1; } else if (aPath.IsListOperation()) { @@ -208,10 +253,18 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback size_t count = 0; if (chip::TLV::Utilities::Count(*apData, count, /* aRecurse = */ false) == CHIP_NO_ERROR) { + listSize = static_cast(count); mNumArrayItems += static_cast(count); + ChipLogProgress(Test, " List count: %u", static_cast(count)); } } } + mReceivedListSizes.push_back(listSize); + } + else + { + ChipLogError(NotSpecified, "ERROR status for 0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI, aPath.mEndpointId, + ChipLogValueMEI(aPath.mClusterId), ChipLogValueMEI(aPath.mAttributeId)); } mLastStatusReceived = status; } @@ -242,6 +295,132 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback } } + // Log the current captures in a code-like format, to more easily update tests + void LogCaptures(const char * heading) + { + ChipLogProgress(Test, "Captured attributes (%s):", heading); + + for (unsigned i = 0; i < mReceivedAttributePaths.size(); i++) + { + const auto & path = mReceivedAttributePaths[i]; + chip::StringBuilder<128> argsBuffer; + + if (path.mEndpointId >= 0xff) + { + argsBuffer.AddFormat("0x%X, ", path.mEndpointId); + } + else + { + argsBuffer.AddFormat("%u, ", path.mEndpointId); + } + + if (path.mClusterId >= 0xff) + { + argsBuffer.AddFormat("0x%lX, ", static_cast(path.mClusterId)); + } + else + { + argsBuffer.AddFormat("%lu, ", static_cast(path.mClusterId)); + } + + switch (path.mAttributeId) + { + case ClusterRevision::Id: + argsBuffer.Add("ClusterRevision::Id"); + break; + case FeatureMap::Id: + argsBuffer.Add("FeatureMap::Id"); + break; + case GeneratedCommandList::Id: + argsBuffer.Add("GeneratedCommandList::Id"); + break; + case AcceptedCommandList::Id: + argsBuffer.Add("AcceptedCommandList::Id"); + break; + case AttributeList::Id: + argsBuffer.Add("AttributeList::Id"); + break; + default: + if (path.mAttributeId >= 0xff) + { + argsBuffer.AddFormat("0x%lX", static_cast(path.mAttributeId)); + } + else + { + argsBuffer.AddFormat("%lu", static_cast(path.mAttributeId)); + } + break; + } + + auto listSize = mReceivedListSizes[i]; + if (listSize.has_value()) + { + argsBuffer.AddFormat(", /* listSize = */ %u", listSize.value()); + } + + ChipLogProgress(Test, " AttributeCaptureAssertion(%s),", argsBuffer.c_str()); + } + } + + void Reset() + { + mNumDataElementIndex = 0; + mGotEventResponse = false; + mNumReadEventFailureStatusReceived = 0; + mNumAttributeResponse = 0; + mNumArrayItems = 0; + mGotReport = false; + mReadError = false; + mError = CHIP_NO_ERROR; + mReceivedAttributePaths.clear(); + mReceivedListSizes.clear(); + } + + bool CapturesMatchExactly(chip::Span captures) + { + if (captures.size() != mReceivedAttributePaths.size()) + { + ChipLogError(Test, "Captures do not match: expected %u, got %u instead", static_cast(captures.size()), + static_cast(mReceivedAttributePaths.size())); + return false; + } + + for (unsigned i = 0; i < mReceivedAttributePaths.size(); i++) + { + if (captures[i].Matches(mReceivedAttributePaths[i], mReceivedListSizes[i])) + { + continue; + } + + ChipLogError(Test, "Failure on expected capture index %u:", i); + + chip::StringBuilder<128> buffer; + buffer.AddFormat("0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI "", captures[i].Endpoint(), + ChipLogValueMEI(captures[i].Cluster()), ChipLogValueMEI(captures[i].Attribute())); + auto listSize = captures[i].ListSize(); + if (listSize.has_value()) + { + buffer.AddFormat(" - list of %u items", *listSize); + } + + ChipLogError(Test, " Expected: %s", buffer.c_str()); + + buffer.Reset(); + buffer.AddFormat("0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI "", mReceivedAttributePaths[i].mEndpointId, + ChipLogValueMEI(mReceivedAttributePaths[i].mClusterId), + ChipLogValueMEI(mReceivedAttributePaths[i].mEndpointId)); + listSize = mReceivedListSizes[i]; + if (listSize.has_value()) + { + buffer.AddFormat(" - list of %u items", *listSize); + } + ChipLogError(Test, " Actual: %s", buffer.c_str()); + return false; + } + + return true; + } + int mNumDataElementIndex = 0; bool mGotEventResponse = false; int mNumReadEventFailureStatusReceived = 0; @@ -253,6 +432,11 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback chip::app::StatusIB mLastStatusReceived; CHIP_ERROR mError = CHIP_NO_ERROR; std::vector mReceivedAttributePaths; + + // For every received attribute path, report the size of the underlying list + // - nullopt if NOT a list + // - list size (including 0) if a list + std::vector> mReceivedListSizes; }; // @@ -1314,7 +1498,16 @@ void TestReadInteraction::TestReadWildcard() EXPECT_EQ(readClient.SendRequest(readPrepareParams), CHIP_NO_ERROR); DrainAndServiceIO(); - EXPECT_EQ(delegate.mNumAttributeResponse, 5); + // Expected attributes: + // - 0xFFFD Cluster revision + // - 0xFFFC Feature map + // - 0xFFF10001 + // - 0xFFF10002 + // - 0xFFF10003 + // - 0xFFF8 / GeneratedCommandList + // - 0xFFF9 / AcceptedCommandList + // - 0xFFFB / AttributeList + EXPECT_EQ(delegate.mNumAttributeResponse, 8); EXPECT_TRUE(delegate.mGotReport); EXPECT_FALSE(delegate.mReadError); // By now we should have closed all exchanges and sent all pending acks, so @@ -1365,11 +1558,14 @@ void TestReadInteraction::TestReadChunking() DrainAndServiceIO(); - // We get one chunk with 4 array elements, and then one chunk per - // element, and the total size of the array is - // kMockAttribute4ListLength. - EXPECT_EQ(delegate.mNumAttributeResponse, 1 + (kMockAttribute4ListLength - 4)); - EXPECT_EQ(delegate.mNumArrayItems, 6); + delegate.LogCaptures("TestReadChunking:"); + + constexpr AttributeCaptureAssertion kExpectedResponses[] = { + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 4), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + }; + ASSERT_TRUE(delegate.CapturesMatchExactly(chip::Span(kExpectedResponses))); EXPECT_TRUE(delegate.mGotReport); EXPECT_FALSE(delegate.mReadError); // By now we should have closed all exchanges and sent all pending acks, so @@ -2627,33 +2823,154 @@ void TestReadInteraction::TestSubscribeWildcard() // Mock attribute storage that is reset and resides in src/app/util/mock/attribute-storage.cpp // has the following items: // - Endpoint 0xFFFE - // - cluster 0xFFF1'FC01 (2 attributes) - // - cluster 0xFFF1'FC02 (3 attributes) + // - cluster 0xFFF1'FC01 (2 attributes + 3 GlobalNotInMetadata) + // - cluster 0xFFF1'FC02 (3 attributes + 3 GlobalNotInMetadata) // - Endpoint 0xFFFD - // - cluster 0xFFF1'FC01 (2 attributes) - // - cluster 0xFFF1'FC02 (4 attributes) - // - cluster 0xFFF1'FC03 (5 attributes) + // - cluster 0xFFF1'FC01 (2 attributes + 3 GlobalNotInMetadata) + // - cluster 0xFFF1'FC02 (4 attributes + 3 GlobalNotInMetadata) + // - cluster 0xFFF1'FC03 (5 attributes + 3 GlobalNotInMetadata) // - Endpoint 0xFFFC - // - cluster 0xFFF1'FC01 (3 attributes) - // - cluster 0xFFF1'FC02 (6 attributes) - // - cluster 0xFFF1'FC03 (2 attributes) - // - cluster 0xFFF1'FC04 (2 attributes) + // - cluster 0xFFF1'FC01 (3 attributes + 3 GlobalNotInMetadata) + // - cluster 0xFFF1'FC02 (6 attributes + 3 GlobalNotInMetadata) + // - cluster 0xFFF1'FC03 (2 attributes + 3 GlobalNotInMetadata) + // - cluster 0xFFF1'FC04 (2 attributes + 3 GlobalNotInMetadata) // - // For at total of 29 attributes. There are two wildcard subscription - // paths, for a total of 58 attributes. // + // Actual chunk placement is execution defined, however generally // Attribute 0xFFFC::0xFFF1'FC02::0xFFF1'0004 (kMockEndpoint3::MockClusterId(2)::MockAttributeId(4)) - // is a list of kMockAttribute4ListLength elements of size 256 bytes each, which cannot fit in a single - // packet, so gets list chunking applied to it. + // is a list of kMockAttribute4ListLength of size 256 bytes each, which cannot fit + // in a single packet, so chunking is applied (we get a list and then individual elements as + // single items) // - // Because delegate.mNumAttributeResponse counts AttributeDataIB instances, not attributes, - // the count will depend on exactly how the list for attribute - // 0xFFFC::0xFFF1'FC02::0xFFF1'0004 is chunked. For each of the two instances of that attribute - // in the response, there will be one AttributeDataIB for the start of the list (which will include - // some number of 256-byte elements), then one AttributeDataIB for each of the remaining elements. - constexpr size_t kExpectedAttributeResponse = 29 * 2 + (kMockAttribute4ListLength - 4) + (kMockAttribute4ListLength - 4); - EXPECT_EQ((unsigned) delegate.mNumAttributeResponse, kExpectedAttributeResponse); - EXPECT_EQ(delegate.mNumArrayItems, 12); + // The assertions below expect a specific order verified as ok (updates should verify + // that the updates make sense) + + delegate.LogCaptures("TestSubscribeWildcard: initial subscription"); + + constexpr AttributeCaptureAssertion kExpectedResponses[] = { + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 6), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 7), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10003), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, AttributeList::Id, /* listSize = */ 8), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 6), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 3), + // Chunking here + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 9), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 6), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 7), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10003), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, AttributeList::Id, /* listSize = */ 8), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 6), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 3), + // Chunking here + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 9), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AttributeList::Id, /* listSize = */ 5), + }; + + ASSERT_TRUE(delegate.CapturesMatchExactly(chip::Span(kExpectedResponses))); EXPECT_EQ(engine->GetNumActiveReadHandlers(ReadHandler::InteractionType::Subscribe), 1u); ASSERT_NE(engine->ActiveHandlerAt(0), nullptr); delegate.mpReadHandler = engine->ActiveHandlerAt(0); @@ -2678,10 +2995,9 @@ void TestReadInteraction::TestSubscribeWildcard() } // Set a endpoint dirty + ChipLogProgress(NotSpecified, "Testing updates after dirty path setting"); { - delegate.mGotReport = false; - delegate.mNumAttributeResponse = 0; - delegate.mNumArrayItems = 0; + delegate.Reset(); AttributePathParams dirtyPath; dirtyPath.mEndpointId = chip::Test::kMockEndpoint3; @@ -2700,16 +3016,69 @@ void TestReadInteraction::TestSubscribeWildcard() } while (last != delegate.mNumAttributeResponse); // Mock endpoint3 has 13 attributes in total, and we subscribed twice. - // And attribute 3/2/4 is a list with 6 elements and list chunking - // is applied to it, but the way the packet boundaries fall we get two of - // its items as a single list, followed by 4 more items for one - // of our subscriptions, and 3 items as a single list followed by 3 - // more items for the other. - // - // Thus we should receive 13*2 + 4 + 3 = 33 attribute data in total. - ChipLogError(DataManagement, "RESPO: %d\n", delegate.mNumAttributeResponse); - EXPECT_EQ(delegate.mNumAttributeResponse, 33); - EXPECT_EQ(delegate.mNumArrayItems, 12); + delegate.LogCaptures("TestSubscribeWildcard: after dirty"); + constexpr AttributeCaptureAssertion kExpectedResponsesAfterDirty[] = { + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 6), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 3), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 9), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, AttributeList::Id, /* listSize = */ 6), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 2), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, AttributeList::Id, /* listSize = */ 9), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, AttributeList::Id, /* listSize = */ 5), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, GeneratedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AcceptedCommandList::Id, /* listSize = */ 0), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, AttributeList::Id, /* listSize = */ 5), + + }; + + ASSERT_TRUE(delegate.CapturesMatchExactly(chip::Span(kExpectedResponsesAfterDirty))); } } diff --git a/src/app/tests/suites/TestBasicInformation.yaml b/src/app/tests/suites/TestBasicInformation.yaml index e53b0dcee2581b..12409474236319 100644 --- a/src/app/tests/suites/TestBasicInformation.yaml +++ b/src/app/tests/suites/TestBasicInformation.yaml @@ -57,71 +57,75 @@ tests: command: "readAttribute" attribute: "AttributeList" response: - value: [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 18, - 19, - 20, - 21, - 22, - 0xFFF8, # GeneratedCommandList - 0xFFF9, # AcceptedCommandList - 0xFFFA, # EventList - 0xFFFB, # AttributeList - 0xFFFC, # FeatureMap - 0xFFFD, # ClusterRevision - ] + constraints: + python: | + return set(value) == { + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 18, + 19, + 20, + 21, + 22, + 0xFFF8, # GeneratedCommandList + 0xFFF9, # AcceptedCommandList + 0xFFFA, # EventList + 0xFFFB, # AttributeList + 0xFFFC, # FeatureMap + 0xFFFD, # ClusterRevision + } - label: "Read AttributeList value" PICS: "!PICS_EVENT_LIST_ENABLED" command: "readAttribute" attribute: "AttributeList" response: - value: [ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 18, - 19, - 20, - 21, - 22, - 0xFFF8, # GeneratedCommandList - 0xFFF9, # AcceptedCommandList - 0xFFFB, # AttributeList - 0xFFFC, # FeatureMap - 0xFFFD, # ClusterRevision - ] + constraints: + python: | + return set(value) == { + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 18, + 19, + 20, + 21, + 22, + 0xFFF8, # GeneratedCommandList + 0xFFF9, # AcceptedCommandList + 0xFFFB, # AttributeList + 0xFFFC, # FeatureMap + 0xFFFD, # ClusterRevision + } - label: "Read NodeLabel" command: "readAttribute" @@ -207,7 +211,7 @@ tests: attribute: "SpecificationVersion" response: # For now all-clusters-app has a version 1.4. - value: 0x01040000 + value: 0x01040100 - label: "Read the Max Paths Per Invoke value" command: "readAttribute" diff --git a/src/app/tests/suites/certification/Test_TC_BINFO_2_1.yaml b/src/app/tests/suites/certification/Test_TC_BINFO_2_1.yaml index 55f3666c86a517..5370cf1036c3da 100644 --- a/src/app/tests/suites/certification/Test_TC_BINFO_2_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_BINFO_2_1.yaml @@ -715,16 +715,16 @@ tests: response: value: ProductAppearancevalue + # This list should be expanded as we expand the TH to support more specification revisions - label: - "Step 62: SpecificationVersion value should in the inclusive range of - (0x01040000 to 0x0104FF00) and the lower 8 bits are set to zero." + "Step 62: SpecificationVersion value should be set to a valid Major, + Minor, and Dot version with the lower 8 bits set to zero." command: "readAttribute" attribute: "SpecificationVersion" response: saveAs: SpecificationVersionValue constraints: - minValue: 0x01040000 - maxValue: 0x0104FF00 + anyOf: [0x01040000, 0x01040100] hasMasksClear: [0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80] - label: diff --git a/src/app/tests/suites/certification/Test_TC_CADMIN_1_3.yaml b/src/app/tests/suites/certification/Test_TC_CADMIN_1_3.yaml index fbe4e2b7615d36..dd51b68fa671c3 100644 --- a/src/app/tests/suites/certification/Test_TC_CADMIN_1_3.yaml +++ b/src/app/tests/suites/certification/Test_TC_CADMIN_1_3.yaml @@ -420,8 +420,9 @@ tests: command: "WaitForMs" arguments: values: + # Wait one second longer to make sure the DUT had time to end the commissioning window - name: "ms" - value: PIXIT.CADMIN.CwDuration * 1000 + value: (PIXIT.CADMIN.CwDuration + 1 ) * 1000 - label: "Step 11: TH_CR2 reads the window status to verify the DUT_CE window diff --git a/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml b/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml index ebc658f16523b7..cedff5b8987fdd 100644 --- a/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DLOG_2_1.yaml @@ -34,18 +34,24 @@ tests: Length of TransferFileDesignator is equal to 32 characters Length of TransferFileDesignator is greater than 32 characters To send a message that mismatches the current transfer mode + + Note: + https://github.com/CHIP-Specifications/chip-test-plans/blob/master/src/cluster/logs_diagnostics.adoc#pre-conditions + 1. Execute the below commands in the interactive mode: - ./chip-tool interactive start - 2. Before running the below steps ensure that \tmp folder on the system does not contain the below files. - If they are present please delete these files: - TH_LOG_OK_NORMAL : "Length_1234567.txt" - TH_LOG_OK_FULL_LENGTH : "Length_123456789123456789123.txt" - 3. Use the below command in the all-cluster-app for setting up the diagonistics logs. - ./chip-all-clusters-app --trace_decode 1 --end_user_support_log ~/tmp/end_user_support_log.txt --network_diagnostics_log ~/tmp/nw_log.txt --crash_log ~/tmp/crash_log.txt + ./chip-tool interactive start + 2. Before running the below steps ensure that \tmp folder on the system does not contain the below files. If they are present please delete these files + TH_LOG_OK_NORMAL : "Length_1234567.txt" + TH_LOG_OK_FULL_LENGTH : "Length_123456789123456789123.txt" + 3. + NOTE : The below setting is shown for sample, DUT can be setting logs of any size. + + Use the below command in the all-cluster-app for setting up the diagonistics logs. + ./chip-all-clusters-app --trace_decode 1 --end_user_support_log ~/tmp/end_user_support_log.txt --network_diagnostics_log ~/tmp/nw_log.txt --crash_log ~/tmp/crash_log.txt The log file content can be set such that the file size can be as follows to obtain different status code from DUT: 1. end_user_support_log > 1024 bytes 2. Make sure that nw_log.txt does not exist - 3. crash_log < 1024 bytes + 3. crash_log <= 1024 bytes disabled: true - label: "Step 1: Commission DUT to TH" @@ -62,7 +68,10 @@ tests: verification: | diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_123456789123456789123.txt - On TH(chip-tool), Verify that the DUT sends SendInit message with TransferFileDesignator field set to Length_1234567891234567891 + If DUT sends SendInit message (BDX inititation happens from DUT) + SendInitMsgfromDUT = true + + On TH(chip-tool), Verify that the DUT sends SendInit message with TransferFileDesignator field set to Length_123456789123456789123.txt 1707966626.594544][10635:10638] CHIP:ATM: SendInit [1707966626.594550][10635:10638] CHIP:ATM: Proposed Transfer Control: 0x10 @@ -73,8 +82,7 @@ tests: [1707966626.594584][10635:10638] CHIP:ATM: File Designator Length: 32 [1707966626.594588][10635:10638] CHIP:ATM: File Designator: Length_123456789123456789123.txt - Note: end_user_support_log > 1024 bytes so that BDX inititation happens from DUT - SendInitMsgfromDUT = true + Else SendInitMsgfromDUT = false (DUT does not send SendInit message) disabled: true - label: @@ -82,7 +90,10 @@ tests: message to DUT" PICS: MCORE.BDX.Initiator verification: | - On chip-tool TH will send the SendAccept Message to the DUT + If SendInitMsgfromDUT = true proceed with the following validation: + + 1. Message Flow: + On chip-tool (TH): Send the SendAccept message to the DUT: [1707894873.734698][34353:34356] CHIP:ATM: Sending BDX Message [1707894873.734710][34353:34356] CHIP:ATM: SendAccept @@ -90,32 +101,58 @@ tests: [1707894873.734720][34353:34356] CHIP:ATM: Max Block Size: 1024 [1707894874.235405][34353:34356] CHIP:BDX: Got an event MsgToSend - On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with Success(0) status code to TH after receiving the SendAccept Message + On TH (chip-tool): Verify that the DUT responds with the RetrieveLogsResponse command with a Success(0) status code and LogContent field is empty + 1707894874.239127][34353:34356] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0032 Command 0x0000_0001 [1707894874.239189][34353:34356] CHIP:TOO: RetrieveLogsResponse: { [1707894874.239208][34353:34356] CHIP:TOO: status: 0 [1707894874.239219][34353:34356] CHIP:TOO: logContent: [1707894874.239227][34353:34356] CHIP:TOO: } - Check for the size of the file that was specified in the File Deginator field of the RetrieveLogsRequest Command sent to DUT and verify that the size is greater than 1024 bytes. - The file: Length_123456789123456789123.txt (as mentioned in the file designator field) is transferred to /tmp folder on the build system and the size is > 1024 bytes + 2. File Transfer Verification: + - Check the size of the file specified in the File Designator field of the RetrieveLogsRequest command. + - Confirm that the size is greater than 1024 bytes. + - Example file: Length_123456789123456789123.txt + - Verify that the file is transferred to the /tmp folder on the build system and its size is greater than 1024 bytes. - Note: The file can be stored in any location on the build system. The current SDK imlemnetstion stores the log file transferred using BDX protocol in /tmp folder. - disabled: true + Notes: + The file can be stored in any location on the build system. + The current SDK implementation stores log files transferred via the BDX protocol in the /tmp folder. + if {PICS_MCORE_DLOG_S_UTCTIMESTAMP} then verify that UTCTimeStamp is included in the RetrieveLogsResponse command + if {PICS_MCORE_DLOG_S_TIMESINCEBOOT} then verify that TimeSinceBoot is included in the RetrieveLogsResponse command - label: "Step 4: if (SendInitMsgfromDUT = false) TH does not send BDX SendAccept message to DUT" PICS: MCORE.BDX.Initiator verification: | - As SendInitMsgfromDUT = true this step is not applicable + If SendInitMsgfromDUT = false proceed with the following validation: + 1. Verification: + On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with Exhausted(1) status code to TH and LogContent field of RetrieveLogsResponse contains at most 1024 bytes + + [1725363236.448] [56032:56034] [DMG] Received Command Response Data, Endpoint=0 Cluster=0x0000_0032 Command=0x0000_0001 + [1725363236.449] [56032:56034] [TOO] Endpoint: 0 Cluster: 0x0000_0032 Command 0x0000_0001 + [1725363236.449] [56032:56034] [TOO] RetrieveLogsResponse: { + [1725363236.449] [56032:56034] [TOO] status: 1 + [1725363236.449] [56032:56034] [TOO] logContent: 3132330A + [1725363236.449] [56032:56034] [TOO] } + + OR + + On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with NoLogs(2) status code to TH and LogContent field is empty + + [1707967219.637228][10723:10726] CHIP:TOO: RetrieveLogsResponse: { + [1707967219.637242][10723:10726] CHIP:TOO: status: 2 + [1707967219.637248][10723:10726] CHIP:TOO: logContent: + [1707967219.637253][10723:10726] CHIP:TOO: } disabled: true - label: "Step 5: Repeat Steps from 2 to 4 by setting Intent field to NetworkDiag and CrashLogs" verification: | - + Repeat Steps from 2 to 4 by setting Intent field to + NetworkDiag CrashLogs as shown below in steps 2a to 4b disabled: true - label: @@ -129,8 +166,20 @@ tests: diagnosticlogs retrieve-logs-request 1 1 1 0 --TransferFileDesignator Length_123456789123456789123.txt - Note: nw_log does not exist and DUT does not initiate the BDX transfer - SendInitMsgfromDUT = false + If DUT sends SendInit message (BDX inititation happens from DUT) SendInitMsgfromDUT = true + + On TH(chip-tool), Verify that the DUT sends SendInit message with TransferFileDesignator field set to Length_123456789123456789123.txt + + 1707966626.594544][10635:10638] CHIP:ATM: SendInit + [1707966626.594550][10635:10638] CHIP:ATM: Proposed Transfer Control: 0x10 + [1707966626.594558][10635:10638] CHIP:ATM: Range Control: 0x0 + [1707966626.594563][10635:10638] CHIP:ATM: Proposed Max Block Size: 1024 + [1707966626.594569][10635:10638] CHIP:ATM: Start Offset: 0x0000000000000000 + [1707966626.594577][10635:10638] CHIP:ATM: Proposed Max Length: 0x0000000000000000 + [1707966626.594584][10635:10638] CHIP:ATM: File Designator Length: 32 + [1707966626.594588][10635:10638] CHIP:ATM: File Designator: Length_123456789123456789123.txt + + Else SendInitMsgfromDUT = false (DUT does not send SendInit message) disabled: true - label: @@ -138,7 +187,35 @@ tests: message to DUT" PICS: MCORE.BDX.Initiator verification: | - SendInitMsgfromDUT = false this step is not applicable + If SendInitMsgfromDUT = true proceed with the following validation: + + 1. Message Flow: + On chip-tool (TH): Send the SendAccept message to the DUT: + [1707894873.734698][34353:34356] CHIP:ATM: Sending BDX Message + [1707894873.734710][34353:34356] CHIP:ATM: SendAccept + [1707894873.734715][34353:34356] CHIP:ATM: Transfer Control: 0x10 + [1707894873.734720][34353:34356] CHIP:ATM: Max Block Size: 1024 + [1707894874.235405][34353:34356] CHIP:BDX: Got an event MsgToSend + + On TH (chip-tool): Verify that the DUT responds with the RetrieveLogsResponse command with a Success(0) status code and LogContent field is empty: + + 1707894874.239127][34353:34356] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0032 Command 0x0000_0001 + [1707894874.239189][34353:34356] CHIP:TOO: RetrieveLogsResponse: { + [1707894874.239208][34353:34356] CHIP:TOO: status: 0 + [1707894874.239219][34353:34356] CHIP:TOO: logContent: + [1707894874.239227][34353:34356] CHIP:TOO: } + + 2. File Transfer Verification: + - Check the size of the file specified in the File Designator field of the RetrieveLogsRequest command. + - Confirm that the size is greater than 1024 bytes. + - Example file: Length_123456789123456789123.txt + - Verify that the file is transferred to the /tmp folder on the build system and its size is greater than 1024 bytes. + + Notes: + The file can be stored in any location on the build system. + The current SDK implementation stores log files transferred via the BDX protocol in the /tmp folder. + if {PICS_MCORE_DLOG_S_UTCTIMESTAMP} then verify that UTCTimeStamp is included in the RetrieveLogsResponse command + if {PICS_MCORE_DLOG_S_TIMESINCEBOOT} then verify that TimeSinceBoot is included in the RetrieveLogsResponse command disabled: true - label: @@ -146,6 +223,20 @@ tests: SendAccept message to DUT" PICS: MCORE.BDX.Initiator verification: | + If SendInitMsgfromDUT = false proceed with the following validation: + + 1. Verification: + On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with Exhausted(1) status code to TH and LogContent field of RetrieveLogsResponse contains at most 1024 bytes + + [1725363236.448] [56032:56034] [DMG] Received Command Response Data, Endpoint=0 Cluster=0x0000_0032 Command=0x0000_0001 + [1725363236.449] [56032:56034] [TOO] Endpoint: 0 Cluster: 0x0000_0032 Command 0x0000_0001 + [1725363236.449] [56032:56034] [TOO] RetrieveLogsResponse: { + [1725363236.449] [56032:56034] [TOO] status: 1 + [1725363236.449] [56032:56034] [TOO] logContent: 3132330A + [1725363236.449] [56032:56034] [TOO] } + + OR + On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with NoLogs(2) status code to TH and LogContent field is empty [1707967219.637228][10723:10726] CHIP:TOO: RetrieveLogsResponse: { @@ -165,8 +256,21 @@ tests: diagnosticlogs retrieve-logs-request 2 1 1 0 --TransferFileDesignator Length_123456789123456789123.txt - Note: crash_log < 1024 Bytes and DUT does not inittiate the BDX transfer - SendInitMsgfromDUT = false + If DUT sends SendInit message (BDX inititation happens from DUT) + SendInitMsgfromDUT = true + + On TH(chip-tool), Verify that the DUT sends SendInit message with TransferFileDesignator field set to Length_123456789123456789123.txt + + 1707966626.594544][10635:10638] CHIP:ATM: SendInit + [1707966626.594550][10635:10638] CHIP:ATM: Proposed Transfer Control: 0x10 + [1707966626.594558][10635:10638] CHIP:ATM: Range Control: 0x0 + [1707966626.594563][10635:10638] CHIP:ATM: Proposed Max Block Size: 1024 + [1707966626.594569][10635:10638] CHIP:ATM: Start Offset: 0x0000000000000000 + [1707966626.594577][10635:10638] CHIP:ATM: Proposed Max Length: 0x0000000000000000 + [1707966626.594584][10635:10638] CHIP:ATM: File Designator Length: 32 + [1707966626.594588][10635:10638] CHIP:ATM: File Designator: Length_123456789123456789123.txt + + Else SendInitMsgfromDUT = false (DUT does not send SendInit message) disabled: true - label: @@ -174,7 +278,36 @@ tests: message to DUT" PICS: MCORE.BDX.Initiator verification: | - SendInitMsgfromDUT = false this step is not applicable + If SendInitMsgfromDUT = true proceed with the following validation: + + 1. Message Flow: + On chip-tool (TH): Send the SendAccept message to the DUT: + + [1707894873.734698][34353:34356] CHIP:ATM: Sending BDX Message + [1707894873.734710][34353:34356] CHIP:ATM: SendAccept + [1707894873.734715][34353:34356] CHIP:ATM: Transfer Control: 0x10 + [1707894873.734720][34353:34356] CHIP:ATM: Max Block Size: 1024 + [1707894874.235405][34353:34356] CHIP:BDX: Got an event MsgToSend + + On TH (chip-tool): Verify that the DUT responds with the RetrieveLogsResponse command with a Success(0) status code and LogContent field is empty: + + 1707894874.239127][34353:34356] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0032 Command 0x0000_0001 + [1707894874.239189][34353:34356] CHIP:TOO: RetrieveLogsResponse: { + [1707894874.239208][34353:34356] CHIP:TOO: status: 0 + [1707894874.239219][34353:34356] CHIP:TOO: logContent: + [1707894874.239227][34353:34356] CHIP:TOO: } + + 2. File Transfer Verification: + - Check the size of the file specified in the File Designator field of the RetrieveLogsRequest command. + - Confirm that the size is greater than 1024 bytes. + - Example file: Length_123456789123456789123.txt + - Verify that the file is transferred to the /tmp folder on the build system and its size is greater than 1024 bytes. + + Notes: + The file can be stored in any location on the build system. + The current SDK implementation stores log files transferred via the BDX protocol in the /tmp folder. + if {PICS_MCORE_DLOG_S_UTCTIMESTAMP} then verify that UTCTimeStamp is included in the RetrieveLogsResponse command + if {PICS_MCORE_DLOG_S_TIMESINCEBOOT} then verify that TimeSinceBoot is included in the RetrieveLogsResponse command disabled: true - label: @@ -182,14 +315,26 @@ tests: SendAccept message to DUT" PICS: MCORE.BDX.Initiator verification: | + If SendInitMsgfromDUT = false proceed with the following validation: + + 1. Verification: On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with Exhausted(1) status code to TH and LogContent field of RetrieveLogsResponse contains at most 1024 bytes - 1707894938.009997][34371:34374] CHIP:TOO: RetrieveLogsResponse: { - [1707894938.010025][34371:34374] CHIP:TOO: status: 1 - [1707894938.010057][34371:34374] CHIP:TOO: logContent: RetrieveLogsResponse: { - [1707967525.484222][10866:10869] CHIP:TOO: status: 1 - [1707967525.484229][10866:10869] CHIP:TOO: logContent: 353535350A - [1707967525.484233][10866:10869] CHIP:TOO: } + [1725363236.448] [56032:56034] [DMG] Received Command Response Data, Endpoint=0 Cluster=0x0000_0032 Command=0x0000_0001 + [1725363236.449] [56032:56034] [TOO] Endpoint: 0 Cluster: 0x0000_0032 Command 0x0000_0001 + [1725363236.449] [56032:56034] [TOO] RetrieveLogsResponse: { + [1725363236.449] [56032:56034] [TOO] status: 1 + [1725363236.449] [56032:56034] [TOO] logContent: 3132330A + [1725363236.449] [56032:56034] [TOO] } + + OR + + On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with NoLogs(2) status code to TH and LogContent field is empty + + [1707967219.637228][10723:10726] CHIP:TOO: RetrieveLogsResponse: { + [1707967219.637242][10723:10726] CHIP:TOO: status: 2 + [1707967219.637248][10723:10726] CHIP:TOO: logContent: + [1707967219.637253][10723:10726] CHIP:TOO: } disabled: true - label: @@ -201,7 +346,10 @@ tests: verification: | diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567.txt - On TH(chip-tool), Verify that the DUT sends SendInit message with TransferFileDesignator field set to Length_1234567891234567891 + If DUT sends SendInit message (BDX inititation happens from DUT) + SendInitMsgfromDUT = true + + On TH(chip-tool), Verify that the DUT sends SendInit message with TransferFileDesignator field set to Length_1234567.txt [1707967645.770994][10882:10885] CHIP:ATM: SendInit [1707967645.770997][10882:10885] CHIP:ATM: Proposed Transfer Control: 0x10 [1707967645.771001][10882:10885] CHIP:ATM: Range Control: 0x0 @@ -211,8 +359,7 @@ tests: [1707967645.771014][10882:10885] CHIP:ATM: File Designator Length: 18 [1707967645.771018][10882:10885] CHIP:ATM: File Designator: Length_1234567.txt - Note: end_user_support_log > 1024 bytes so that BDX inititation happens from DUT - SendInitMsgfromDUT = true" + Else SendInitMsgfromDUT = false (DUT does not send SendInit message) disabled: true - label: @@ -221,7 +368,14 @@ tests: TH_LOG_ERROR_TRANSFER_METHOD_NOT_SUPPORTED) to DUT" PICS: MCORE.BDX.Initiator verification: | - Not Verifiable. This step requires additional API for error injection.(Not available in the Chip-tool) + Note : Not Verifiable. This step requires additional API for error injection.(Not available in the Chip-tool) + + if (SendInitMsgfromDUT = true) , On TH(chip-tool), verify that the DUT responds by sending RetrieveLogsResponse Command with Status field set to Denied(4) + + [1707967219.637228][10723:10726] CHIP:TOO: RetrieveLogsResponse: { + [1707967219.637242][10723:10726] CHIP:TOO: status: 4 + [1707967219.637248][10723:10726] CHIP:TOO: logContent: + [1707967219.637253][10723:10726] CHIP:TOO: } disabled: true - label: @@ -235,29 +389,23 @@ tests: On TH(chip-tool), Verify that the DUT responds with Success(0) status code for the RetrieveLogsResponse command Verify that LogContent field contains at most 1024 bytes + RetrieveLogsResponse: { [1707901602.742523][36080:36083] CHIP:TOO: status: 0 [1707901602.742542][36080:36083] CHIP:TOO: logContent: 31353238303033363031313533353030333730303234303030303234303133653234303230313138333530313331303034373032313533313031316230323330383230323137303630393261383634383836663730643031303730326130383230323038333038323032303430323031303333313064333030623036303936303836343830313635303330343032303133303832303137303036303932613836343838366637306430313037303161303832303136313034383230313564313532343030303132353031663166663336303230353030383030353031383030353032383030353033383030353034383030353035383030353036383030353037383030353038383030353039383030353061383030353062383030353063383030353064383030353065383030353066383030353130383030353131383030353132383030353133383030353134383030353135383030353136383030353137383030353138383030353139383030353161383030353162383030353163383030353164383030353165383030353166383030353230383030353231383030353232383030353233383030353234383030353235383030353236383030353237383030353238383030353239383030353261383030353262383030353263383030353264383030353265383030353266383030353330383030353331383030353332383030353333383030353334383030353335383030353336383030353337383030353338383030353339383030353361383030353362383030353363383030353364383030353365383030353366383030353430383030353431383030353432383030353433383030353434383030353435383030353436383030353437383030353438383030353439383030353461383030353462383030353463383030353464383030353465383030353466383030353530383030353531383030353532383030353533383030353534383030353535383030353536383030353537383030353538383030353539383030353561383030353562383030353563383030353564383030353565383030353566383030353630383030353631383030353632383030353633383031383234303331363263303431333433353334313330333033303330333035333537343333303330333033303330326433303330323430353030323430363030323430373031323430383030313833313763333037613032303130333830313466653334336639353939343737363362363165653435333931333133333834393466653637643865333030623036303936303836343830633733653461363039363038363438303630393630383634383036303936303836343830363039363038363438303630393630383634383036303936303836 - Repeat this setp by setting Intent filed to NetworkDiag - diagnosticlogs retrieve-logs-request 1 0 1 0 - - On TH(chip-tool), verify that the DUT responds with NoLogs(2) status code to TH for the RetrieveLogsResponse command and LogContent field is empty + else if DUT responds with NoLogs(2) status code verify that LogContent field is empty [1707967219.637228][10723:10726] CHIP:TOO: RetrieveLogsResponse: { [1707967219.637242][10723:10726] CHIP:TOO: status: 2 [1707967219.637248][10723:10726] CHIP:TOO: logContent: [1707967219.637253][10723:10726] CHIP:TOO: } - Repeat this setp by setting Intent filed to Crash_log - diagnosticlogs retrieve-logs-request 2 0 1 0 - - On TH(chip-tool), verify that the DUT responds with success(0) status code to TH for the RetrieveLogsResponse command and LogContent field of RetrieveLogsResponse contains at most 1024 bytes + Repeat this step by setting Intent field to NetworkDiag by giving following command : + diagnosticlogs retrieve-logs-request 1 0 1 0 - [1707982645.639415][11765:11767] CHIP:TOO: RetrieveLogsResponse: { - [1707982645.639457][11765:11767] CHIP:TOO: status: 0 - [1707982645.639489][11765:11767] CHIP:TOO: logContent: logContent: 353535350A - }" + Repeat this step by setting Intent field to CrashLogs by giving following command : + diagnosticlogs retrieve-logs-request 2 0 1 0 disabled: true - label: @@ -270,6 +418,7 @@ tests: On TH(chip-tool), Verify that the DUT responds with INVALID_COMMAND for the RetrieveLogsRequest that was sent without TransferFileDesignator + [1707924172.241489][42120:42123] CHIP:DMG: InvokeResponseIB = [1707924172.241494][42120:42123] CHIP:DMG: { [1707924172.241497][42120:42123] CHIP:DMG: CommandStatusIB = @@ -293,7 +442,7 @@ tests: [1707924172.241573][42120:42123] CHIP:DMG: ], [1707924172.241577][42120:42123] CHIP:DMG: [1707924172.241579][42120:42123] CHIP:DMG: InteractionModelRevision = 11 - [1707924172.241582][42120:42123] CHIP:DMG: }," + [1707924172.241582][42120:42123] CHIP:DMG: }, disabled: true - label: @@ -306,9 +455,18 @@ tests: On TH(chip-tool), Verify that the DUT responds with Exhausted(1) status code for the RetrieveLogsResponse command with the LogContent field containing at most 1024 bytes - [1707979121.749537][7593:7596] CHIP:TOO: RetrieveLogsResponse: { - [1707979121.749565][7593:7596] CHIP:TOO: status: 1 - [1707979121.749593][7593:7596] CHIP:TOO: logContent: 31353238303033363031313533353030333730303234303030303234303133653234303230313138333530313331303034373032313533313031316230323330383230323137303630393261383634383836663730643031303730326130383230323038333038323032303430323031303333313064333030623036303936303836343830313635303330343032303133303832303137303036303932613836343838366637306430313037303161303832303136313034383230313564313532343030303132353031663166663336303230353030383030353031383030353032383030353033383030353034383030353035383030353036383030353037383030353038383030353039383030353061383030353062383030353063383030353064383030353065383030353066383030353130383030353131383030353132383030353133383030353134383030353135383030353136383030353137383030353138383030353139383030353161383030353162383030353163383030353164383030353165383030353166383030353230383030353231383030353232383030353233383030353234383030353235383030353236383030353237383030353238383030353239383030353261383030353262383030353263383030353264383030353265383030353266383030353330383030353331383030353332383030353333383030353334383030353335383030353336383030353337383030353338383030353339383030353361383030353362383030353363383030353364383030353365383030353366383030353430383030353431383030353432383030353433383030353434383030353435383030353436383030353437383030353438383030353439383030353461383030353462383030353463383030353464383030353465383030353466383030353530383030353531383030353532383030353533383030353534383030353535383030353536383030353537383030353538383030353539383030353561383030353562383030353563383030353564383030353565383030353566383030353630383030353631383030353632383030353633383031383234303331363263303431333433353334313330333033303330333035333537343333303330333033303330326433303330323430353030323430363030323430373031323430383030313833313763333037613032303130333830313466653334336639353939343737363362363165653435333931333133333834393466653637643865333030623036303936303836343830633733653461363039363038363438303630393630383634383036303936303836343830363039363038363438303630393630383634383036303936303836}" + + RetrieveLogsResponse: { + [1707901602.742523][36080:36083] CHIP:TOO: status: 1 + [1707901602.742542][36080:36083] CHIP:TOO: logContent: 31353238303033363031313533353030333730303234303030303234303133653234303230313138333530313331303034373032313533313031316230323330383230323137303630393261383634383836663730643031303730326130383230323038333038323032303430323031303333313064333030623036303936303836343830313635303330343032303133303832303137303036303932613836343838366637306430313037303161303832303136313034383230313564313532343030303132353031663166663336303230353030383030353031383030353032383030353033383030353034383030353035383030353036383030353037383030353038383030353039383030353061383030353062383030353063383030353064383030353065383030353066383030353130383030353131383030353132383030353133383030353134383030353135383030353136383030353137383030353138383030353139383030353161383030353162383030353163383030353164383030353165383030353166383030353230383030353231383030353232383030353233383030353234383030353235383030353236383030353237383030353238383030353239383030353261383030353262383030353263383030353264383030353265383030353266383030353330383030353331383030353332383030353333383030353334383030353335383030353336383030353337383030353338383030353339383030353361383030353362383030353363383030353364383030353365383030353366383030353430383030353431383030353432383030353433383030353434383030353435383030353436383030353437383030353438383030353439383030353461383030353462383030353463383030353464383030353465383030353466383030353530383030353531383030353532383030353533383030353534383030353535383030353536383030353537383030353538383030353539383030353561383030353562383030353563383030353564383030353565383030353566383030353630383030353631383030353632383030353633383031383234303331363263303431333433353334313330333033303330333035333537343333303330333033303330326433303330323430353030323430363030323430373031323430383030313833313763333037613032303130333830313466653334336639353939343737363362363165653435333931333133333834393466653637643865333030623036303936303836343830633733653461363039363038363438303630393630383634383036303936303836343830363039363038363438303630393630383634383036303936303836 + + else if DUT responds with NoLogs(2) status code verify that LogContent field is empty + + [1707967219.637228][10723:10726] CHIP:TOO: RetrieveLogsResponse: { + [1707967219.637242][10723:10726] CHIP:TOO: status: 2 + [1707967219.637248][10723:10726] CHIP:TOO: logContent: + [1707967219.637253][10723:10726] CHIP:TOO: } + disabled: true - label: @@ -331,7 +489,9 @@ tests: Repeat this step by setting RequestedProtocol as ResponsePayload : diagnosticlogs retrieve-logs-request 3 1 1 0 --TransferFileDesignator Length_1234567.txt + On TH(chip-tool), Verify that the DUT responds with INVALID_COMMAND for the RetrieveLogsRequest that was sent invalid Intent(3) + [1707901794.468552][36124:36127] CHIP:DMG: StatusIB = [1707901794.468560][36124:36127] CHIP:DMG: { [1707901794.468569][36124:36127] CHIP:DMG: status = 0x85 (INVALID_COMMAND), @@ -374,7 +534,7 @@ tests: [1707901794.468608][36124:36127] CHIP:DMG: }, [1707901794.468619][36124:36127] CHIP:DMG: [1707901794.468624][36124:36127] CHIP:DMG: ], - [1707901794.468635][36124:36127] CHIP:DMG:" + [1707901794.468635][36124:36127] CHIP:DMG: disabled: true - label: @@ -385,7 +545,25 @@ tests: PICS: MCORE.BDX.Initiator verification: | diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator '' - On TH(chip-tool), Verify that DUT sends RetrieveLogsResponse command to TH with Denied(4) status code. + + On TH(chip-tool), Verify that DUT sends RetrieveLogsResponse command to TH with with Exhausted(1) status code then verify that LogContent field contains at most 1024 bytes + + [1725363236.448] [56032:56034] [DMG] Received Command Response Data, Endpoint=0 Cluster=0x0000_0032 Command=0x0000_0001 + [1725363236.449] [56032:56034] [TOO] Endpoint: 0 Cluster: 0x0000_0032 Command 0x0000_0001 + [1725363236.449] [56032:56034] [TOO] RetrieveLogsResponse: { + [1725363236.449] [56032:56034] [TOO] status: 1 + [1725363236.449] [56032:56034] [TOO] logContent: 3132330A + [1725363236.449] [56032:56034] [TOO] } + + else if DUT responds with NoLogs(2) status code verify that LogContent field is empty + + [1707967219.637228][10723:10726] CHIP:TOO: RetrieveLogsResponse: { + [1707967219.637242][10723:10726] CHIP:TOO: status: 2 + [1707967219.637248][10723:10726] CHIP:TOO: logContent: + [1707967219.637253][10723:10726] CHIP:TOO: } + + else if DUT responds with NoLogs(4) status code verify that LogContent field is empty + [1719990173.360981][8053:8056] CHIP:TOO: RetrieveLogsResponse: { [1719990173.361009][8053:8056] CHIP:TOO: status: 4 [1719990173.361021][8053:8056] CHIP:TOO: logContent: @@ -400,7 +578,8 @@ tests: verification: | diagnosticlogs retrieve-logs-request 0 1 1 0 --TransferFileDesignator Length_1234567891234567891234567891212345.txt - On TH(chip-tool), Verify that the DUT responds with CONSTRAINT_ERROR for the RetrieveLogsRequest that was sent Invalid Invalid TransferFileDesignator length(> 32) + On TH(chip-tool), Verify that the DUT responds with CONSTRAINT_ERROR for the RetrieveLogsRequest that was sent Invalid TransferFileDesignator length(> 32) + [1707904517.151453][36678:36681] CHIP:DMG: ICR moving to [ResponseRe] [1707904517.151489][36678:36681] CHIP:DMG: InvokeResponseMessage = @@ -431,5 +610,5 @@ tests: [1707904517.151798][36678:36681] CHIP:DMG: ], [1707904517.151816][36678:36681] CHIP:DMG: [1707904517.151824][36678:36681] CHIP:DMG: InteractionModelRevision = 11 - [1707904517.151830][36678:36681] CHIP:DMG: }," + [1707904517.151830][36678:36681] CHIP:DMG: }, disabled: true diff --git a/src/app/tests/suites/certification/Test_TC_FLABEL_2_1.yaml b/src/app/tests/suites/certification/Test_TC_FLABEL_2_1.yaml deleted file mode 100644 index 917e5d6017fc6f..00000000000000 --- a/src/app/tests/suites/certification/Test_TC_FLABEL_2_1.yaml +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2021 Project CHIP Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# Auto-generated scripts for harness use only, please review before automation. The endpoints and cluster names are currently set to default - -name: 98.2.1. [TC-FLABEL-2.1] Fixed Label cluster [DUT-server] - -PICS: - - FLABEL.S - -config: - nodeId: 0x12344321 - cluster: "Fixed Label" - endpoint: 1 - -tests: - - label: "Commission DUT to TH" - cluster: "DelayCommands" - command: "WaitForCommissionee" - arguments: - values: - - name: "nodeId" - value: nodeId - - - label: "Step 1: TH reads LabelList from the DUT" - PICS: FLABEL.S.A0000 - command: "readAttribute" - attribute: "LabelList" - response: - constraints: - type: list - - - label: - "Step 2: TH tries to write LabelList attribute of the DUT by setting - Label = Test_Label, Value= Test_Value" - PICS: FLABEL.S.A0000 - command: "writeAttribute" - attribute: "LabelList" - arguments: - value: [{ Label: "Test_Label", Value: "Test_Value" }] - response: - error: UNSUPPORTED_WRITE - - - label: "Step 3: TH reads LabelList from the DUT" - verification: | - ./chip-tool fixedlabel read label-list 1 0 - Verify that the LabelList value is same as value from step 1 On TH(all-clusters-app) : - - [1651124649.820293][2819:2824] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0040 Attribute 0x0000_0000 DataVersion: 3688229931 - [1651124649.820478][2819:2824] CHIP:TOO: LabelList: 4 entries - [1651124649.820534][2819:2824] CHIP:TOO: [1]: { - [1651124649.820570][2819:2824] CHIP:TOO: Label: room - [1651124649.820602][2819:2824] CHIP:TOO: Value: bedroom 2 - [1651124649.820636][2819:2824] CHIP:TOO: } - [1651124649.820676][2819:2824] CHIP:TOO: [2]: { - [1651124649.820709][2819:2824] CHIP:TOO: Label: orientation - [1651124649.820741][2819:2824] CHIP:TOO: Value: North - [1651124649.820773][2819:2824] CHIP:TOO: } - [1651124649.820812][2819:2824] CHIP:TOO: [3]: { - [1651124649.820845][2819:2824] CHIP:TOO: Label: floor - [1651124649.820875][2819:2824] CHIP:TOO: Value: 2 - [1651124649.820906][2819:2824] CHIP:TOO: } - [1651124649.820945][2819:2824] CHIP:TOO: [4]: { - [1651124649.820977][2819:2824] CHIP:TOO: Label: direction - [1651124649.821008][2819:2824] CHIP:TOO: Value: up - [1651124649.821039][2819:2824] CHIP:TOO: } - [1651124649.821193][2819:2824] CHIP:EM: Sending Standalone Ack for MessageCounter:2439070 on exchange 10798i - cluster: "LogCommands" - command: "UserPrompt" - PICS: PICS_SKIP_SAMPLE_APP && FLABEL.S.A0000 - arguments: - values: - - name: "message" - value: "Enter 'y' after success" - - name: "expectedValue" - value: "y" diff --git a/src/app/tests/suites/ciTests.json b/src/app/tests/suites/ciTests.json index bf446a38478973..9fa23f8a516aa5 100644 --- a/src/app/tests/suites/ciTests.json +++ b/src/app/tests/suites/ciTests.json @@ -57,7 +57,6 @@ "Test_TC_EEVSEM_3_3" ], "FlowMeasurement": ["Test_TC_FLW_2_1"], - "FixedLabel": ["Test_TC_FLABEL_2_1"], "FanControl": [ "Test_TC_FAN_2_1", "Test_TC_FAN_2_2", diff --git a/src/app/util/ember-global-attribute-access-interface.cpp b/src/app/util/ember-global-attribute-access-interface.cpp deleted file mode 100644 index 9878f41d45f83e..00000000000000 --- a/src/app/util/ember-global-attribute-access-interface.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2021-2024 Project CHIP Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * 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 - -namespace chip { -namespace app { -namespace Compatibility { - -CHIP_ERROR GlobalAttributeReader::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) -{ - using namespace Clusters::Globals::Attributes; - switch (aPath.mAttributeId) - { - case AttributeList::Id: - return aEncoder.EncodeList([this](const auto & encoder) { - const size_t count = mCluster->attributeCount; - bool addedExtraGlobals = false; - for (size_t i = 0; i < count; ++i) - { - AttributeId id = mCluster->attributes[i].attributeId; - constexpr auto lastGlobalId = GlobalAttributesNotInMetadata[ArraySize(GlobalAttributesNotInMetadata) - 1]; - // If EventList is not supported. The GlobalAttributesNotInMetadata is missing one id here. - static_assert(lastGlobalId - GlobalAttributesNotInMetadata[0] == ArraySize(GlobalAttributesNotInMetadata), - "Ids in GlobalAttributesNotInMetadata not consecutive (except EventList)"); - if (!addedExtraGlobals && id > lastGlobalId) - { - for (const auto & globalId : GlobalAttributesNotInMetadata) - { - ReturnErrorOnFailure(encoder.Encode(globalId)); - } - addedExtraGlobals = true; - } - ReturnErrorOnFailure(encoder.Encode(id)); - } - if (!addedExtraGlobals) - { - for (const auto & globalId : GlobalAttributesNotInMetadata) - { - ReturnErrorOnFailure(encoder.Encode(globalId)); - } - } - return CHIP_NO_ERROR; - }); - case AcceptedCommandList::Id: - return EncodeCommandList(aPath, aEncoder, &CommandHandlerInterface::EnumerateAcceptedCommands, - mCluster->acceptedCommandList); - case GeneratedCommandList::Id: - return EncodeCommandList(aPath, aEncoder, &CommandHandlerInterface::EnumerateGeneratedCommands, - mCluster->generatedCommandList); - default: - // This function is only called if attributeCluster is non-null in - // ReadSingleClusterData, which only happens for attributes listed in - // GlobalAttributesNotInMetadata. If we reach this code, someone added - // a global attribute to that list but not the above switch. - VerifyOrDieWithMsg(false, DataManagement, "Unexpected global attribute: " ChipLogFormatMEI, - ChipLogValueMEI(aPath.mAttributeId)); - return CHIP_NO_ERROR; - } -} - -CHIP_ERROR GlobalAttributeReader::EncodeCommandList(const ConcreteClusterPath & aClusterPath, AttributeValueEncoder & aEncoder, - GlobalAttributeReader::CommandListEnumerator aEnumerator, - const CommandId * aClusterCommandList) -{ - return aEncoder.EncodeList([&](const auto & encoder) { - auto * commandHandler = - CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(aClusterPath.mEndpointId, aClusterPath.mClusterId); - if (commandHandler) - { - struct Context - { - decltype(encoder) & commandIdEncoder; - CHIP_ERROR err; - } context{ encoder, CHIP_NO_ERROR }; - CHIP_ERROR err = (commandHandler->*aEnumerator)( - aClusterPath, - [](CommandId command, void * closure) -> Loop { - auto * ctx = static_cast(closure); - ctx->err = ctx->commandIdEncoder.Encode(command); - if (ctx->err != CHIP_NO_ERROR) - { - return Loop::Break; - } - return Loop::Continue; - }, - &context); - if (err != CHIP_ERROR_NOT_IMPLEMENTED) - { - return context.err; - } - // Else fall through to the list in aClusterCommandList. - } - - for (const CommandId * cmd = aClusterCommandList; cmd != nullptr && *cmd != kInvalidCommandId; cmd++) - { - ReturnErrorOnFailure(encoder.Encode(*cmd)); - } - return CHIP_NO_ERROR; - }); -} - -} // namespace Compatibility -} // namespace app -} // namespace chip diff --git a/src/app/util/ember-global-attribute-access-interface.h b/src/app/util/ember-global-attribute-access-interface.h deleted file mode 100644 index d17e1b286dbd81..00000000000000 --- a/src/app/util/ember-global-attribute-access-interface.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2021-2024 Project CHIP Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * 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 app { -namespace Compatibility { - -// This reader should never actually be registered; we do manual dispatch to it -// for the one attribute it handles. -class MandatoryGlobalAttributeReader : public AttributeAccessInterface -{ -public: - MandatoryGlobalAttributeReader(const EmberAfCluster * aCluster) : - AttributeAccessInterface(MakeOptional(kInvalidEndpointId), kInvalidClusterId), mCluster(aCluster) - {} - -protected: - const EmberAfCluster * mCluster; -}; - -class GlobalAttributeReader : public MandatoryGlobalAttributeReader -{ -public: - GlobalAttributeReader(const EmberAfCluster * aCluster) : MandatoryGlobalAttributeReader(aCluster) {} - - CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override; - -private: - typedef CHIP_ERROR (CommandHandlerInterface::*CommandListEnumerator)(const ConcreteClusterPath & cluster, - CommandHandlerInterface::CommandIdCallback callback, - void * context); - static CHIP_ERROR EncodeCommandList(const ConcreteClusterPath & aClusterPath, AttributeValueEncoder & aEncoder, - CommandListEnumerator aEnumerator, const CommandId * aClusterCommandList); -}; - -} // namespace Compatibility -} // namespace app -} // namespace chip diff --git a/src/app/util/mock/BUILD.gn b/src/app/util/mock/BUILD.gn index 5147b447f2c72a..c7fd8cc48080ee 100644 --- a/src/app/util/mock/BUILD.gn +++ b/src/app/util/mock/BUILD.gn @@ -49,7 +49,6 @@ source_set("mock_codegen_data_model") { public_deps = codegen_data_model_PUBLIC_DEPS sources += [ - "${chip_root}/src/app/util/ember-global-attribute-access-interface.cpp", "${chip_root}/src/app/util/ember-io-storage.cpp", "CodegenEmberMocks.cpp", ] diff --git a/src/controller/data_model/controller-clusters.zap b/src/controller/data_model/controller-clusters.zap index 8c1eba99077039..87ef155a4bc0a2 100644 --- a/src/controller/data_model/controller-clusters.zap +++ b/src/controller/data_model/controller-clusters.zap @@ -1,6 +1,6 @@ { "fileFormat": 2, - "featureLevel": 103, + "featureLevel": 106, "creator": "zap", "keyValuePairs": [ { @@ -41,14 +41,16 @@ "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 }, "deviceTypes": [ { "code": 22, "profileId": 259, "label": "MA-rootdevice", - "name": "MA-rootdevice" + "name": "MA-rootdevice", + "deviceTypeOrder": 0 } ], "deviceVersions": [ diff --git a/src/controller/java/AndroidDeviceControllerWrapper.cpp b/src/controller/java/AndroidDeviceControllerWrapper.cpp index a08d3993362e63..577a7a8491a190 100644 --- a/src/controller/java/AndroidDeviceControllerWrapper.cpp +++ b/src/controller/java/AndroidDeviceControllerWrapper.cpp @@ -159,6 +159,9 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( chip::Credentials::SetDeviceAttestationVerifier(GetDefaultDACVerifier(testingRootStore)); } + // Because garbage collection may delay the removal of old controller instances, two instances could temporarily exist. + // To avoid issues with the shared ICD client storage, reset the storage before creating a new controller. + getICDClientStorage()->Shutdown(); *errInfoOnFailure = getICDClientStorage()->Init(wrapperStorage, &wrapper->mSessionKeystore); if (*errInfoOnFailure != CHIP_NO_ERROR) { diff --git a/src/controller/java/AndroidLogDownloadFromNode.cpp b/src/controller/java/AndroidLogDownloadFromNode.cpp index 785567476fc125..f439cd64d881fe 100644 --- a/src/controller/java/AndroidLogDownloadFromNode.cpp +++ b/src/controller/java/AndroidLogDownloadFromNode.cpp @@ -152,7 +152,7 @@ void AndroidLogDownloadFromNode::OnResponseRetrieveLogs(void * context, using namespace chip::app::Clusters::DiagnosticLogs; if (data.status == StatusEnum::kSuccess) { - ChipLogProgress(Controller, "Success. Will receive log from BDX protocol.") + ChipLogProgress(Controller, "Success. Will receive log from BDX protocol."); } else if (data.status == StatusEnum::kExhausted) { @@ -210,8 +210,8 @@ void AndroidLogDownloadFromNode::FinishLogDownloadFromNode(void * context, CHIP_ JniLocalReferenceScope scope(env); jobject jCallback = self->mJavaCallback.ObjectRef(); - jint jFabricIndex = self->mController->GetFabricIndex(); - jlong jremoteNodeId = self->mRemoteNodeId; + jint jFabricIndex = static_cast(self->mController->GetFabricIndex()); + jlong jremoteNodeId = static_cast(self->mRemoteNodeId); VerifyOrExit(env != nullptr, ChipLogError(Controller, "Could not get JNIEnv for current thread")); @@ -274,7 +274,8 @@ void AndroidLogDownloadFromNode::OnTransferCallback(FabricIndex fabricIndex, Nod if (ret != JNI_TRUE) { - ChipLogError(Controller, "Transfer will be rejected.") * errInfoOnFailure = CHIP_ERROR_INTERNAL; + ChipLogError(Controller, "Transfer will be rejected."); + *errInfoOnFailure = CHIP_ERROR_INTERNAL; } } diff --git a/src/controller/java/CHIPP256KeypairBridge.cpp b/src/controller/java/CHIPP256KeypairBridge.cpp index a73eb417203c10..a42c5bc50e87a0 100644 --- a/src/controller/java/CHIPP256KeypairBridge.cpp +++ b/src/controller/java/CHIPP256KeypairBridge.cpp @@ -108,14 +108,14 @@ CHIP_ERROR CHIPP256KeypairBridge::ECDSA_sign_msg(const uint8_t * msg, size_t msg return CHIP_ERROR_INCORRECT_STATE; } - VerifyOrReturnError(CanCastTo(msg_length), CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(CanCastTo(msg_length), CHIP_ERROR_INVALID_ARGUMENT); CHIP_ERROR err = CHIP_NO_ERROR; jbyteArray jniMsg; jobject signedResult = nullptr; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); VerifyOrReturnError(env != nullptr, err = CHIP_JNI_ERROR_NO_ENV); - err = JniReferences::GetInstance().N2J_ByteArray(env, msg, static_cast(msg_length), jniMsg); + err = JniReferences::GetInstance().N2J_ByteArray(env, msg, static_cast(msg_length), jniMsg); VerifyOrReturnError(err == CHIP_NO_ERROR, err); VerifyOrReturnError(jniMsg != nullptr, err); VerifyOrReturnError(mDelegate.HasValidObjectRef(), CHIP_ERROR_INCORRECT_STATE); diff --git a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java index da6e6e5c7d63da..b41b847b1eab51 100644 --- a/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java +++ b/src/controller/java/generated/java/chip/devicecontroller/ChipClusters.java @@ -28,6 +28,7 @@ import chip.devicecontroller.model.Status; import javax.annotation.Nullable; +import java.lang.ref.Cleaner; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -92,10 +93,23 @@ public static abstract class BaseChipCluster { private Optional timeoutMillis = Optional.empty(); + private final Cleaner.Cleanable cleanable; + public BaseChipCluster(long devicePtr, int endpointId, long clusterId) { this.devicePtr = devicePtr; this.endpointId = endpointId; this.clusterId = clusterId; + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (chipClusterPtr != 0) { + deleteCluster(chipClusterPtr); + chipClusterPtr = 0; + } + }); } /** @@ -164,15 +178,6 @@ protected void invoke( @Deprecated public void deleteCluster(long chipClusterPtr) {} - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (chipClusterPtr != 0) { - deleteCluster(chipClusterPtr); - chipClusterPtr = 0; - } - } } abstract static class ReportCallbackImpl implements ReportCallback, SubscriptionEstablishedCallback, ResubscriptionAttemptCallback { diff --git a/src/controller/java/src/chip/devicecontroller/BatchInvokeCallbackJni.java b/src/controller/java/src/chip/devicecontroller/BatchInvokeCallbackJni.java index 6982f58429a353..f873ce6addc442 100644 --- a/src/controller/java/src/chip/devicecontroller/BatchInvokeCallbackJni.java +++ b/src/controller/java/src/chip/devicecontroller/BatchInvokeCallbackJni.java @@ -19,17 +19,31 @@ import chip.devicecontroller.model.InvokeResponseData; import chip.devicecontroller.model.NoInvokeResponseData; +import java.lang.ref.Cleaner; import java.util.Optional; import javax.annotation.Nullable; /** JNI wrapper callback class for {@link InvokeCallback}. */ -public final class ExtendableInvokeCallbackJni { - private final ExtendableInvokeCallback wrappedExtendableInvokeCallback; +public final class BatchInvokeCallbackJni { + private final BatchInvokeCallbackJni wrappedBatchInvokeCallback; private long callbackHandle; - public ExtendableInvokeCallbackJni(ExtendableInvokeCallback wrappedExtendableInvokeCallback) { - this.wrappedExtendableInvokeCallback = wrappedExtendableInvokeCallback; + private final Cleaner.Cleanable cleanable; + + public BatchInvokeCallbackJni(BatchInvokeCallback wrappedBatchInvokeCallback) { + this.wrappedBatchInvokeCallback = wrappedBatchInvokeCallback; this.callbackHandle = newCallback(); + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (chipClusterPtr != 0) { + deleteCluster(chipClusterPtr); + chipClusterPtr = 0; + } + }); } long getCallbackHandle() { @@ -41,7 +55,7 @@ long getCallbackHandle() { private native void deleteCallback(long callbackHandle); private void onError(Exception e) { - wrappedExtendableInvokeCallback.onError(e); + wrappedBatchInvokeCallback.onError(e); } private void onResponse( @@ -74,21 +88,10 @@ private void onResponse( } private void onNoResponse(int commandRef) { - wrappedExtendableInvokeCallback.onNoResponse(NoInvokeResponseData.newInstance(commandRef)); + wrappedBatchInvokeCallback.onNoResponse(NoInvokeResponseData.newInstance(commandRef)); } private void onDone() { - wrappedExtendableInvokeCallback.onDone(); - } - - // TODO(#8578): Replace finalizer with PhantomReference. - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (callbackHandle != 0) { - deleteCallback(callbackHandle); - callbackHandle = 0; - } + wrappedBatchInvokeCallback.onDone(); } } diff --git a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java index c3249489749110..893307be2116bf 100644 --- a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java +++ b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java @@ -26,6 +26,7 @@ import chip.devicecontroller.model.ChipEventPath; import chip.devicecontroller.model.DataVersionFilter; import chip.devicecontroller.model.InvokeElement; +import java.lang.ref.Cleaner; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Calendar; @@ -44,6 +45,8 @@ public class ChipDeviceController { private ScanNetworksListener scanNetworksListener; private NOCChainIssuer nocChainIssuer; + private final Cleaner.Cleanable cleanable; + /** * To load class and jni, we need to new AndroidChipPlatform after jni load but before new * ChipDeviceController @@ -67,6 +70,17 @@ public ChipDeviceController(ControllerParams params) { throw new NullPointerException("params cannot be null"); } deviceControllerPtr = newDeviceController(params); + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (deviceControllerPtr != 0) { + deleteDeviceController(deviceControllerPtr); + deviceControllerPtr = 0; + } + }); } public void setCompletionListener(CompletionListener listener) { @@ -1773,16 +1787,6 @@ private native void updateCommissioningICDRegistrationInfo( System.loadLibrary("CHIPController"); } - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (deviceControllerPtr != 0) { - deleteDeviceController(deviceControllerPtr); - deviceControllerPtr = 0; - } - } - /** Interface to implement custom operational credentials issuer (NOC chain generation). */ public interface NOCChainIssuer { /** diff --git a/src/controller/java/src/chip/devicecontroller/ExtendableInvokeCallbackJni.java b/src/controller/java/src/chip/devicecontroller/ExtendableInvokeCallbackJni.java index 6982f58429a353..6c12940fb6a1d5 100644 --- a/src/controller/java/src/chip/devicecontroller/ExtendableInvokeCallbackJni.java +++ b/src/controller/java/src/chip/devicecontroller/ExtendableInvokeCallbackJni.java @@ -19,6 +19,7 @@ import chip.devicecontroller.model.InvokeResponseData; import chip.devicecontroller.model.NoInvokeResponseData; +import java.lang.ref.Cleaner; import java.util.Optional; import javax.annotation.Nullable; @@ -27,9 +28,22 @@ public final class ExtendableInvokeCallbackJni { private final ExtendableInvokeCallback wrappedExtendableInvokeCallback; private long callbackHandle; + private final Cleaner.Cleanable cleanable; + public ExtendableInvokeCallbackJni(ExtendableInvokeCallback wrappedExtendableInvokeCallback) { this.wrappedExtendableInvokeCallback = wrappedExtendableInvokeCallback; this.callbackHandle = newCallback(); + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (callbackHandle != 0) { + deleteCallback(callbackHandle); + callbackHandle = 0; + } + }); } long getCallbackHandle() { @@ -80,15 +94,4 @@ private void onNoResponse(int commandRef) { private void onDone() { wrappedExtendableInvokeCallback.onDone(); } - - // TODO(#8578): Replace finalizer with PhantomReference. - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (callbackHandle != 0) { - deleteCallback(callbackHandle); - callbackHandle = 0; - } - } } diff --git a/src/controller/java/src/chip/devicecontroller/GetConnectedDeviceCallbackJni.java b/src/controller/java/src/chip/devicecontroller/GetConnectedDeviceCallbackJni.java index b45b04a778b053..84338f82340cd6 100644 --- a/src/controller/java/src/chip/devicecontroller/GetConnectedDeviceCallbackJni.java +++ b/src/controller/java/src/chip/devicecontroller/GetConnectedDeviceCallbackJni.java @@ -17,14 +17,29 @@ */ package chip.devicecontroller; +import java.lang.ref.Cleaner; + /** JNI wrapper callback class for getting a connected device. */ public class GetConnectedDeviceCallbackJni { private final GetConnectedDeviceCallback wrappedCallback; private long callbackHandle; + private final Cleaner.Cleanable cleanable; + public GetConnectedDeviceCallbackJni(GetConnectedDeviceCallback wrappedCallback) { this.wrappedCallback = wrappedCallback; this.callbackHandle = newCallback(wrappedCallback); + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (callbackHandle != 0) { + deleteCallback(callbackHandle); + callbackHandle = 0; + } + }); } long getCallbackHandle() { @@ -35,17 +50,6 @@ long getCallbackHandle() { private native void deleteCallback(long callbackHandle); - // TODO(#8578): Replace finalizer with PhantomReference. - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (callbackHandle != 0) { - deleteCallback(callbackHandle); - callbackHandle = 0; - } - } - /** Callbacks for getting a device connected with PASE or CASE, depending on the context. */ public interface GetConnectedDeviceCallback { void onDeviceConnected(long devicePointer); diff --git a/src/controller/java/src/chip/devicecontroller/InvokeCallbackJni.java b/src/controller/java/src/chip/devicecontroller/InvokeCallbackJni.java index ceb35eccefd9b0..69881a778481e7 100644 --- a/src/controller/java/src/chip/devicecontroller/InvokeCallbackJni.java +++ b/src/controller/java/src/chip/devicecontroller/InvokeCallbackJni.java @@ -18,15 +18,29 @@ package chip.devicecontroller; import chip.devicecontroller.model.InvokeElement; +import java.lang.ref.Cleaner; /** JNI wrapper callback class for {@link InvokeCallback}. */ public final class InvokeCallbackJni { private final InvokeCallback wrappedInvokeCallback; private long callbackHandle; + private final Cleaner.Cleanable cleanable; + public InvokeCallbackJni(InvokeCallback wrappedInvokeCallback) { this.wrappedInvokeCallback = wrappedInvokeCallback; this.callbackHandle = newCallback(); + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (callbackHandle != 0) { + deleteCallback(callbackHandle); + callbackHandle = 0; + } + }); } long getCallbackHandle() { @@ -55,15 +69,4 @@ private void onResponse( private void onDone() { wrappedInvokeCallback.onDone(); } - - // TODO(#8578): Replace finalizer with PhantomReference. - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (callbackHandle != 0) { - deleteCallback(callbackHandle); - callbackHandle = 0; - } - } } diff --git a/src/controller/java/src/chip/devicecontroller/ReportCallbackJni.java b/src/controller/java/src/chip/devicecontroller/ReportCallbackJni.java index 4f2529fa8d58b0..9ff86d1e9f602b 100644 --- a/src/controller/java/src/chip/devicecontroller/ReportCallbackJni.java +++ b/src/controller/java/src/chip/devicecontroller/ReportCallbackJni.java @@ -20,6 +20,7 @@ import chip.devicecontroller.model.ChipAttributePath; import chip.devicecontroller.model.ChipEventPath; import chip.devicecontroller.model.NodeState; +import java.lang.ref.Cleaner; import javax.annotation.Nullable; /** JNI wrapper callback class for {@link ReportCallback}. */ @@ -30,6 +31,8 @@ public class ReportCallbackJni { private long callbackHandle; @Nullable private NodeState nodeState; + private final Cleaner.Cleanable cleanable; + public ReportCallbackJni( @Nullable SubscriptionEstablishedCallback subscriptionEstablishedCallback, ReportCallback reportCallback, @@ -39,6 +42,17 @@ public ReportCallbackJni( this.wrappedResubscriptionAttemptCallback = resubscriptionAttemptCallback; this.callbackHandle = newCallback(subscriptionEstablishedCallback, resubscriptionAttemptCallback); + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (callbackHandle != 0) { + deleteCallback(callbackHandle); + callbackHandle = 0; + } + }); } long getCallbackHandle() { @@ -88,15 +102,4 @@ private void onError( private void onDone() { wrappedReportCallback.onDone(); } - - // TODO(#8578): Replace finalizer with PhantomReference. - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (callbackHandle != 0) { - deleteCallback(callbackHandle); - callbackHandle = 0; - } - } } diff --git a/src/controller/java/src/chip/devicecontroller/WriteAttributesCallbackJni.java b/src/controller/java/src/chip/devicecontroller/WriteAttributesCallbackJni.java index 7b95b30759222f..84a74c4d9eec0d 100644 --- a/src/controller/java/src/chip/devicecontroller/WriteAttributesCallbackJni.java +++ b/src/controller/java/src/chip/devicecontroller/WriteAttributesCallbackJni.java @@ -19,6 +19,7 @@ import chip.devicecontroller.model.ChipAttributePath; import chip.devicecontroller.model.Status; +import java.lang.ref.Cleaner; import javax.annotation.Nullable; /** JNI wrapper callback class for {@link WriteAttributesCallback}. */ @@ -26,9 +27,22 @@ public final class WriteAttributesCallbackJni { private final WriteAttributesCallback wrappedWriteAttributesCallback; private long callbackHandle; + private final Cleaner.Cleanable cleanable; + public WriteAttributesCallbackJni(WriteAttributesCallback wrappedWriteAttributesCallback) { this.wrappedWriteAttributesCallback = wrappedWriteAttributesCallback; this.callbackHandle = newCallback(); + + this.cleanable = + Cleaner.create() + .register( + this, + () -> { + if (callbackHandle != 0) { + deleteCallback(callbackHandle); + callbackHandle = 0; + } + }); } long getCallbackHandle() { @@ -61,15 +75,4 @@ private void onResponse( private void onDone() { wrappedWriteAttributesCallback.onDone(); } - - // TODO(#8578): Replace finalizer with PhantomReference. - @SuppressWarnings("deprecation") - protected void finalize() throws Throwable { - super.finalize(); - - if (callbackHandle != 0) { - deleteCallback(callbackHandle); - callbackHandle = 0; - } - } } diff --git a/src/controller/python/chip-repl.py b/src/controller/python/chip-repl.py index 861ad8962ccc84..1cfd9bc6637044 100755 --- a/src/controller/python/chip-repl.py +++ b/src/controller/python/chip-repl.py @@ -26,9 +26,9 @@ def main(): c = Config() c.InteractiveShellApp.exec_lines = [ - "import pkgutil", - "module = pkgutil.get_loader('chip.ChipReplStartup')", - "%run {module.path} " + " ".join(sys.argv[1:]) + "import importlib.util", + "spec = importlib.util.find_spec('chip.ChipReplStartup')", + "%run {spec.origin} " + " ".join(sys.argv[1:]) ] sys.argv = [sys.argv[0]] diff --git a/src/controller/python/chip/ChipReplStartup.py b/src/controller/python/chip/ChipReplStartup.py index 13a93a1efb453b..56c18243272744 100644 --- a/src/controller/python/chip/ChipReplStartup.py +++ b/src/controller/python/chip/ChipReplStartup.py @@ -6,6 +6,7 @@ import pathlib import chip.CertificateAuthority +import chip.clusters as Clusters # noqa: F401 import chip.FabricAdmin import chip.logging import chip.native @@ -163,7 +164,7 @@ def main(): console.print( '''\t[red]certificateAuthorityManager[blue]:\tManages a list of CertificateAuthority instances. \t[red]caList[blue]:\t\t\t\tThe list of CertificateAuthority instances. - \t[red]caList[n][m][blue]:\t\t\tA specific FabricAdmin object at index m for the nth CertificateAuthority instance.''') + \t[red]caList\[n].adminList\[m][blue]:\t\tA specific FabricAdmin object at index m for the nth CertificateAuthority instance.''') console.print( f'\n\n[blue]Default CHIP Device Controller (NodeId: {devCtrl.nodeId}): ' diff --git a/src/controller/tests/data_model/TestRead.cpp b/src/controller/tests/data_model/TestRead.cpp index f423675c66ee1e..d320def488ec47 100644 --- a/src/controller/tests/data_model/TestRead.cpp +++ b/src/controller/tests/data_model/TestRead.cpp @@ -290,8 +290,8 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithVersionOnlyCache) EXPECT_EQ(err, CHIP_NO_ERROR); DrainAndServiceIO(); - // There are supported 2 global and 3 non-global attributes in E2C2A* and 1 E3C2A2 - EXPECT_EQ(delegate.mNumAttributeResponse, 6); + // There are supported 5 global and 3 non-global attributes in E2C2A* and 1 E3C2A2 + EXPECT_EQ(delegate.mNumAttributeResponse, 9); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath1(kMockEndpoint2, MockClusterId(3)); @@ -374,7 +374,7 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithCache) EXPECT_EQ(err, CHIP_NO_ERROR); DrainAndServiceIO(); - EXPECT_EQ(delegate.mNumAttributeResponse, 6); + EXPECT_EQ(delegate.mNumAttributeResponse, 9); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath1(kMockEndpoint2, MockClusterId(3)); @@ -535,8 +535,8 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithCache) EXPECT_EQ(err, CHIP_NO_ERROR); DrainAndServiceIO(); - // There are supported 2 global and 3 non-global attributes in E2C2A* and 1 E3C2A2 - EXPECT_EQ(delegate.mNumAttributeResponse, 6); + // There are supported 5 global and 3 non-global attributes in E2C2A* and 1 E3C2A2 + EXPECT_EQ(delegate.mNumAttributeResponse, 9); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath1(kMockEndpoint2, MockClusterId(3)); @@ -877,7 +877,7 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithCache) EXPECT_EQ(err, CHIP_NO_ERROR); DrainAndServiceIO(); - EXPECT_EQ(delegate.mNumAttributeResponse, 6); + EXPECT_EQ(delegate.mNumAttributeResponse, 9); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath1(kMockEndpoint2, MockClusterId(3)); @@ -956,7 +956,7 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithCache) EXPECT_EQ(err, CHIP_NO_ERROR); DrainAndServiceIO(); - EXPECT_EQ(delegate.mNumAttributeResponse, 6); + EXPECT_EQ(delegate.mNumAttributeResponse, 9); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath1(kMockEndpoint2, MockClusterId(3)); @@ -1037,7 +1037,8 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithCache) DrainAndServiceIO(); // E1C2A* has 3 attributes and E2C3A* has 5 attributes and E2C2A* has 4 attributes - EXPECT_EQ(delegate.mNumAttributeResponse, 12); + // + 3 global attributes not in metadata (3*3 = 9) for attributes/acceptedcommands/generatedcommands + EXPECT_EQ(delegate.mNumAttributeResponse, 21); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath1(kMockEndpoint2, MockClusterId(3)); @@ -1142,7 +1143,7 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithCache) EXPECT_EQ(err, CHIP_NO_ERROR); DrainAndServiceIO(); - EXPECT_EQ(delegate.mNumAttributeResponse, 7); + EXPECT_EQ(delegate.mNumAttributeResponse, 13); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath1(kMockEndpoint2, MockClusterId(3)); @@ -1232,7 +1233,7 @@ TEST_F(TestRead, TestReadSubscribeAttributeResponseWithCache) EXPECT_EQ(err, CHIP_NO_ERROR); DrainAndServiceIO(); - EXPECT_EQ(delegate.mNumAttributeResponse, 6); + EXPECT_EQ(delegate.mNumAttributeResponse, 9); EXPECT_FALSE(delegate.mReadError); Optional version1; ConcreteClusterPath clusterPath(kMockEndpoint3, MockClusterId(2)); diff --git a/src/credentials/tests/TestFabricTable.cpp b/src/credentials/tests/TestFabricTable.cpp index 407d0863adf1d1..de58db73ac51b8 100644 --- a/src/credentials/tests/TestFabricTable.cpp +++ b/src/credentials/tests/TestFabricTable.cpp @@ -203,6 +203,9 @@ struct TestFabricTable : public ::testing::Test { DeviceLayer::SetConfigurationMgr(&DeviceLayer::ConfigurationManagerImpl::GetDefaultInstance()); ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); +#if CHIP_CRYPTO_PSA + ASSERT_EQ(psa_crypto_init(), PSA_SUCCESS); +#endif } static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } }; diff --git a/src/crypto/CHIPCryptoPALPSA.cpp b/src/crypto/CHIPCryptoPALPSA.cpp index 924759b9353c29..7aa33c1c66d80b 100644 --- a/src/crypto/CHIPCryptoPALPSA.cpp +++ b/src/crypto/CHIPCryptoPALPSA.cpp @@ -72,8 +72,8 @@ CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, c const psa_algorithm_t algorithm = PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, tag_length); psa_status_t status = PSA_SUCCESS; psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT; - size_t out_length; - size_t tag_out_length; + size_t out_length = 0; + size_t tag_out_length = 0; status = psa_aead_encrypt_setup(&operation, key.As(), algorithm); VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); @@ -94,19 +94,58 @@ CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, c ChipLogDetail(Crypto, "AES_CCM_encrypt: Using aad == null path"); } - if (plaintext_length != 0) + // psa_aead_update() requires use of the macro PSA_AEAD_UPDATE_OUTPUT_SIZE to determine the output buffer size. + // For AES-CCM, PSA_AEAD_UPDATE_OUTPUT_SIZE will round up the size to the next multiple of the block size (16). + // If the ciphertext length is not a multiple of the block size, we will encrypt in two steps, first with the + // block_aligned_length, and then with a rounded up partial_block_length, where a temporary buffer will be used for the output. + constexpr uint8_t kBlockSize = PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES); + size_t block_aligned_length = (plaintext_length / kBlockSize) * kBlockSize; + size_t partial_block_length = plaintext_length % kBlockSize; + + // Make sure the calculated block_aligned_length is compliant with PSA's output size requirements. + VerifyOrReturnError(block_aligned_length == PSA_AEAD_UPDATE_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm, block_aligned_length), + CHIP_ERROR_INTERNAL); + + if (block_aligned_length > 0) { - status = psa_aead_update(&operation, plaintext, plaintext_length, ciphertext, - PSA_AEAD_UPDATE_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm, plaintext_length), &out_length); + status = psa_aead_update(&operation, plaintext, block_aligned_length, ciphertext, block_aligned_length, &out_length); VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); ciphertext += out_length; + } + + if (partial_block_length > 0) + { + uint8_t temp_buffer[kBlockSize]; + size_t rounded_up_length = PSA_AEAD_UPDATE_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm, partial_block_length); + + VerifyOrReturnError(rounded_up_length <= sizeof(temp_buffer), CHIP_ERROR_BUFFER_TOO_SMALL); + + out_length = 0; + status = psa_aead_update(&operation, plaintext + block_aligned_length, partial_block_length, &temp_buffer[0], + rounded_up_length, &out_length); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + VerifyOrReturnError(partial_block_length == out_length, CHIP_ERROR_INTERNAL); + memcpy(ciphertext, temp_buffer, partial_block_length); + + ciphertext += out_length; + } + + if (plaintext_length != 0) + { + out_length = 0; + tag_out_length = 0; status = psa_aead_finish(&operation, ciphertext, PSA_AEAD_FINISH_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm), &out_length, tag, tag_length, &tag_out_length); } + else { + out_length = 0; + tag_out_length = 0; + status = psa_aead_finish(&operation, nullptr, 0, &out_length, tag, tag_length, &tag_out_length); } VerifyOrReturnError(status == PSA_SUCCESS && tag_length == tag_out_length, CHIP_ERROR_INTERNAL); @@ -126,7 +165,7 @@ CHIP_ERROR AES_CCM_decrypt(const uint8_t * ciphertext, size_t ciphertext_length, const psa_algorithm_t algorithm = PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, tag_length); psa_status_t status = PSA_SUCCESS; psa_aead_operation_t operation = PSA_AEAD_OPERATION_INIT; - size_t outLength; + size_t outLength = 0; status = psa_aead_decrypt_setup(&operation, key.As(), algorithm); VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); @@ -147,20 +186,54 @@ CHIP_ERROR AES_CCM_decrypt(const uint8_t * ciphertext, size_t ciphertext_length, ChipLogDetail(Crypto, "AES_CCM_decrypt: Using aad == null path"); } - if (ciphertext_length != 0) + // psa_aead_update() requires use of the macro PSA_AEAD_UPDATE_OUTPUT_SIZE to determine the output buffer size. + // For AES-CCM, PSA_AEAD_UPDATE_OUTPUT_SIZE will round up the size to the next multiple of the block size (16). + // If the ciphertext length is not a multiple of the block size, we will decrypt in two steps, first with the + // block_aligned_length, and then with a rounded up partial_block_length, where a temporary buffer will be used for the output. + constexpr uint8_t kBlockSize = PSA_BLOCK_CIPHER_BLOCK_LENGTH(PSA_KEY_TYPE_AES); + size_t block_aligned_length = (ciphertext_length / kBlockSize) * kBlockSize; + size_t partial_block_length = ciphertext_length % kBlockSize; + + // Make sure the calculated block_aligned_length is compliant with PSA's output size requirements. + VerifyOrReturnError(block_aligned_length == PSA_AEAD_UPDATE_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm, block_aligned_length), + CHIP_ERROR_INTERNAL); + + if (block_aligned_length > 0) { - status = psa_aead_update(&operation, ciphertext, ciphertext_length, plaintext, - PSA_AEAD_UPDATE_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm, ciphertext_length), &outLength); + status = psa_aead_update(&operation, ciphertext, block_aligned_length, plaintext, block_aligned_length, &outLength); VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); plaintext += outLength; + } + + if (partial_block_length > 0) + { + uint8_t temp_buffer[kBlockSize]; + size_t rounded_up_length = PSA_AEAD_UPDATE_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm, partial_block_length); + + VerifyOrReturnError(rounded_up_length <= sizeof(temp_buffer), CHIP_ERROR_BUFFER_TOO_SMALL); + outLength = 0; + status = psa_aead_update(&operation, ciphertext + block_aligned_length, partial_block_length, &temp_buffer[0], + rounded_up_length, &outLength); + VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); + + VerifyOrReturnError(partial_block_length == outLength, CHIP_ERROR_INTERNAL); + memcpy(plaintext, &temp_buffer[0], partial_block_length); + + plaintext += outLength; + } + + if (ciphertext_length != 0) + { + outLength = 0; status = psa_aead_verify(&operation, plaintext, PSA_AEAD_VERIFY_OUTPUT_SIZE(PSA_KEY_TYPE_AES, algorithm), &outLength, tag, tag_length); } else { - status = psa_aead_verify(&operation, nullptr, 0, &outLength, tag, tag_length); + outLength = 0; + status = psa_aead_verify(&operation, nullptr, 0, &outLength, tag, tag_length); } VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); diff --git a/src/crypto/PSASessionKeystore.cpp b/src/crypto/PSASessionKeystore.cpp index ece38e74ffeda2..4831333e0e6c48 100644 --- a/src/crypto/PSASessionKeystore.cpp +++ b/src/crypto/PSASessionKeystore.cpp @@ -190,8 +190,8 @@ void PSASessionKeystore::DestroyKey(HkdfKeyHandle & key) CHIP_ERROR PSASessionKeystore::PersistICDKey(Symmetric128BitsKeyHandle & key) { CHIP_ERROR err; - psa_key_id_t newKeyId = PSA_KEY_ID_NULL; - psa_key_attributes_t attrs; + psa_key_id_t newKeyId = PSA_KEY_ID_NULL; + psa_key_attributes_t attrs = PSA_KEY_ATTRIBUTES_INIT; psa_get_key_attributes(key.As(), &attrs); diff --git a/src/crypto/tests/TestChipCryptoPAL.cpp b/src/crypto/tests/TestChipCryptoPAL.cpp index 4dd5182e786eb2..b9bf84493b4192 100644 --- a/src/crypto/tests/TestChipCryptoPAL.cpp +++ b/src/crypto/tests/TestChipCryptoPAL.cpp @@ -73,6 +73,10 @@ #if CHIP_CRYPTO_PSA #include +extern "C" { +psa_status_t psa_initialize_key_slots(void); +void psa_wipe_all_key_slots(void); +} #endif using namespace chip; @@ -289,14 +293,17 @@ static void TestAES_CTR_128_Decrypt(const AesCtrTestEntry * vector) struct TestChipCryptoPAL : public ::testing::Test { - static void SetUpTestSuite() + static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); } + static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } + + void SetUp() override { - ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); #if CHIP_CRYPTO_PSA psa_crypto_init(); + psa_wipe_all_key_slots(); + psa_initialize_key_slots(); #endif } - static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } }; TEST_F(TestChipCryptoPAL, TestAES_CTR_128CryptTestVectors) diff --git a/src/darwin/Framework/CHIP/MTRCommandWithRequiredResponse.h b/src/darwin/Framework/CHIP/MTRCommandWithRequiredResponse.h new file mode 100644 index 00000000000000..385453c19d82d8 --- /dev/null +++ b/src/darwin/Framework/CHIP/MTRCommandWithRequiredResponse.h @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2025 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 +#import // For MTRCommandPath + +NS_ASSUME_NONNULL_BEGIN + +/** + * An object representing a single command to be invoked and the response + * required for the invoke to be considered successful. + */ +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) +@interface MTRCommandWithRequiredResponse : NSObject + +/** + * The path of the command being invoked. + */ +@property (nonatomic, retain) MTRCommandPath * path; + +/** + * The command fields to pass for the command invoke. nil if this command does + * not have any fields. If not nil, this should be a data-value dictionary of + * MTRStructureValueType. + */ +@property (nonatomic, retain, nullable) NSDictionary * commandFields; + +/** + * The response that represents this command succeeding. + * + * If this is nil, that indicates that the invoke is considered successful if it + * does not result in an error status response. + * + * If this is is not nil, then the invoke is considered successful if + * the response is a data response and for each entry in the provided + * requiredResponse the field whose field ID matches the key of the entry has a + * value that equals the value of the entry. Values of entries are data-value + * dictionaries. + */ +@property (nonatomic, copy, nullable) NSDictionary *> * requiredResponse; + +- (instancetype)initWithPath:(MTRCommandPath *)path + commandFields:(nullable NSDictionary *)commandFields + requiredResponse:(nullable NSDictionary *> *)requiredResponse; + +@end + +NS_ASSUME_NONNULL_END diff --git a/src/darwin/Framework/CHIP/MTRCommandWithRequiredResponse.mm b/src/darwin/Framework/CHIP/MTRCommandWithRequiredResponse.mm new file mode 100644 index 00000000000000..ddd289e57f15b5 --- /dev/null +++ b/src/darwin/Framework/CHIP/MTRCommandWithRequiredResponse.mm @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2025 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 "MTRDeviceDataValidation.h" +#import "MTRLogging_Internal.h" +#import + +@implementation MTRCommandWithRequiredResponse +- (instancetype)initWithPath:(MTRCommandPath *)path + commandFields:(nullable NSDictionary *)commandFields + requiredResponse:(nullable NSDictionary *> *)requiredResponse +{ + if (self = [super init]) { + self.path = path; + self.commandFields = commandFields; + self.requiredResponse = requiredResponse; + } + + return self; +} + +- (id)copyWithZone:(NSZone *)zone +{ + return [[MTRCommandWithRequiredResponse alloc] initWithPath:self.path commandFields:self.commandFields requiredResponse:self.requiredResponse]; +} + +- (NSString *)description +{ + return [NSString stringWithFormat:@"<%@: %p, path: %@, fields: %@, requiredResponse: %@", NSStringFromClass(self.class), self, self.path, self.commandFields, self.requiredResponse]; +} + +#pragma mark - MTRCommandWithRequiredResponse NSSecureCoding implementation + +static NSString * const sPathKey = @"pathKey"; +static NSString * const sFieldsKey = @"fieldsKey"; +static NSString * const sExpectedResultKey = @"requiredResponseKey"; + ++ (BOOL)supportsSecureCoding +{ + return YES; +} + +- (nullable instancetype)initWithCoder:(NSCoder *)decoder +{ + self = [super init]; + if (self == nil) { + return nil; + } + + _path = [decoder decodeObjectOfClass:MTRCommandPath.class forKey:sPathKey]; + if (!_path || ![_path isKindOfClass:MTRCommandPath.class]) { + MTR_LOG_ERROR("MTRCommandWithRequiredResponse decoded %@ for endpoint, not MTRCommandPath.", _path); + return nil; + } + + _commandFields = [decoder decodeObjectOfClass:NSDictionary.class forKey:sFieldsKey]; + if (_commandFields) { + if (![_commandFields isKindOfClass:NSDictionary.class]) { + MTR_LOG_ERROR("MTRCommandWithRequiredResponse decoded %@ for commandFields, not NSDictionary.", _commandFields); + return nil; + } + + if (!MTRDataValueDictionaryIsWellFormed(_commandFields) || ![MTRStructureValueType isEqual:_commandFields[MTRTypeKey]]) { + MTR_LOG_ERROR("MTRCommandWithRequiredResponse decoded %@ for commandFields, not a structure-typed data-value dictionary.", _commandFields); + return nil; + } + } + + _requiredResponse = [decoder decodeObjectOfClass:NSDictionary.class forKey:sExpectedResultKey]; + if (_requiredResponse) { + if (![_requiredResponse isKindOfClass:NSDictionary.class]) { + MTR_LOG_ERROR("MTRCommandWithRequiredResponse decoded %@ for requiredResponse, not NSDictionary.", _requiredResponse); + return nil; + } + + for (id key in _requiredResponse) { + if (![key isKindOfClass:NSNumber.class]) { + MTR_LOG_ERROR("MTRCommandWithRequiredResponse decoded key %@ in requiredResponse", key); + return nil; + } + + if (![_requiredResponse[key] isKindOfClass:NSDictionary.class] || !MTRDataValueDictionaryIsWellFormed(_requiredResponse[key])) { + MTR_LOG_ERROR("MTRCommandWithRequiredResponse decoded value %@ for key %@ in requiredResponse", _requiredResponse[key], key); + return nil; + } + } + } + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder +{ + // In theory path is not nullable, but we don't really enforce that in init. + if (self.path) { + [coder encodeObject:self.path forKey:sPathKey]; + } + if (self.commandFields) { + [coder encodeObject:self.commandFields forKey:sFieldsKey]; + } + if (self.requiredResponse) { + [coder encodeObject:self.requiredResponse forKey:sExpectedResultKey]; + } +} + +@end diff --git a/src/darwin/Framework/CHIP/MTRCommissioningParameters.h b/src/darwin/Framework/CHIP/MTRCommissioningParameters.h index c5bd65b7a0a03d..d61867a81bdf51 100644 --- a/src/darwin/Framework/CHIP/MTRCommissioningParameters.h +++ b/src/darwin/Framework/CHIP/MTRCommissioningParameters.h @@ -102,6 +102,17 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) */ @property (nonatomic, assign) BOOL readEndpointInformation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +/** + * A bitmask of the user’s responses to the presented terms and conditions. + * Each bit corresponds to a term’s acceptance (1) or non-acceptance (0) at the matching index. + */ +@property (nonatomic, copy, nullable) NSNumber * acceptedTermsAndConditions MTR_PROVISIONALLY_AVAILABLE; + +/** + * The version of the terms and conditions that the user has accepted. + */ +@property (nonatomic, copy, nullable) NSNumber * acceptedTermsAndConditionsVersion MTR_PROVISIONALLY_AVAILABLE; + @end @interface MTRCommissioningParameters (Deprecated) diff --git a/src/darwin/Framework/CHIP/MTRDevice.h b/src/darwin/Framework/CHIP/MTRDevice.h index 1f5e9c9a075981..84cd4ea9c8ebd9 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.h +++ b/src/darwin/Framework/CHIP/MTRDevice.h @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2022-2023 Project CHIP Authors + * Copyright (c) 2022-2025 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. @@ -19,6 +19,7 @@ #import #import #import +#import #import NS_ASSUME_NONNULL_BEGIN @@ -294,6 +295,31 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) completion:(MTRDeviceResponseHandler)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); +/** + * Invoke one or more groups of commands. + * + * For any given group, if any command in any preceding group failed, the group + * will be skipped. If all commands in all preceding groups succeeded, the + * commands within the group will be invoked, with no ordering guarantees within + * that group. + * + * Results from all commands that were invoked will be passed to the provided + * completion as an array of response-value dictionaries. Each of these will + * have the command path of the command (see MTRCommandPathKey) and one of three + * things: + * + * 1) No other fields, indicating that the command invoke returned a succcess + * status. + * 2) A field for MTRErrorKey, indicating that the invoke returned a failure + * status (which is the value of the field). + * 3) A field for MTRDataKey, indicating that the invoke returned a data + * response. In this case the data-value representing the response will be + * the value of this field. + */ +- (void)invokeCommands:(NSArray *> *)commands + queue:(dispatch_queue_t)queue + completion:(MTRDeviceResponseHandler)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); + /** * Open a commissioning window on the device. * diff --git a/src/darwin/Framework/CHIP/MTRDevice.mm b/src/darwin/Framework/CHIP/MTRDevice.mm index 4bf71496b0cf1f..63555c8ebb82b9 100644 --- a/src/darwin/Framework/CHIP/MTRDevice.mm +++ b/src/darwin/Framework/CHIP/MTRDevice.mm @@ -523,6 +523,16 @@ - (void)_invokeKnownCommandWithEndpointID:(NSNumber *)endpointID completion:responseHandler]; } +- (void)invokeCommands:(NSArray *> *)commands + queue:(dispatch_queue_t)queue + completion:(MTRDeviceResponseHandler)completion +{ + MTR_ABSTRACT_METHOD(); + dispatch_async(queue, ^{ + completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INCORRECT_STATE]); + }); +} + - (void)openCommissioningWindowWithSetupPasscode:(NSNumber *)setupPasscode discriminator:(NSNumber *)discriminator duration:(NSNumber *)duration diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.h b/src/darwin/Framework/CHIP/MTRDeviceController.h index 8177eda25cd5ba..41c97e805be95d 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController.h @@ -309,6 +309,13 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) */ - (void)resume MTR_AVAILABLE(ios(18.2), macos(15.2), watchos(11.2), tvos(18.2)); +/** + * Returns the list of node IDs for which this controller has stored + * information. Returns empty list if the controller does not have any + * information stored. + */ +- (NSArray *)nodesWithStoredData MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); + /** * Shut down the controller. Calls to shutdown after the first one are NO-OPs. * This must be called, either directly or via shutting down the diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 7bdbf2302740e9..93b02c9a693ea7 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -508,6 +508,12 @@ + (void)forceLocalhostAdvertisingOnly } #endif // DEBUG +- (NSArray *)nodesWithStoredData +{ + MTR_ABSTRACT_METHOD(); + return @[]; +} + #pragma mark - MTRDeviceControllerDelegate management // Note these are implemented in the base class so that XPC subclass can use it as well diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h index f4f38855420345..3feaa5a3e480af 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h @@ -105,6 +105,12 @@ typedef void (^MTRDeviceControllerDataStoreClusterDataHandler)(NSDictionary *)nodesWithStoredData; + @end NS_ASSUME_NONNULL_END diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm index 7ca30225b84f88..8a0057ca1ed9f2 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm @@ -19,6 +19,7 @@ // Importing MTRBaseDevice.h for the MTRAttributePath class. Needs to change when https://github.com/project-chip/connectedhomeip/issues/31247 is fixed. #import "MTRBaseDevice.h" #import "MTRLogging_Internal.h" +#import "MTRUnfairLock.h" #include #include @@ -111,6 +112,11 @@ @implementation MTRDeviceControllerDataStore { __weak MTRDeviceController * _controller; // Array of nodes with resumption info, oldest-stored first. NSMutableArray * _nodesWithResumptionInfo; + // Array of nodes with attribute info. + NSMutableArray * _nodesWithAttributeInfo; + // Lock protecting access to the _nodesWithAttributeInfo and + // _nodesWithResumptionInfo arrays. + os_unfair_lock _nodeArrayLock; } - (nullable instancetype)initWithController:(MTRDeviceController *)controller @@ -124,8 +130,10 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller _controller = controller; _storageDelegate = storageDelegate; _storageDelegateQueue = storageDelegateQueue; + _nodeArrayLock = OS_UNFAIR_LOCK_INIT; __block id resumptionNodeList; + __block NSArray * nodesWithAttributeInfo; dispatch_sync(_storageDelegateQueue, ^{ @autoreleasepool { // NOTE: controller, not our weak ref, since we know it's still @@ -134,6 +142,8 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller valueForKey:sResumptionNodeListKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + + nodesWithAttributeInfo = [self _fetchNodeIndex]; } }); if (resumptionNodeList != nil) { @@ -152,6 +162,12 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller _nodesWithResumptionInfo = [[NSMutableArray alloc] init]; } + if (nodesWithAttributeInfo != nil) { + _nodesWithAttributeInfo = [nodesWithAttributeInfo mutableCopy]; + } else { + _nodesWithAttributeInfo = [[NSMutableArray alloc] init]; + } + return self; } @@ -196,6 +212,8 @@ - (void)storeResumptionInfo:(MTRCASESessionResumptionInfo *)resumptionInfo removeValueForKey:ResumptionByResumptionIDKey(oldInfo.resumptionID) securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + + std::lock_guard lock(self->_nodeArrayLock); [_nodesWithResumptionInfo removeObject:resumptionInfo.nodeID]; } @@ -211,9 +229,14 @@ - (void)storeResumptionInfo:(MTRCASESessionResumptionInfo *)resumptionInfo sharingType:MTRStorageSharingTypeNotShared]; // Update our resumption info node list. - [_nodesWithResumptionInfo addObject:resumptionInfo.nodeID]; + NSArray * valueToStore; + { + std::lock_guard lock(self->_nodeArrayLock); + [_nodesWithResumptionInfo addObject:resumptionInfo.nodeID]; + valueToStore = [_nodesWithResumptionInfo copy]; + } [_storageDelegate controller:controller - storeValue:[_nodesWithResumptionInfo copy] + storeValue:valueToStore forKey:sResumptionNodeListKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -226,7 +249,9 @@ - (void)clearAllResumptionInfo VerifyOrReturn(controller != nil); // No way to call delegate without controller. // Can we do less dispatch? We would need to have a version of - // _findResumptionInfoWithKey that assumes we are already on the right queue. + // _findResumptionInfoWithKey that assumes we are already on the right + // queue. + std::lock_guard lock(_nodeArrayLock); for (NSNumber * nodeID in _nodesWithResumptionInfo) { [self _clearResumptionInfoForNodeID:nodeID controller:controller]; } @@ -240,6 +265,8 @@ - (void)clearResumptionInfoForNodeID:(NSNumber *)nodeID VerifyOrReturn(controller != nil); // No way to call delegate without controller. [self _clearResumptionInfoForNodeID:nodeID controller:controller]; + + std::lock_guard lock(_nodeArrayLock); [_nodesWithResumptionInfo removeObject:nodeID]; } @@ -588,6 +615,20 @@ - (void)unitTestPruneEmptyStoredClusterDataBranches [self _pruneEmptyStoredClusterDataBranches]; }); } + +- (void)unitTestRereadNodeIndex +{ + dispatch_sync(_storageDelegateQueue, ^{ + auto * newIndex = [self _fetchNodeIndex]; + + std::lock_guard lock(self->_nodeArrayLock); + if (newIndex != nil) { + self->_nodesWithAttributeInfo = [newIndex mutableCopy]; + } else { + self->_nodesWithAttributeInfo = [[NSMutableArray alloc] init]; + } + }); +} #endif - (void)_pruneEmptyStoredClusterDataBranches @@ -596,9 +637,8 @@ - (void)_pruneEmptyStoredClusterDataBranches NSUInteger storeFailures = 0; - // Fetch node index - NSArray * nodeIndex = [self _fetchNodeIndex]; - NSMutableArray * nodeIndexCopy = [nodeIndex mutableCopy]; + std::lock_guard lock(self->_nodeArrayLock); + NSArray * nodeIndex = [_nodesWithAttributeInfo copy]; for (NSNumber * nodeID in nodeIndex) { // Fetch endpoint index @@ -638,7 +678,7 @@ - (void)_pruneEmptyStoredClusterDataBranches if (endpointIndexCopy.count) { success = [self _storeEndpointIndex:endpointIndexCopy forNodeID:nodeID]; } else { - [nodeIndexCopy removeObject:nodeID]; + [_nodesWithAttributeInfo removeObject:nodeID]; success = [self _deleteEndpointIndexForNodeID:nodeID]; } if (!success) { @@ -648,16 +688,16 @@ - (void)_pruneEmptyStoredClusterDataBranches } } - if (nodeIndex.count != nodeIndexCopy.count) { + if (nodeIndex.count != _nodesWithAttributeInfo.count) { BOOL success; - if (nodeIndexCopy.count) { - success = [self _storeNodeIndex:nodeIndexCopy]; + if (_nodesWithAttributeInfo.count) { + success = [self _storeNodeIndex:_nodesWithAttributeInfo]; } else { success = [self _deleteNodeIndex]; } if (!success) { storeFailures++; - MTR_LOG_ERROR("Store failed in _pruneEmptyStoredClusterDataBranches for nodeIndex (%lu)", static_cast(nodeIndexCopy.count)); + MTR_LOG_ERROR("Store failed in _pruneEmptyStoredClusterDataBranches for nodeIndex (%lu)", static_cast(_nodesWithAttributeInfo.count)); } } @@ -713,18 +753,19 @@ - (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID { dispatch_async(_storageDelegateQueue, ^{ [self _clearStoredClusterDataForNodeID:nodeID]; - NSArray * nodeIndex = [self _fetchNodeIndex]; - NSMutableArray * nodeIndexCopy = [nodeIndex mutableCopy]; - [nodeIndexCopy removeObject:nodeID]; - if (nodeIndex.count != nodeIndexCopy.count) { + + std::lock_guard lock(self->_nodeArrayLock); + auto oldCount = self->_nodesWithAttributeInfo.count; + [self->_nodesWithAttributeInfo removeObject:nodeID]; + if (self->_nodesWithAttributeInfo.count != oldCount) { BOOL success; - if (nodeIndexCopy.count) { - success = [self _storeNodeIndex:nodeIndexCopy]; + if (self->_nodesWithAttributeInfo.count) { + success = [self _storeNodeIndex:self->_nodesWithAttributeInfo]; } else { success = [self _deleteNodeIndex]; } if (!success) { - MTR_LOG_ERROR("Store failed in clearStoredAttributesForNodeID for nodeIndex (%lu)", static_cast(nodeIndexCopy.count)); + MTR_LOG_ERROR("Store failed in clearStoredAttributesForNodeID for nodeIndex (%lu)", static_cast(self->_nodesWithAttributeInfo.count)); } } }); @@ -804,12 +845,12 @@ - (void)clearAllStoredClusterData { dispatch_async(_storageDelegateQueue, ^{ // Fetch node index - NSArray * nodeIndex = [self _fetchNodeIndex]; - - for (NSNumber * nodeID in nodeIndex) { + std::lock_guard lock(self->_nodeArrayLock); + for (NSNumber * nodeID in self->_nodesWithAttributeInfo) { [self _clearStoredClusterDataForNodeID:nodeID]; } + [self->_nodesWithAttributeInfo removeAllObjects]; BOOL success = [self _deleteNodeIndex]; if (!success) { MTR_LOG_ERROR("Delete failed for nodeIndex"); @@ -826,14 +867,13 @@ - (void)clearAllStoredClusterData __block NSMutableDictionary * clusterDataToReturn = nil; dispatch_sync(_storageDelegateQueue, ^{ - // Fetch node index - NSArray * nodeIndex = [self _fetchNodeIndex]; + std::lock_guard lock(self->_nodeArrayLock); #if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG("Fetch got %lu values for nodeIndex", static_cast(nodeIndex.count)); + MTR_LOG("Fetch got %lu values for nodeIndex", static_cast(self->_nodesWithAttributeInfo.count)); #endif - if (![nodeIndex containsObject:nodeID]) { + if (![self->_nodesWithAttributeInfo containsObject:nodeID]) { // Sanity check and delete if nodeID exists in index NSArray * endpointIndex = [self _fetchEndpointIndexForNodeID:nodeID]; if (endpointIndex) { @@ -1086,14 +1126,13 @@ - (void)storeClusterData:(NSDictionary } // Check if node index needs updating / creation - NSArray * nodeIndex = [self _fetchNodeIndex]; NSArray * nodeIndexToStore = nil; - if (!nodeIndex) { - // Ensure node index exists - MTR_LOG("No entry found for for nodeIndex - creating for node 0x%016llX", nodeID.unsignedLongLongValue); - nodeIndexToStore = [NSArray arrayWithObject:nodeID]; - } else if (![nodeIndex containsObject:nodeID]) { - nodeIndexToStore = [nodeIndex arrayByAddingObject:nodeID]; + { + std::lock_guard lock(self->_nodeArrayLock); + if (![self->_nodesWithAttributeInfo containsObject:nodeID]) { + [self->_nodesWithAttributeInfo addObject:nodeID]; + nodeIndexToStore = [self->_nodesWithAttributeInfo copy]; + } } if (nodeIndexToStore) { @@ -1206,6 +1245,27 @@ - (void)synchronouslyPerformBlock:(void (^_Nullable)(void))block }); } +- (NSArray *)nodesWithStoredData +{ + // We have three types of stored data: + // + // 1) Attribute data + // 2) Session resumption data + // 3) Device data. + // + // Items 1 and 2 come with node indices. Item 3 does not, but in practice + // we should have device data if and only if we have attribute data for that + // node ID, barring odd error conditions. + // + // TODO: Consider changing how we store device data so we can easily recover + // the relevant set of node IDs. + NSMutableSet * nodeSet = [NSMutableSet set]; + std::lock_guard lock(_nodeArrayLock); + [nodeSet addObjectsFromArray:_nodesWithResumptionInfo]; + [nodeSet addObjectsFromArray:_nodesWithAttributeInfo]; + return [nodeSet allObjects]; +} + @end @implementation MTRCASESessionResumptionInfo diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm b/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm index 4c427e7dd9fbcb..04b541fc7783a6 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm @@ -973,6 +973,25 @@ - (BOOL)commissionNodeWithID:(NSNumber *)nodeID if (commissioningParams.threadOperationalDataset) { params.SetThreadOperationalDataset(AsByteSpan(commissioningParams.threadOperationalDataset)); } + if (commissioningParams.acceptedTermsAndConditions && commissioningParams.acceptedTermsAndConditionsVersion) { + if (!chip::CanCastTo([commissioningParams.acceptedTermsAndConditions unsignedIntValue])) { + MTR_LOG_ERROR("%@ Error: acceptedTermsAndConditions value should be between 0 and 65535", self); + *error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_INTEGER_VALUE]; + return NO; + } + + if (!chip::CanCastTo([commissioningParams.acceptedTermsAndConditionsVersion unsignedIntValue])) { + MTR_LOG_ERROR("%@ Error: acceptedTermsAndConditionsVersion value should be between 0 and 65535", self); + *error = [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_INTEGER_VALUE]; + return NO; + } + + chip::Controller::TermsAndConditionsAcknowledgement termsAndConditionsAcknowledgement = { + .acceptedTermsAndConditions = static_cast([commissioningParams.acceptedTermsAndConditions unsignedIntValue]), + .acceptedTermsAndConditionsVersion = static_cast([commissioningParams.acceptedTermsAndConditionsVersion unsignedIntValue]) + }; + params.SetTermsAndConditionsAcknowledgement(termsAndConditionsAcknowledgement); + } params.SetSkipCommissioningComplete(commissioningParams.skipCommissioningComplete); if (commissioningParams.wifiSSID) { chip::ByteSpan ssid = AsByteSpan(commissioningParams.wifiSSID); @@ -1720,6 +1739,16 @@ - (nullable NSNumber *)neededReadPrivilegeForClusterID:(NSNumber *)clusterID att return nil; } +- (NSArray *)nodesWithStoredData +{ + if (!self.controllerDataStore) { + // We have nothing stored, if we have no way to store. + return @[]; + } + + return [self.controllerDataStore nodesWithStoredData]; +} + @end /** diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index 72c7151355021c..ac8fa523416f80 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -64,6 +64,11 @@ @implementation MTRDeviceController_XPC : (NSNumber *) nodeID, deleteNodeID : (NSNumber *) nodeID) +MTR_DEVICECONTROLLER_SIMPLE_REMOTE_XPC_GETTER(nodesWithStoredData, + NSArray *, + @[], // Default return value + getNodesWithStoredDataWithReply) + - (void)_updateRegistrationInfo { NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary]; @@ -132,7 +137,6 @@ - (NSXPCInterface *)_interfaceForServerProtocol NSMutableSet * allowedClasses = [MTRDeviceController_XPC _allowedClasses]; [allowedClasses addObjectsFromArray:@[ [MTRCommandPath class], - [MTRAttributePath class], ]]; [interface setClasses:allowedClasses @@ -140,6 +144,22 @@ - (NSXPCInterface *)_interfaceForServerProtocol argumentIndex:0 ofReply:YES]; + // invokeCommands has the same reply types as invokeCommandWithEndpointID. + [interface setClasses:allowedClasses + forSelector:@selector(deviceController:nodeID:invokeCommands:completion:) + argumentIndex:0 + ofReply:YES]; + + // invokeCommands gets handed MTRCommandWithRequiredResponse (which includes + // MTRCommandPath, which is already in allowedClasses). + [allowedClasses addObjectsFromArray:@[ + [MTRCommandWithRequiredResponse class], + ]]; + [interface setClasses:allowedClasses + forSelector:@selector(deviceController:nodeID:invokeCommands:completion:) + argumentIndex:2 + ofReply:NO]; + // readAttributePaths: gets handed an array of MTRAttributeRequestPath. allowedClasses = [MTRDeviceController_XPC _allowedClasses]; [allowedClasses addObjectsFromArray:@[ diff --git a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm index cb92e52a1dac9f..0434f4890c2178 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_Concrete.mm @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2022-2023 Project CHIP Authors + * Copyright (c) 2022-2025 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. @@ -3306,6 +3306,127 @@ - (void)_invokeCommandWithEndpointID:(NSNumber *)endpointID commandFields]; } +- (BOOL)_invokeResponse:(MTRDeviceResponseValueDictionary)response matchesRequiredResponse:(NSDictionary *)requiredResponse +{ + if (response[MTRDataKey] == nil) { + MTR_LOG_ERROR("%@ invokeCommands expects a data response for %@ but got no data", self, response[MTRCommandPathKey]); + return NO; + } + + MTRDeviceDataValueDictionary data = response[MTRDataKey]; + if (![MTRStructureValueType isEqual:data[MTRTypeKey]]) { + MTR_LOG_ERROR("%@ invokeCommands data value %@ for command response for %@ is not a structure", self, data, response[MTRCommandPathKey]); + return NO; + } + + NSArray *> * fields = data[MTRValueKey]; + + for (NSNumber * fieldID in requiredResponse) { + // Check that this field is present in the response. + MTRDeviceDataValueDictionary _Nullable fieldValue = nil; + for (NSDictionary * field in fields) { + if ([fieldID isEqual:field[MTRContextTagKey]]) { + fieldValue = field[MTRDataKey]; + break; + } + } + + if (fieldValue == nil) { + MTR_LOG_ERROR("%@ invokeCommands response for %@ does not have a field with ID %@", self, response[MTRCommandPathKey], fieldID); + return NO; + } + + auto * expected = requiredResponse[fieldID]; + if (![expected isEqual:fieldValue]) { + MTR_LOG_ERROR("%@ invokeCommands response for %@ field %@ got %@ but expected %@", self, response[MTRCommandPathKey], fieldID, fieldValue, expected); + return NO; + } + } + + return YES; +} + +- (void)invokeCommands:(NSArray *> *)commands + queue:(dispatch_queue_t)queue + completion:(MTRDeviceResponseHandler)completion +{ + // We will generally do our work on self.queue, and just dispatch to the provided queue when + // calling the provided completion. + auto nextCompletion = ^(BOOL allSucceededSoFar, NSArray * responses) { + dispatch_async(queue, ^{ + completion(responses, nil); + }); + }; + + // We want to invoke the command groups in order, stopping after failures as needed. Build up a + // linked list of groups via chaining the completions, with calls out to the original + // completion instead of going to the next list item when we want to stop. + for (NSArray * commandGroup in [commands reverseObjectEnumerator]) { + // We want to invoke all the commands in the group in order, propagating along the list of + // current responses. Build up that linked list of command invokes via chaining the completions. + for (MTRCommandWithRequiredResponse * command in [commandGroup reverseObjectEnumerator]) { + auto commandInvokeBlock = ^(BOOL allSucceededSoFar, NSArray * previousResponses) { + [self invokeCommandWithEndpointID:command.path.endpoint + clusterID:command.path.cluster + commandID:command.path.command + commandFields:command.commandFields + expectedValues:nil + expectedValueInterval:nil + queue:self.queue + completion:^(NSArray *> * responses, NSError * error) { + if (error != nil) { + nextCompletion(NO, [previousResponses arrayByAddingObject:@ { + MTRCommandPathKey : command.path, + MTRErrorKey : error, + }]); + return; + } + + if (responses.count != 1) { + // Very much unexpected for invoking a single command. + MTR_LOG_ERROR("%@ invokeCommands unexpectedly got multiple responses for %@", self, command.path); + nextCompletion(NO, [previousResponses arrayByAddingObject:@ { + MTRCommandPathKey : command.path, + MTRErrorKey : [MTRError errorForCHIPErrorCode:CHIP_ERROR_INTERNAL], + }]); + return; + } + + BOOL nextAllSucceeded = allSucceededSoFar; + MTRDeviceResponseValueDictionary response = responses[0]; + if (command.requiredResponse != nil && ![self _invokeResponse:response matchesRequiredResponse:command.requiredResponse]) { + nextAllSucceeded = NO; + } + + nextCompletion(nextAllSucceeded, [previousResponses arrayByAddingObject:response]); + }]; + }; + + nextCompletion = commandInvokeBlock; + } + + auto commandGroupInvokeBlock = ^(BOOL allSucceededSoFar, NSArray * previousResponses) { + if (allSucceededSoFar == NO) { + // Don't start a new command group if something failed in the + // previous one. Note that we might be running on self.queue here, so make sure we + // dispatch to the correct queue. + MTR_LOG_ERROR("%@ failed a preceding command, not invoking command group %@ or later ones", self, commandGroup); + dispatch_async(queue, ^{ + completion(previousResponses, nil); + }); + return; + } + + nextCompletion(allSucceededSoFar, previousResponses); + }; + + nextCompletion = commandGroupInvokeBlock; + } + + // Kick things off with a "everything succeeded so far and we have no responses yet". + nextCompletion(YES, @[]); +} + - (void)openCommissioningWindowWithSetupPasscode:(NSNumber *)setupPasscode discriminator:(NSNumber *)discriminator duration:(NSNumber *)duration diff --git a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm index bc5fa52b327236..31cf08287657d7 100644 --- a/src/darwin/Framework/CHIP/MTRDevice_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDevice_XPC.mm @@ -408,7 +408,9 @@ - (void)_invokeCommandWithEndpointID:(NSNumber *)endpointID @try { [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { MTR_LOG_ERROR("Invoke error: %@", error); - completion(nil, [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeGeneralError userInfo:nil]); + dispatch_async(queue, ^{ + completion(nil, [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeGeneralError userInfo:nil]); + }); }] deviceController:[[self deviceController] uniqueIdentifier] nodeID:[self nodeID] invokeCommandWithEndpointID:endpointID @@ -420,36 +422,93 @@ - (void)_invokeCommandWithEndpointID:(NSNumber *)endpointID timedInvokeTimeout:timeout serverSideProcessingTimeout:serverSideProcessingTimeout completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { - if (values == nil && error == nil) { - MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) without values or error", self, endpointID, clusterID, commandID); - completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); - return; - } - - if (error != nil && !MTR_SAFE_CAST(error, NSError)) { - MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) that has invalid error object: %@", self, endpointID, clusterID, commandID, error); - completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); - return; - } - - if (values != nil && !MTRInvokeResponseIsWellFormed(values)) { - MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) that has invalid data: %@", self, clusterID, commandID, values, values); - completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); - return; - } - - if (values != nil && error != nil) { - MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) with both values and error: %@, %@", self, endpointID, clusterID, commandID, values, error); - // Just propagate through the error. - completion(nil, error); - return; - } - - completion(values, error); + dispatch_async(queue, ^{ + if (values == nil && error == nil) { + MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) without values or error", self, endpointID, clusterID, commandID); + completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); + return; + } + + if (error != nil && !MTR_SAFE_CAST(error, NSError)) { + MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) that has invalid error object: %@", self, endpointID, clusterID, commandID, error); + completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); + return; + } + + if (values != nil && !MTRInvokeResponseIsWellFormed(values)) { + MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) that has invalid data: %@", self, clusterID, commandID, values, values); + completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); + return; + } + + if (values != nil && error != nil) { + MTR_LOG_ERROR("%@ got invoke response for (%@, %@, %@) with both values and error: %@, %@", self, endpointID, clusterID, commandID, values, error); + // Just propagate through the error. + completion(nil, error); + return; + } + + completion(values, error); + }); }]; } @catch (NSException * exception) { MTR_LOG_ERROR("Exception sending XPC message: %@", exception); - completion(nil, [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeGeneralError userInfo:nil]); + dispatch_async(queue, ^{ + completion(nil, [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeGeneralError userInfo:nil]); + }); + } +} + +- (void)invokeCommands:(NSArray *> *)commands + queue:(dispatch_queue_t)queue + completion:(MTRDeviceResponseHandler)completion +{ + NSXPCConnection * xpcConnection = [(MTRDeviceController_XPC *) [self deviceController] xpcConnection]; + + @try { + [[xpcConnection remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) { + MTR_LOG_ERROR("Error: %@", error); + dispatch_async(queue, ^{ + completion(nil, [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeGeneralError userInfo:nil]); + }); + }] deviceController:[[self deviceController] uniqueIdentifier] + nodeID:[self nodeID] + invokeCommands:commands + completion:^(NSArray * _Nullable responses, NSError * _Nullable error) { + dispatch_async(queue, ^{ + if (responses == nil && error == nil) { + MTR_LOG_ERROR("%@ got invoke responses for %@ without values or error", self, commands); + completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); + return; + } + + if (error != nil && !MTR_SAFE_CAST(error, NSError)) { + MTR_LOG_ERROR("%@ got invoke responses for %@ that has invalid error object: %@", self, commands, error); + completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); + return; + } + + if (responses != nil && !MTRInvokeResponseIsWellFormed(responses)) { + MTR_LOG_ERROR("%@ got invoke responses for %@ that has invalid data: %@", self, commands, responses); + completion(nil, [MTRError errorForCHIPErrorCode:CHIP_ERROR_INVALID_ARGUMENT]); + return; + } + + if (responses != nil && error != nil) { + MTR_LOG_ERROR("%@ got invoke responses for %@ with both responses and error: %@, %@", self, commands, responses, error); + // Just propagate through the error. + completion(nil, error); + return; + } + + completion(responses, nil); + }); + }]; + } @catch (NSException * exception) { + MTR_LOG_ERROR("Exception sending XPC message: %@", exception); + dispatch_async(queue, ^{ + completion(nil, [NSError errorWithDomain:MTRErrorDomain code:MTRErrorCodeGeneralError userInfo:nil]); + }); } } diff --git a/src/darwin/Framework/CHIP/Matter.h b/src/darwin/Framework/CHIP/Matter.h index bf643f654bf763..9f7211c682ece1 100644 --- a/src/darwin/Framework/CHIP/Matter.h +++ b/src/darwin/Framework/CHIP/Matter.h @@ -34,6 +34,7 @@ #import #import #import +#import #import #import #import diff --git a/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h b/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h index 1c57480565dacb..4e4f6a456de8be 100644 --- a/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h +++ b/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h @@ -52,6 +52,8 @@ MTR_AVAILABLE(ios(18.2), macos(15.2), watchos(11.2), tvos(18.2)) */ - (oneway void)deviceController:(NSUUID *)controller nodeID:(NSNumber *)nodeID downloadLogOfType:(MTRDiagnosticLogType)type timeout:(NSTimeInterval)timeout completion:(void (^)(NSURL * _Nullable url, NSError * _Nullable error))completion; +- (oneway void)deviceController:(NSUUID *)controller nodeID:(NSNumber *)nodeID invokeCommands:(NSArray *> *)commands completion:(MTRDeviceResponseHandler)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); + @end MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)) @@ -77,6 +79,7 @@ MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)) - (oneway void)deviceController:(NSUUID *)controller unregisterNodeID:(NSNumber *)nodeID; - (oneway void)deviceController:(NSUUID *)controller updateControllerConfiguration:(NSDictionary *)controllerState MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)); +- (oneway void)deviceController:(NSUUID *)controller getNodesWithStoredDataWithReply:(void (^)(NSArray *))reply MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)) diff --git a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m index 729e7a318a9213..71f6aa29fb35d2 100644 --- a/src/darwin/Framework/CHIPTests/MTRDeviceTests.m +++ b/src/darwin/Framework/CHIPTests/MTRDeviceTests.m @@ -5724,6 +5724,298 @@ - (void)test044_InvokeResponseWellFormedness } } +- (void)test045_MTRDeviceInvokeGroups +{ + __auto_type * device = [MTRDevice deviceWithNodeID:kDeviceId deviceController:sController]; + dispatch_queue_t queue = dispatch_get_main_queue(); + + // First test: Do an invoke with a single group with three commands, ensure + // that we get reasonable responses for them all. + + __auto_type * onPath = [MTRCommandPath commandPathWithEndpointID:@(1) + clusterID:@(MTRClusterIDTypeOnOffID) + commandID:@(MTRCommandIDTypeClusterOnOffCommandOnID)]; + __auto_type * togglePath = [MTRCommandPath commandPathWithEndpointID:@(1) + clusterID:@(MTRClusterIDTypeOnOffID) + commandID:@(MTRCommandIDTypeClusterOnOffCommandToggleID)]; + __auto_type * offPath = [MTRCommandPath commandPathWithEndpointID:@(1) + clusterID:@(MTRClusterIDTypeOnOffID) + commandID:@(MTRCommandIDTypeClusterOnOffCommandOffID)]; + + __auto_type * onCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:onPath commandFields:nil requiredResponse:nil]; + __auto_type * toggleCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:togglePath commandFields:nil requiredResponse:nil]; + __auto_type * offCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:offPath commandFields:nil requiredResponse:nil]; + + XCTestExpectation * simpleInvokeDone = [self expectationWithDescription:@"Invoke of a single 3-command group done"]; + [device invokeCommands:@[ @[ onCommand, toggleCommand, offCommand ] ] + queue:queue + completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertNotNil(values); + + // Successful invoke is represented as a value with the relevant + // command path and neither data nor error. + __auto_type expectedValues = @[ + @ { MTRCommandPathKey : onPath }, + @ { MTRCommandPathKey : togglePath }, + @ { MTRCommandPathKey : offPath }, + ]; + XCTAssertEqualObjects(values, expectedValues); + [simpleInvokeDone fulfill]; + }]; + + // 3 commands, so use triple the timeout. + [self waitForExpectations:@[ simpleInvokeDone ] timeout:(3 * kTimeoutInSeconds)]; + + // Second test: Do an invoke with three groups. First command in the first + // group fails, but we should still run all commands in that group. We + // should not run any commands in any other groups. + __auto_type * failingTogglePath = [MTRCommandPath commandPathWithEndpointID:@(1000) // No such endpoint + clusterID:@(MTRClusterIDTypeOnOffID) + commandID:@(MTRCommandIDTypeClusterOnOffCommandToggleID)]; + __auto_type * failingToggleCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:failingTogglePath commandFields:nil requiredResponse:nil]; + + XCTestExpectation * failingWithStatusInvokeDone = [self expectationWithDescription:@"Invoke of commands where one fails with a status done"]; + [device invokeCommands:@[ @[ failingToggleCommand, offCommand ], @[ onCommand, toggleCommand ], @[ failingToggleCommand ] ] + queue:queue + completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertNotNil(values); + + // We should not have anything for groups after the first one + XCTAssertEqual(values.count, 2); + NSDictionary * firstValue = values[0]; + XCTAssertEqualObjects(firstValue[MTRCommandPathKey], failingTogglePath); + XCTAssertNil(firstValue[MTRDataKey]); + XCTAssertNotNil(firstValue[MTRErrorKey]); + XCTAssertTrue([MTRErrorTestUtils error:firstValue[MTRErrorKey] isInteractionModelError:MTRInteractionErrorCodeUnsupportedEndpoint]); + + XCTAssertEqualObjects(values[1], @ { MTRCommandPathKey : offPath }); + + [failingWithStatusInvokeDone fulfill]; + }]; + + // 2 commands actually run, so use double the timeout. + [self waitForExpectations:@[ failingWithStatusInvokeDone ] timeout:(2 * kTimeoutInSeconds)]; + + // Third test: Do an invoke with three groups. One of the commands in the + // first group expects a data response but gets a status, which should be + // treated as a failure. + __auto_type * onCommandExpectingData = [[MTRCommandWithRequiredResponse alloc] initWithPath:onPath commandFields:nil requiredResponse:@{ + @(0) : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @(0), + } + }]; + + XCTestExpectation * failingWithMissingDataInvokeDone = [self expectationWithDescription:@"Invoke of commands where one fails with missing data done"]; + [device invokeCommands:@[ @[ toggleCommand, onCommandExpectingData, offCommand ], @[ onCommand, toggleCommand ], @[ failingToggleCommand ] ] + queue:queue + completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertNotNil(values); + + // We should not have anything for groups after the first one + __auto_type * expectedValues = @[ + @ { MTRCommandPathKey : togglePath }, + @ { MTRCommandPathKey : onPath }, + @ { MTRCommandPathKey : offPath }, + ]; + XCTAssertEqualObjects(values, expectedValues); + + [failingWithMissingDataInvokeDone fulfill]; + }]; + + // 3 commands actually run, so use triple the timeout. + [self waitForExpectations:@[ failingWithMissingDataInvokeDone ] timeout:(3 * kTimeoutInSeconds)]; + + // Fourth test: do an invoke with two groups. One of the commands in the + // first group expects to not get a falure status and gets data, which + // should be treated as success. + __auto_type * updateFabricLabelPath = [MTRCommandPath commandPathWithEndpointID:@(0) + clusterID:@(MTRClusterIDTypeOperationalCredentialsID) + commandID:@(MTRCommandIDTypeClusterOperationalCredentialsCommandUpdateFabricLabelID)]; + __auto_type * nocResponsePath = [MTRCommandPath commandPathWithEndpointID:@(0) + clusterID:@(MTRClusterIDTypeOperationalCredentialsID) + commandID:@(MTRCommandIDTypeClusterOperationalCredentialsCommandNOCResponseID)]; + __auto_type * updateFabricLabelFields = @{ + MTRTypeKey : MTRStructureValueType, + MTRValueKey : @[ + @{ + MTRContextTagKey : @(0), + MTRDataKey : @ { + MTRTypeKey : MTRUTF8StringValueType, + MTRValueKey : @"newlabel", + }, + }, + ] + }; + __auto_type * updateFabricLabelNotExpectingFailureCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:updateFabricLabelPath commandFields:updateFabricLabelFields requiredResponse:nil]; + + XCTestExpectation * updateFabricLabelNotExpectingFailureExpectation = [self expectationWithDescription:@"Invoke of commands where no failure is expected and data response is received done"]; + [device invokeCommands:@[ @[ updateFabricLabelNotExpectingFailureCommand, onCommand ], @[ offCommand ] ] + queue:queue + completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertNotNil(values); + + XCTAssertEqual(values.count, 3); + + NSDictionary * updateFabricLabelResponse = values[0]; + XCTAssertEqualObjects(updateFabricLabelResponse[MTRCommandPathKey], nocResponsePath); + NSDictionary * responseData = updateFabricLabelResponse[MTRDataKey]; + XCTAssertEqualObjects(responseData[MTRTypeKey], MTRStructureValueType); + NSArray *> * responseFields = responseData[MTRValueKey]; + XCTAssertTrue(responseFields.count > 0); + + for (NSDictionary * field in responseFields) { + if ([@(0) isEqual:field[MTRContextTagKey]]) { + // Check that this in fact succeeded. + NSDictionary * fieldValue = field[MTRDataKey]; + XCTAssertEqualObjects(fieldValue[MTRTypeKey], MTRUnsignedIntegerValueType); + XCTAssertEqualObjects(fieldValue[MTRValueKey], @(MTROperationalCredentialsNodeOperationalCertStatusOK)); + } + } + + XCTAssertEqualObjects(values[1], @ { MTRCommandPathKey : onPath }); + XCTAssertEqualObjects(values[2], @ { MTRCommandPathKey : offPath }); + + [updateFabricLabelNotExpectingFailureExpectation fulfill]; + }]; + + // 3 commands actually run, so use triple the timeout. + [self waitForExpectations:@[ updateFabricLabelNotExpectingFailureExpectation ] timeout:(3 * kTimeoutInSeconds)]; + + // Fifth test: do an invoke with two groups. One of the commands in the + // first group expects to get a data response and gets it, which should be + // treated as success. + __auto_type * updateFabricLabelExpectingOKCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:updateFabricLabelPath commandFields:updateFabricLabelFields requiredResponse:@{ + @(0) : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @(MTROperationalCredentialsNodeOperationalCertStatusOK), + }, + }]; + + XCTestExpectation * updateFabricLabelExpectingOKExpectation = [self expectationWithDescription:@"Invoke of commands where data response is expected and received done"]; + [device invokeCommands:@[ @[ updateFabricLabelExpectingOKCommand, onCommand ], @[ offCommand ] ] + queue:queue + completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertNotNil(values); + + XCTAssertEqual(values.count, 3); + + NSDictionary * updateFabricLabelResponse = values[0]; + XCTAssertEqualObjects(updateFabricLabelResponse[MTRCommandPathKey], nocResponsePath); + NSDictionary * responseData = updateFabricLabelResponse[MTRDataKey]; + XCTAssertEqualObjects(responseData[MTRTypeKey], MTRStructureValueType); + NSArray *> * responseFields = responseData[MTRValueKey]; + XCTAssertTrue(responseFields.count > 0); + + for (NSDictionary * field in responseFields) { + if ([@(0) isEqual:field[MTRContextTagKey]]) { + // Check that this in fact succeeded. + NSDictionary * fieldValue = field[MTRDataKey]; + XCTAssertEqualObjects(fieldValue[MTRTypeKey], MTRUnsignedIntegerValueType); + XCTAssertEqualObjects(fieldValue[MTRValueKey], @(MTROperationalCredentialsNodeOperationalCertStatusOK)); + } + } + + XCTAssertEqualObjects(values[1], @ { MTRCommandPathKey : onPath }); + XCTAssertEqualObjects(values[2], @ { MTRCommandPathKey : offPath }); + + [updateFabricLabelExpectingOKExpectation fulfill]; + }]; + + // 3 commands actually run, so use triple the timeout. + [self waitForExpectations:@[ updateFabricLabelExpectingOKExpectation ] timeout:(3 * kTimeoutInSeconds)]; + + // Sixth test: do an invoke with two groups. One of the commands in the + // first group expects to get a data response with a field that it does not get, which should be + // treated as failure. + __auto_type * updateFabricLabelExpectingNonexistentFieldCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:updateFabricLabelPath commandFields:updateFabricLabelFields requiredResponse:@{ + @(20) : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @(MTROperationalCredentialsNodeOperationalCertStatusOK), + }, + }]; + + XCTestExpectation * updateFabricLabelExpectingNonexistentFieldExpectation = [self expectationWithDescription:@"Invoke of commands where data response is expected but the received one is missing a field done"]; + [device invokeCommands:@[ @[ updateFabricLabelExpectingNonexistentFieldCommand, onCommand ], @[ offCommand ] ] + queue:queue + completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertNotNil(values); + + XCTAssertEqual(values.count, 2); + + NSDictionary * updateFabricLabelResponse = values[0]; + XCTAssertEqualObjects(updateFabricLabelResponse[MTRCommandPathKey], nocResponsePath); + NSDictionary * responseData = updateFabricLabelResponse[MTRDataKey]; + XCTAssertEqualObjects(responseData[MTRTypeKey], MTRStructureValueType); + NSArray *> * responseFields = responseData[MTRValueKey]; + XCTAssertTrue(responseFields.count > 0); + + for (NSDictionary * field in responseFields) { + if ([@(0) isEqual:field[MTRContextTagKey]]) { + // Check that this in fact succeeded. + NSDictionary * fieldValue = field[MTRDataKey]; + XCTAssertEqualObjects(fieldValue[MTRTypeKey], MTRUnsignedIntegerValueType); + XCTAssertEqualObjects(fieldValue[MTRValueKey], @(MTROperationalCredentialsNodeOperationalCertStatusOK)); + } + } + + XCTAssertEqualObjects(values[1], @ { MTRCommandPathKey : onPath }); + + [updateFabricLabelExpectingNonexistentFieldExpectation fulfill]; + }]; + + // 2 commands actually run, so use double the timeout. + [self waitForExpectations:@[ updateFabricLabelExpectingNonexistentFieldExpectation ] timeout:(2 * kTimeoutInSeconds)]; + + // Seventh test: do an invoke with two groups. One of the commands in the // first group expects to get a data response with a field value that does + // not match what it gets, which should be treated as a failure. + __auto_type * updateFabricLabelExpectingWrongValueCommand = [[MTRCommandWithRequiredResponse alloc] initWithPath:updateFabricLabelPath commandFields:updateFabricLabelFields requiredResponse:@{ + @(0) : @ { + MTRTypeKey : MTRUnsignedIntegerValueType, + MTRValueKey : @(MTROperationalCredentialsNodeOperationalCertStatusFabricConflict), + }, + }]; + + XCTestExpectation * updateFabricLabelExpectingWrongValueExpectation = [self expectationWithDescription:@"Invoke of commands where data response is expected but with the wrong value done"]; + [device invokeCommands:@[ @[ updateFabricLabelExpectingWrongValueCommand, onCommand ], @[ offCommand ] ] + queue:queue + completion:^(NSArray *> * _Nullable values, NSError * _Nullable error) { + XCTAssertNil(error); + XCTAssertNotNil(values); + + XCTAssertEqual(values.count, 2); + + NSDictionary * updateFabricLabelResponse = values[0]; + XCTAssertEqualObjects(updateFabricLabelResponse[MTRCommandPathKey], nocResponsePath); + NSDictionary * responseData = updateFabricLabelResponse[MTRDataKey]; + XCTAssertEqualObjects(responseData[MTRTypeKey], MTRStructureValueType); + NSArray *> * responseFields = responseData[MTRValueKey]; + XCTAssertTrue(responseFields.count > 0); + + for (NSDictionary * field in responseFields) { + if ([@(0) isEqual:field[MTRContextTagKey]]) { + // Check that this in fact succeeded. + NSDictionary * fieldValue = field[MTRDataKey]; + XCTAssertEqualObjects(fieldValue[MTRTypeKey], MTRUnsignedIntegerValueType); + XCTAssertEqualObjects(fieldValue[MTRValueKey], @(MTROperationalCredentialsNodeOperationalCertStatusOK)); + } + } + + XCTAssertEqualObjects(values[1], @ { MTRCommandPathKey : onPath }); + + [updateFabricLabelExpectingWrongValueExpectation fulfill]; + }]; + + // 2 commands actually run, so use double the timeout. + [self waitForExpectations:@[ updateFabricLabelExpectingWrongValueExpectation ] timeout:(2 * kTimeoutInSeconds)]; +} + @end @interface MTRDeviceEncoderTests : XCTestCase diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index 2abfda4fee4b8b..ca733c0b2f3336 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -1521,6 +1521,8 @@ - (void)test008_TestDataStoreDirect dispatch_sync(_storageQueue, ^{ [storageDelegate controller:controller storeValues:testBulkValues securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; }); + // Since we messed with the node index, tell the data store to re-sync it's cache. + [controller.controllerDataStore unitTestRereadNodeIndex]; // Verify that the store resulted in the correct values NSDictionary * dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:@(3001)]; XCTAssertEqualObjects(dataStoreClusterData, bulkTestClusterDataDictionary); @@ -1772,6 +1774,10 @@ - (void)test010_TestDataStoreMTRDeviceWithBulkReadWrite XCTAssertNotNil([dataStore findResumptionInfoByNodeID:deviceID]); XCTAssertNotNil([dataStore getStoredDeviceDataForNodeID:deviceID]); XCTAssertNotNil([dataStore getStoredClusterDataForNodeID:deviceID]); + __auto_type * nodesWithStoredData = [controller nodesWithStoredData]; + XCTAssertTrue([nodesWithStoredData containsObject:deviceID]); + XCTAssertEqualObjects(nodesWithStoredData, [dataStore nodesWithStoredData]); + XCTAssertEqualObjects(nodesWithStoredData, deviceAttributeCounts.allKeys); [controller forgetDeviceWithNodeID:deviceID]; deviceAttributeCounts = [controller unitTestGetDeviceAttributeCounts]; @@ -1779,6 +1785,9 @@ - (void)test010_TestDataStoreMTRDeviceWithBulkReadWrite XCTAssertNil([dataStore findResumptionInfoByNodeID:deviceID]); XCTAssertNil([dataStore getStoredDeviceDataForNodeID:deviceID]); XCTAssertNil([dataStore getStoredClusterDataForNodeID:deviceID]); + nodesWithStoredData = [controller nodesWithStoredData]; + XCTAssertFalse([nodesWithStoredData containsObject:deviceID]); + XCTAssertEqualObjects(nodesWithStoredData, [dataStore nodesWithStoredData]); [controller shutdown]; XCTAssertFalse([controller isRunning]); @@ -2576,7 +2585,7 @@ - (void)testControllerServer @{ MTRAttributePathKey : globalAttributePath(clusterId1, MTRAttributeIDTypeGlobalAttributeAttributeListID), MTRDataKey : arrayOfUnsignedIntegersValue(@[ - attributeId1, @(0xFFF8), @(0xFFF9), @(0xFFFB), attributeId2, @(0xFFFC), @(0xFFFD) + attributeId1, attributeId2, @(0xFFFC), @(0xFFFD), @(0xFFF8), @(0xFFF9), @(0xFFFB) ]), }, @@ -2603,7 +2612,7 @@ - (void)testControllerServer @{ MTRAttributePathKey : globalAttributePath(clusterId2, MTRAttributeIDTypeGlobalAttributeAttributeListID), MTRDataKey : arrayOfUnsignedIntegersValue(@[ - @0xFFF8, @(0xFFF9), @(0xFFFB), attributeId2, @(0xFFFC), @(0xFFFD) + attributeId2, @(0xFFFC), @(0xFFFD), @0xFFF8, @(0xFFF9), @(0xFFFB) ]), }, @@ -2646,7 +2655,7 @@ - (void)testControllerServer @{ MTRAttributePathKey : globalAttributePath(@(MTRClusterIDTypeDescriptorID), MTRAttributeIDTypeGlobalAttributeAttributeListID), MTRDataKey : arrayOfUnsignedIntegersValue(@[ - @(0), @(1), @(2), @(3), @(0xFFF8), @(0xFFF9), @(0xFFFB), @(0xFFFC), @(0xFFFD) + @(0), @(1), @(2), @(3), @(0xFFFC), @(0xFFFD), @(0xFFF8), @(0xFFF9), @(0xFFFB) ]), }, diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h index e2a9ae76df964e..3b6c3da0ea65ac 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h @@ -36,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID; - (void)clearAllStoredClusterData; - (void)unitTestPruneEmptyStoredClusterDataBranches; +- (void)unitTestRereadNodeIndex; - (NSString *)_endpointIndexKeyForNodeID:(NSNumber *)nodeID; - (NSString *)_clusterIndexKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID; - (NSString *)_clusterDataKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID; @@ -43,6 +44,7 @@ NS_ASSUME_NONNULL_BEGIN - (nullable NSArray *)_fetchClusterIndexForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID; - (nullable MTRDeviceClusterData *)_fetchClusterDataForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID; - (nullable NSDictionary *)getStoredDeviceDataForNodeID:(NSNumber *)nodeID; +- (NSArray *)nodesWithStoredData; @end // Declare internal methods for testing diff --git a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj index 61f5bdf3d3c313..c1b0cb48c3fc97 100644 --- a/src/darwin/Framework/Matter.xcodeproj/project.pbxproj +++ b/src/darwin/Framework/Matter.xcodeproj/project.pbxproj @@ -159,6 +159,8 @@ 512431282BA0C8BF000BC136 /* SetMRPParametersCommand.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5124311C2BA0C09A000BC136 /* SetMRPParametersCommand.mm */; }; 512431292BA0C8BF000BC136 /* ResetMRPParametersCommand.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5124311A2BA0C09A000BC136 /* ResetMRPParametersCommand.mm */; }; 5129BCFD26A9EE3300122DDF /* MTRError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5129BCFC26A9EE3300122DDF /* MTRError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 512E8E7A2D52F7B6009407E3 /* MTRCommandWithRequiredResponse.mm in Sources */ = {isa = PBXBuildFile; fileRef = 512E8E792D52F7B6009407E3 /* MTRCommandWithRequiredResponse.mm */; }; + 512E8E7B2D52F7B6009407E3 /* MTRCommandWithRequiredResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = 512E8E782D52F7B6009407E3 /* MTRCommandWithRequiredResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5131BF662BE2E1B000D5D6BC /* MTRTestCase.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5131BF642BE2E1B000D5D6BC /* MTRTestCase.mm */; }; 51339B1F2A0DA64D00C798C1 /* MTRCertificateValidityTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 51339B1E2A0DA64D00C798C1 /* MTRCertificateValidityTests.m */; }; 5136661328067D550025EDAE /* MTRDeviceController_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5136660F28067D540025EDAE /* MTRDeviceController_Internal.h */; }; @@ -453,13 +455,15 @@ CF3B63D12CA31E71003C1C87 /* MTROTAImageTransferHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = CF3B63CD2CA31E71003C1C87 /* MTROTAImageTransferHandler.mm */; }; CF3B63D22CA31E71003C1C87 /* MTROTAUnsolicitedBDXMessageHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = CF3B63CE2CA31E71003C1C87 /* MTROTAUnsolicitedBDXMessageHandler.mm */; }; D4288E872C8A273F002FEC53 /* MTRDevice_XPC_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D4288E862C8A273F002FEC53 /* MTRDevice_XPC_Internal.h */; }; + B4D67A922D527F4A00C49965 /* DCLClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B4D67A8E2D527F4A00C49965 /* DCLClient.cpp */; }; + B4D67A932D527F4A00C49965 /* DisplayTermsAndConditions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B4D67A8F2D527F4A00C49965 /* DisplayTermsAndConditions.cpp */; }; + B4D67A952D527F4A00C49965 /* JsonSchemaMacros.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B4D67A912D527F4A00C49965 /* JsonSchemaMacros.cpp */; }; + B4D67A9B2D538E9700C49965 /* HTTPSRequest.mm in Sources */ = {isa = PBXBuildFile; fileRef = B4D67A992D538E9700C49965 /* HTTPSRequest.mm */; }; D444F9A72C6E8F9D007761E5 /* MTRXPCServerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D444F9A62C6E8F9D007761E5 /* MTRXPCServerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D444F9AA2C6E9A08007761E5 /* MTRXPCClientProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D444F9A82C6E99CA007761E5 /* MTRXPCClientProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; D4772A46285AE98400383630 /* MTRClusterConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = D4772A45285AE98300383630 /* MTRClusterConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; E04AC67D2BEEA17F00BA409B /* ember-io-storage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E04AC67B2BEEA17F00BA409B /* ember-io-storage.cpp */; }; E04AC67E2BEEA17F00BA409B /* ember-io-storage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E04AC67B2BEEA17F00BA409B /* ember-io-storage.cpp */; }; - E04AC67F2BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E04AC67C2BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp */; }; - E04AC6802BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E04AC67C2BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -668,6 +672,8 @@ 5124311B2BA0C09A000BC136 /* SetMRPParametersCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SetMRPParametersCommand.h; sourceTree = ""; }; 5124311C2BA0C09A000BC136 /* SetMRPParametersCommand.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SetMRPParametersCommand.mm; sourceTree = ""; }; 5129BCFC26A9EE3300122DDF /* MTRError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRError.h; sourceTree = ""; }; + 512E8E782D52F7B6009407E3 /* MTRCommandWithRequiredResponse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRCommandWithRequiredResponse.h; sourceTree = ""; }; + 512E8E792D52F7B6009407E3 /* MTRCommandWithRequiredResponse.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRCommandWithRequiredResponse.mm; sourceTree = ""; }; 5131BF642BE2E1B000D5D6BC /* MTRTestCase.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTRTestCase.mm; sourceTree = ""; }; 5131BF652BE2E1B000D5D6BC /* MTRTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRTestCase.h; sourceTree = ""; }; 51339B1E2A0DA64D00C798C1 /* MTRCertificateValidityTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MTRCertificateValidityTests.m; sourceTree = ""; }; @@ -959,6 +965,10 @@ CF3B63CD2CA31E71003C1C87 /* MTROTAImageTransferHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTROTAImageTransferHandler.mm; sourceTree = ""; }; CF3B63CE2CA31E71003C1C87 /* MTROTAUnsolicitedBDXMessageHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MTROTAUnsolicitedBDXMessageHandler.mm; sourceTree = ""; }; D4288E862C8A273F002FEC53 /* MTRDevice_XPC_Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRDevice_XPC_Internal.h; sourceTree = ""; }; + B4D67A8E2D527F4A00C49965 /* DCLClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DCLClient.cpp; path = commands/dcl/DCLClient.cpp; sourceTree = ""; }; + B4D67A8F2D527F4A00C49965 /* DisplayTermsAndConditions.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DisplayTermsAndConditions.cpp; path = commands/dcl/DisplayTermsAndConditions.cpp; sourceTree = ""; }; + B4D67A912D527F4A00C49965 /* JsonSchemaMacros.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = JsonSchemaMacros.cpp; path = commands/dcl/JsonSchemaMacros.cpp; sourceTree = ""; }; + B4D67A992D538E9700C49965 /* HTTPSRequest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HTTPSRequest.mm; sourceTree = ""; }; D437613E285BDC0D0051FEA2 /* MTRErrorTestUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRErrorTestUtils.h; sourceTree = ""; }; D437613F285BDC0D0051FEA2 /* MTRTestKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRTestKeys.h; sourceTree = ""; }; D4376140285BDC0D0051FEA2 /* MTRTestStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRTestStorage.h; sourceTree = ""; }; @@ -966,7 +976,6 @@ D444F9A82C6E99CA007761E5 /* MTRXPCClientProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MTRXPCClientProtocol.h; sourceTree = ""; }; D4772A45285AE98300383630 /* MTRClusterConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTRClusterConstants.h; sourceTree = ""; }; E04AC67B2BEEA17F00BA409B /* ember-io-storage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ember-io-storage.cpp"; path = "util/ember-io-storage.cpp"; sourceTree = ""; }; - E04AC67C2BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ember-global-attribute-access-interface.cpp"; path = "util/ember-global-attribute-access-interface.cpp"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1027,6 +1036,7 @@ 037C3D7B2991BD4F00B7EEE2 /* commands */ = { isa = PBXGroup; children = ( + B4D67A9A2D538E9700C49965 /* dcl */, B43B39E92CB859A5006AA284 /* memory */, 5124311D2BA0C09A000BC136 /* configuration */, B4FCD56C2B603A6300832859 /* bdx */, @@ -1153,6 +1163,9 @@ 039546872991C400006D42A8 /* chip-tool */ = { isa = PBXGroup; children = ( + B4D67A8E2D527F4A00C49965 /* DCLClient.cpp */, + B4D67A8F2D527F4A00C49965 /* DisplayTermsAndConditions.cpp */, + B4D67A912D527F4A00C49965 /* JsonSchemaMacros.cpp */, 0382FA2F2992F40C00247BBB /* ComplexArgumentParser.cpp */, 0382FA2B2992F06C00247BBB /* Commands.cpp */, 0382FA292992F05E00247BBB /* Command.cpp */, @@ -1223,7 +1236,6 @@ 5143041F2914CED9004DC7FE /* generic-callback-stubs.cpp */, 514C79F22B62ED5500DD6D7B /* attribute-storage.cpp */, 514C79EF2B62ADDA00DD6D7B /* descriptor.cpp */, - E04AC67C2BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp */, E04AC67B2BEEA17F00BA409B /* ember-io-storage.cpp */, 516415FE2B6B132200D5CE11 /* DataModelHandler.cpp */, 514C79F52B62F0B900DD6D7B /* util.cpp */, @@ -1502,6 +1514,8 @@ 5178E67F2AE098510069DF72 /* MTRCommandTimedCheck.h */, 51FE723E2ACDEF3E00437032 /* MTRCommandPayloadExtensions_Internal.h */, 5178E6802AE098520069DF72 /* MTRCommissionableBrowserResult_Internal.h */, + 512E8E782D52F7B6009407E3 /* MTRCommandWithRequiredResponse.h */, + 512E8E792D52F7B6009407E3 /* MTRCommandWithRequiredResponse.mm */, 3D010DCD2D408FA300CFFA02 /* MTRCommissioneeInfo.h */, 3D010DD12D4091C800CFFA02 /* MTRCommissioneeInfo_Internal.h */, 3D010DCE2D408FA300CFFA02 /* MTRCommissioneeInfo.mm */, @@ -1754,6 +1768,14 @@ path = "../common/websocket-server"; sourceTree = ""; }; + B4D67A9A2D538E9700C49965 /* dcl */ = { + isa = PBXGroup; + children = ( + B4D67A992D538E9700C49965 /* HTTPSRequest.mm */, + ); + path = dcl; + sourceTree = ""; + }; B4E262182AA0CFFE00DBA5BC /* delay */ = { isa = PBXGroup; children = ( @@ -1927,6 +1949,7 @@ AF1CB86E2874B03B00865A96 /* MTROTAProviderDelegate.h in Headers */, 51D0B1402B61B3A4006E3511 /* MTRServerCluster.h in Headers */, 754F3DF427FBB94B00E60580 /* MTREventTLVValueDecoder_Internal.h in Headers */, + 512E8E7B2D52F7B6009407E3 /* MTRCommandWithRequiredResponse.h in Headers */, 3CF134AF289D90FF0017A19E /* MTROperationalCertificateIssuer.h in Headers */, 5178E6822AE098520069DF72 /* MTRCommissionableBrowserResult_Internal.h in Headers */, 516415FD2B6ACA8300D5CE11 /* MTRServerAccessControl.h in Headers */, @@ -2191,9 +2214,13 @@ B45373D22A9FEB0C00807602 /* buflist.c in Sources */, 7592BCFB2CBEE98C00EB74A0 /* CodegenDataModelProvider_Read.cpp in Sources */, 7592BCFC2CBEE98C00EB74A0 /* Instance.cpp in Sources */, + B4D67A9B2D538E9700C49965 /* HTTPSRequest.mm in Sources */, 7592BCFD2CBEE98C00EB74A0 /* EmberMetadata.cpp in Sources */, 7592BCFE2CBEE98C00EB74A0 /* CodegenDataModelProvider.cpp in Sources */, 7592BCFF2CBEE98C00EB74A0 /* CodegenDataModelProvider_Write.cpp in Sources */, + B4D67A922D527F4A00C49965 /* DCLClient.cpp in Sources */, + B4D67A932D527F4A00C49965 /* DisplayTermsAndConditions.cpp in Sources */, + B4D67A952D527F4A00C49965 /* JsonSchemaMacros.cpp in Sources */, B45373C12A9FEA9100807602 /* close.c in Sources */, B45373D42A9FEB0C00807602 /* context.c in Sources */, B45373E52A9FEBA400807602 /* date.c in Sources */, @@ -2276,7 +2303,6 @@ 037C3DB62991BD5000B7EEE2 /* ModelCommandBridge.mm in Sources */, 516411322B6BF75700E67C05 /* MTRIMDispatch.mm in Sources */, 037C3DB42991BD5000B7EEE2 /* DeviceControllerDelegateBridge.mm in Sources */, - E04AC6802BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp in Sources */, 039547012992D461006D42A8 /* generic-callback-stubs.cpp in Sources */, 514C79F12B62ADDA00DD6D7B /* descriptor.cpp in Sources */, ); @@ -2362,6 +2388,7 @@ 514C79F02B62ADDA00DD6D7B /* descriptor.cpp in Sources */, 5109E9B42CB8B5DF0006884B /* MTRDeviceType.mm in Sources */, 3D843757294AD25A0070D20A /* MTRCertificateInfo.mm in Sources */, + 512E8E7A2D52F7B6009407E3 /* MTRCommandWithRequiredResponse.mm in Sources */, 3D9F2FCE2D112295003CA2BB /* MTRAttributeTLVValueDecoder_Internal.mm in Sources */, 5A7947E427C0129600434CF2 /* MTRDeviceController+XPC.mm in Sources */, 7592BD0B2CC6BCC300EB74A0 /* EmberAttributeDataBuffer.cpp in Sources */, @@ -2376,7 +2403,6 @@ 5178E67E2AE098210069DF72 /* MTRCommandTimedCheck.mm in Sources */, 7596A84928762783004DAE0E /* MTRAsyncCallbackWorkQueue.mm in Sources */, B2E0D7B9245B0B5C003C5B48 /* MTRSetupPayload.mm in Sources */, - E04AC67F2BEEA17F00BA409B /* ember-global-attribute-access-interface.cpp in Sources */, B2E0D7B6245B0B5C003C5B48 /* MTRManualSetupPayloadParser.mm in Sources */, 7596A85528788557004DAE0E /* MTRClusters.mm in Sources */, 88EBF8CF27FABDD500686BC1 /* MTRDeviceAttestationDelegateBridge.mm in Sources */, diff --git a/src/data-model-providers/codegen/CodegenDataModelProvider.cpp b/src/data-model-providers/codegen/CodegenDataModelProvider.cpp index a3889fb1e25ebb..b891346d170432 100644 --- a/src/data-model-providers/codegen/CodegenDataModelProvider.cpp +++ b/src/data-model-providers/codegen/CodegenDataModelProvider.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -324,6 +325,12 @@ const EmberAfCluster * CodegenDataModelProvider::FindServerCluster(const Concret CHIP_ERROR CodegenDataModelProvider::AcceptedCommands(const ConcreteClusterPath & path, DataModel::ListBuilder & builder) { + // Some CommandHandlerInterface instances are registered of ALL endpoints, so make sure first that + // the cluster actually exists on this endpoint before asking the CommandHandlerInterface what commands + // it claims to support. + const EmberAfCluster * serverCluster = FindServerCluster(path); + VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); + CommandHandlerInterface * interface = CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(path.mEndpointId, path.mClusterId); if (interface != nullptr) @@ -377,8 +384,6 @@ CHIP_ERROR CodegenDataModelProvider::AcceptedCommands(const ConcreteClusterPath VerifyOrReturnError(err == CHIP_ERROR_NOT_IMPLEMENTED, err); } - const EmberAfCluster * serverCluster = FindServerCluster(path); - VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); VerifyOrReturnError(serverCluster->acceptedCommandList != nullptr, CHIP_NO_ERROR); const chip::CommandId * endOfList = serverCluster->acceptedCommandList; @@ -404,6 +409,12 @@ CHIP_ERROR CodegenDataModelProvider::AcceptedCommands(const ConcreteClusterPath CHIP_ERROR CodegenDataModelProvider::GeneratedCommands(const ConcreteClusterPath & path, DataModel::ListBuilder & builder) { + // Some CommandHandlerInterface instances are registered of ALL endpoints, so make sure first that + // the cluster actually exists on this endpoint before asking the CommandHandlerInterface what commands + // it claims to support. + const EmberAfCluster * serverCluster = FindServerCluster(path); + VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); + CommandHandlerInterface * interface = CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(path.mEndpointId, path.mClusterId); if (interface != nullptr) @@ -454,8 +465,6 @@ CHIP_ERROR CodegenDataModelProvider::GeneratedCommands(const ConcreteClusterPath VerifyOrReturnError(err == CHIP_ERROR_NOT_IMPLEMENTED, err); } - const EmberAfCluster * serverCluster = FindServerCluster(path); - VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); VerifyOrReturnError(serverCluster->generatedCommandList != nullptr, CHIP_NO_ERROR); const chip::CommandId * endOfList = serverCluster->generatedCommandList; diff --git a/src/data-model-providers/codegen/CodegenDataModelProvider_Read.cpp b/src/data-model-providers/codegen/CodegenDataModelProvider_Read.cpp index 2c2ed3102e8850..59c14474c20b65 100644 --- a/src/data-model-providers/codegen/CodegenDataModelProvider_Read.cpp +++ b/src/data-model-providers/codegen/CodegenDataModelProvider_Read.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -34,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -116,27 +114,13 @@ DataModel::ActionReturnStatus CodegenDataModelProvider::ReadAttribute(const Data } // Read via AAI - std::optional aai_result; - if (const EmberAfCluster ** cluster = std::get_if(&metadata)) - { - Compatibility::GlobalAttributeReader aai(*cluster); - aai_result = TryReadViaAccessInterface(request.path, &aai, encoder); - } - else - { - aai_result = TryReadViaAccessInterface( - request.path, AttributeAccessInterfaceRegistry::Instance().Get(request.path.mEndpointId, request.path.mClusterId), - encoder); - } + std::optional aai_result = TryReadViaAccessInterface( + request.path, AttributeAccessInterfaceRegistry::Instance().Get(request.path.mEndpointId, request.path.mClusterId), encoder); VerifyOrReturnError(!aai_result.has_value(), *aai_result); - if (!std::holds_alternative(metadata)) - { - // if we only got a cluster, this was for a global attribute. We cannot read ember attributes - // at this point, so give up (although GlobalAttributeReader should have returned something here). - chipDie(); - } const EmberAfAttributeMetadata * attributeMetadata = std::get(metadata); + // We can only get a status or metadata. + VerifyOrDie(attributeMetadata != nullptr); // At this point, we have to use ember directly to read the data. EmberAfAttributeSearchRecord record; diff --git a/src/data-model-providers/codegen/CodegenDataModelProvider_Write.cpp b/src/data-model-providers/codegen/CodegenDataModelProvider_Write.cpp index 5cd6602fe08d10..e0d9c159fd3c4a 100644 --- a/src/data-model-providers/codegen/CodegenDataModelProvider_Write.cpp +++ b/src/data-model-providers/codegen/CodegenDataModelProvider_Write.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -102,6 +103,7 @@ DataModel::ActionReturnStatus CodegenDataModelProvider::WriteAttribute(const Dat // and tests and implementation // // Open issue that needs fixing: https://github.com/project-chip/connectedhomeip/issues/33735 + auto metadata = Ember::FindAttributeMetadata(request.path); // Explicit failure in finding a suitable metadata @@ -110,10 +112,23 @@ DataModel::ActionReturnStatus CodegenDataModelProvider::WriteAttribute(const Dat VerifyOrDie((*status == Status::UnsupportedEndpoint) || // (*status == Status::UnsupportedCluster) || // (*status == Status::UnsupportedAttribute)); + + // Check if this is an attribute that ember does not know about but is valid after all and + // adjust the return code. All these global attributes are `read only` hence the return + // of unsupported write. + // + // If the cluster or endpoint does not exist, though, keep that return code. + if ((*status == Protocols::InteractionModel::Status::UnsupportedAttribute) && + IsSupportedGlobalAttributeNotInMetadata(request.path.mAttributeId)) + { + return Status::UnsupportedWrite; + } + return *status; } const EmberAfAttributeMetadata ** attributeMetadata = std::get_if(&metadata); + VerifyOrDie(*attributeMetadata != nullptr); // All the global attributes that we do not have metadata for are // read-only. Specifically only the following list-based attributes match the @@ -124,7 +139,7 @@ DataModel::ActionReturnStatus CodegenDataModelProvider::WriteAttribute(const Dat // - GeneratedCommands // // Given the above, UnsupportedWrite should be correct (attempt to write to a read-only list) - bool isReadOnly = (attributeMetadata == nullptr) || (*attributeMetadata)->IsReadOnly(); + bool isReadOnly = (*attributeMetadata)->IsReadOnly(); // Internal is allowed to bypass timed writes and read-only. if (!request.operationFlags.Has(DataModel::OperationFlags::kInternal)) @@ -184,10 +199,6 @@ DataModel::ActionReturnStatus CodegenDataModelProvider::WriteAttribute(const Dat Status::NeedsTimedInteraction); } - // Extra check: internal requests can bypass the read only check, however global attributes - // have no underlying storage, so write still cannot be done - VerifyOrReturnError(attributeMetadata != nullptr, Status::UnsupportedWrite); - if (request.path.mDataVersion.HasValue()) { DataVersion * versionPtr = emberAfDataVersionStorage(request.path); diff --git a/src/data-model-providers/codegen/EmberMetadata.cpp b/src/data-model-providers/codegen/EmberMetadata.cpp index 22e31a569fe702..57a9b48e561d41 100644 --- a/src/data-model-providers/codegen/EmberMetadata.cpp +++ b/src/data-model-providers/codegen/EmberMetadata.cpp @@ -26,31 +26,11 @@ namespace Ember { using Protocols::InteractionModel::Status; -std::variant FindAttributeMetadata(const ConcreteAttributePath & aPath) { - if (IsGlobalAttribute(aPath.mAttributeId)) - { - // Global list attribute check first: during path expansion a lot of attributes - // will actually be global attributes (so not too much of a performance hit) - for (auto & attr : GlobalAttributesNotInMetadata) - { - if (attr == aPath.mAttributeId) - { - const EmberAfCluster * cluster = emberAfFindServerCluster(aPath.mEndpointId, aPath.mClusterId); - if (cluster == nullptr) - { - return (emberAfFindEndpointType(aPath.mEndpointId) == nullptr) ? Status::UnsupportedEndpoint - : Status::UnsupportedCluster; - } - - return cluster; - } - } - } const EmberAfAttributeMetadata * metadata = emberAfLocateAttributeMetadata(aPath.mEndpointId, aPath.mClusterId, aPath.mAttributeId); diff --git a/src/data-model-providers/codegen/EmberMetadata.h b/src/data-model-providers/codegen/EmberMetadata.h index 64c0bfe736a25f..ecf6aa202fc78d 100644 --- a/src/data-model-providers/codegen/EmberMetadata.h +++ b/src/data-model-providers/codegen/EmberMetadata.h @@ -16,6 +16,7 @@ */ #pragma once +#include "app/ConcreteClusterPath.h" #include #include #include @@ -30,14 +31,12 @@ namespace Ember { /// path. /// /// Possible return values: -/// - EmberAfCluster (NEVER null) - Only for GlobalAttributesNotInMetaData /// - EmberAfAttributeMetadata (NEVER null) - if the attribute is known to ember datastore /// - Status, only specifically for unknown attributes, may only be one of: /// - Status::UnsupportedEndpoint /// - Status::UnsupportedCluster /// - Status::UnsupportedAttribute -std::variant FindAttributeMetadata(const ConcreteAttributePath & aPath); diff --git a/src/data-model-providers/codegen/tests/BUILD.gn b/src/data-model-providers/codegen/tests/BUILD.gn index af14185ddbd9b1..57facbee09ec10 100644 --- a/src/data-model-providers/codegen/tests/BUILD.gn +++ b/src/data-model-providers/codegen/tests/BUILD.gn @@ -20,7 +20,6 @@ source_set("ember_extra_files") { # This IS TERRIBLE, however we want to pretend AAI exists for global # items and we need a shared IO storage to reduce overhead between # data-model access and ember-compatibility (we share the same buffer) - "${chip_root}/src/app/util/ember-global-attribute-access-interface.cpp", "${chip_root}/src/app/util/ember-io-storage.cpp", "EmberInvokeOverride.cpp", "EmberInvokeOverride.h", diff --git a/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp b/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp index 1045114b7f9b4c..4d54a194b1e0c5 100644 --- a/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp +++ b/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp @@ -218,6 +218,44 @@ class MockAccessControl : public Access::AccessControl::Delegate, public Access: bool IsDeviceTypeOnEndpoint(DeviceTypeId deviceType, EndpointId endpoint) override { return true; } }; +class MockCommandHandler : public CommandHandler +{ +public: + CHIP_ERROR FallibleAddStatus(const ConcreteCommandPath & aRequestCommandPath, + const Protocols::InteractionModel::ClusterStatusCode & aStatus, + const char * context = nullptr) override + { + // MOCK: do not do anything here + return CHIP_NO_ERROR; + } + + void AddStatus(const ConcreteCommandPath & aRequestCommandPath, const Protocols::InteractionModel::ClusterStatusCode & aStatus, + const char * context = nullptr) override + { + // MOCK: do not do anything here + } + + FabricIndex GetAccessingFabricIndex() const override { return 1; } + + CHIP_ERROR AddResponseData(const ConcreteCommandPath & aRequestCommandPath, CommandId aResponseCommandId, + const DataModel::EncodableToTLV & aEncodable) override + { + return CHIP_NO_ERROR; + } + + void AddResponse(const ConcreteCommandPath & aRequestCommandPath, CommandId aResponseCommandId, + const DataModel::EncodableToTLV & aEncodable) override + {} + + bool IsTimedInvoke() const override { return false; } + + void FlushAcksRightAwayOnSlowCommand() override {} + + Access::SubjectDescriptor GetSubjectDescriptor() const override { return kAdminSubjectDescriptor; } + + Messaging::ExchangeContext * GetExchangeContext() const override { return nullptr; } +}; + /// Overrides Enumerate*Commands in the CommandHandlerInterface to allow /// testing of behaviors when command enumeration is done in the interace. class CustomListCommandHandler : public CommandHandlerInterface @@ -229,7 +267,20 @@ class CustomListCommandHandler : public CommandHandlerInterface } ~CustomListCommandHandler() { CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler(this); } - void InvokeCommand(HandlerContext & handlerContext) override { handlerContext.SetCommandNotHandled(); } + void InvokeCommand(HandlerContext & handlerContext) override + { + if (mHandleCommand) + { + handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, Protocols::InteractionModel::Status::Success); + handlerContext.SetCommandHandled(); + } + else + { + handlerContext.SetCommandNotHandled(); + } + } + + void SetHandleCommands(bool handle) { mHandleCommand = handle; } CHIP_ERROR EnumerateAcceptedCommands(const ConcreteClusterPath & cluster, CommandIdCallback callback, void * context) override { @@ -268,6 +319,7 @@ class CustomListCommandHandler : public CommandHandlerInterface private: bool mOverrideAccepted = false; bool mOverrideGenerated = false; + bool mHandleCommand = false; std::vector mAccepted; std::vector mGenerated; @@ -1156,6 +1208,37 @@ TEST_F(TestCodegenModelViaMocks, IterateOverGeneratedCommands) ASSERT_TRUE(cmds.data_equal(Span(expectedCommands3))); } +TEST_F(TestCodegenModelViaMocks, AcceptedGeneratedCommandsOnInvalidEndpoints) +{ + UseMockNodeConfig config(gTestNodeConfig); + CodegenDataModelProviderWithContext model; + + // register a CHI on ALL endpoints + CustomListCommandHandler handler(chip::NullOptional, MockClusterId(1)); + handler.SetHandleCommands(true); + + DataModel::ListBuilder generatedBuilder; + DataModel::ListBuilder acceptedBuilder; + + // valid endpoint will result in valid data (even though list is empty) + ASSERT_EQ(model.GeneratedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(1)), generatedBuilder), CHIP_NO_ERROR); + ASSERT_TRUE(generatedBuilder.IsEmpty()); + ASSERT_EQ(model.AcceptedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(1)), acceptedBuilder), CHIP_NO_ERROR); + ASSERT_TRUE(acceptedBuilder.IsEmpty()); + + // Invalid endpoint fails - we will get no commands there (even though CHI is registered) + ASSERT_EQ(model.GeneratedCommands(ConcreteClusterPath(kEndpointIdThatIsMissing, MockClusterId(1)), generatedBuilder), + CHIP_ERROR_NOT_FOUND); + ASSERT_EQ(model.AcceptedCommands(ConcreteClusterPath(kEndpointIdThatIsMissing, MockClusterId(1)), acceptedBuilder), + CHIP_ERROR_NOT_FOUND); + + // same for invalid cluster ID + ASSERT_EQ(model.GeneratedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(0x1123)), generatedBuilder), + CHIP_ERROR_NOT_FOUND); + ASSERT_EQ(model.AcceptedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(0x1123)), acceptedBuilder), + CHIP_ERROR_NOT_FOUND); +} + TEST_F(TestCodegenModelViaMocks, CommandHandlerInterfaceCommandHandling) { @@ -1822,62 +1905,6 @@ TEST_F(TestCodegenModelViaMocks, AttributeAccessInterfaceListIncrementalRead) } } -TEST_F(TestCodegenModelViaMocks, ReadGlobalAttributeAttributeList) -{ - UseMockNodeConfig config(gTestNodeConfig); - CodegenDataModelProviderWithContext model; - ScopedMockAccessControl accessControl; - - ReadOperation testRequest(kMockEndpoint2, MockClusterId(3), AttributeList::Id); - testRequest.SetSubjectDescriptor(kAdminSubjectDescriptor); - - // Data read via the encoder - std::unique_ptr encoder = testRequest.StartEncoding(); - ASSERT_EQ(model.ReadAttribute(testRequest.GetRequest(), *encoder), CHIP_NO_ERROR); - ASSERT_EQ(testRequest.FinishEncoding(), CHIP_NO_ERROR); - - // Validate after read - std::vector attribute_data; - ASSERT_EQ(testRequest.GetEncodedIBs().Decode(attribute_data), CHIP_NO_ERROR); - ASSERT_EQ(attribute_data.size(), 1u); - - DecodedAttributeData & encodedData = attribute_data[0]; - ASSERT_EQ(encodedData.attributePath, testRequest.GetRequest().path); - - ASSERT_EQ(encodedData.dataReader.GetType(), TLV::kTLVType_Array); - - std::vector items; - ASSERT_EQ(DecodeList(encodedData.dataReader, items), CHIP_NO_ERROR); - - // Mock data contains ClusterRevision and FeatureMap. - // After this, Global attributes are auto-added - std::vector expected; - - // Encoding in global-attribute-access-interface has a logic of: - // - Append global attributes in front of the first specified - // large number global attribute. - // Since ClusterRevision and FeatureMap are - // global attributes, the order here is reversed for them - for (AttributeId id : GlobalAttributesNotInMetadata) - { - expected.push_back(id); - } - expected.push_back(ClusterRevision::Id); - expected.push_back(FeatureMap::Id); - expected.push_back(MockAttributeId(1)); - expected.push_back(MockAttributeId(2)); - expected.push_back(MockAttributeId(3)); - - ASSERT_EQ(items.size(), expected.size()); - - // Since we have no std::vector formatter, comparing element by element is somewhat - // more readable in case of failure. - for (unsigned i = 0; i < items.size(); i++) - { - EXPECT_EQ(items[i], expected[i]); - } -} - TEST_F(TestCodegenModelViaMocks, EmberAttributeWriteAclDeny) { UseMockNodeConfig config(gTestNodeConfig); diff --git a/src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp b/src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp index 5c50a8dfdaf6ca..c3bcbde292a4a2 100644 --- a/src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp +++ b/src/include/platform/internal/GenericPlatformManagerImpl_POSIX.ipp @@ -112,7 +112,8 @@ void GenericPlatformManagerImpl_POSIX::_UnlockChipStack() chipDie(); #endif } - mChipStackIsLocked = false; + mChipStackIsLocked = false; + mChipStackLockOwnerThread = pthread_t(); #endif int err = pthread_mutex_unlock(&mChipStackLock); diff --git a/src/lib/core/CHIPError.cpp b/src/lib/core/CHIPError.cpp index 31959718b94380..2068a9fbc68c42 100644 --- a/src/lib/core/CHIPError.cpp +++ b/src/lib/core/CHIPError.cpp @@ -22,16 +22,24 @@ namespace chip { +static ErrorFormatter sCHIPErrorFormatter = { FormatCHIPError, nullptr }; + /** * Register a text error formatter for CHIP core errors. */ void RegisterCHIPLayerErrorFormatter() { - static ErrorFormatter sCHIPErrorFormatter = { FormatCHIPError, nullptr }; - RegisterErrorFormatter(&sCHIPErrorFormatter); } +/** + * Deregister a text error formatter for CHIP core errors. + */ +void DeregisterCHIPLayerErrorFormatter() +{ + DeregisterErrorFormatter(&sCHIPErrorFormatter); +} + /** * Given a CHIP error, returns a human-readable NULL-terminated C string * describing the error. diff --git a/src/lib/core/CHIPError.h b/src/lib/core/CHIPError.h index 0a002d89c088f5..03217378eecb87 100644 --- a/src/lib/core/CHIPError.h +++ b/src/lib/core/CHIPError.h @@ -1821,6 +1821,7 @@ using CHIP_ERROR = ::chip::ChipError; namespace chip { extern void RegisterCHIPLayerErrorFormatter(); +extern void DeregisterCHIPLayerErrorFormatter(); extern bool FormatCHIPError(char * buf, uint16_t bufSize, CHIP_ERROR err); } // namespace chip diff --git a/src/lib/core/ErrorStr.cpp b/src/lib/core/ErrorStr.cpp index b3cf968c674dd5..13335b12fe214c 100644 --- a/src/lib/core/ErrorStr.cpp +++ b/src/lib/core/ErrorStr.cpp @@ -142,13 +142,17 @@ DLL_EXPORT void RegisterErrorFormatter(ErrorFormatter * errFormatter) DLL_EXPORT void DeregisterErrorFormatter(ErrorFormatter * errFormatter) { // Remove the formatter if present - for (ErrorFormatter ** lfp = &sErrorFormatterList; *lfp != nullptr; lfp = &(*lfp)->Next) + for (ErrorFormatter ** lfp = &sErrorFormatterList; *lfp != nullptr;) { // Remove the formatter from the global list, if found. if (*lfp == errFormatter) { *lfp = errFormatter->Next; } + else + { + lfp = &(*lfp)->Next; + } } } diff --git a/src/lib/core/tests/TestCHIPErrorStr.cpp b/src/lib/core/tests/TestCHIPErrorStr.cpp index 1ce158cc8594ae..a65d45875becae 100644 --- a/src/lib/core/tests/TestCHIPErrorStr.cpp +++ b/src/lib/core/tests/TestCHIPErrorStr.cpp @@ -207,6 +207,9 @@ TEST(TestCHIPErrorStr, CheckCoreErrorStr) // ErrorStr with static char array. CheckCoreErrorStrHelper(ErrorStr(err, /*withSourceLocation=*/true), err); } + + // Deregister the layer error formatter + DeregisterCHIPLayerErrorFormatter(); } TEST(TestCHIPErrorStr, CheckCoreErrorStrStorage) @@ -222,6 +225,9 @@ TEST(TestCHIPErrorStr, CheckCoreErrorStrStorage) ErrorStrStorage storage; CheckCoreErrorStrHelper(ErrorStr(err, /*withSourceLocation=*/true, storage), err); } + + // Deregister the layer error formatter + DeregisterCHIPLayerErrorFormatter(); } void CheckCoreErrorStrWithoutSourceLocationHelper(const char * errStr, CHIP_ERROR err) @@ -258,6 +264,9 @@ TEST(TestCHIPErrorStr, CheckCoreErrorStrWithoutSourceLocation) // ErrorStr with static char array. CheckCoreErrorStrWithoutSourceLocationHelper(ErrorStr(err, /*withSourceLocation=*/false), err); } + + // Deregister the layer error formatter + DeregisterCHIPLayerErrorFormatter(); } TEST(TestCHIPErrorStr, CheckCoreErrorStrStorageWithoutSourceLocation) @@ -273,4 +282,7 @@ TEST(TestCHIPErrorStr, CheckCoreErrorStrStorageWithoutSourceLocation) ErrorStrStorage storage; CheckCoreErrorStrWithoutSourceLocationHelper(ErrorStr(err, /*withSourceLocation=*/false, storage), err); } + + // Deregister the layer error formatter + DeregisterCHIPLayerErrorFormatter(); } diff --git a/src/lib/support/tests/TestErrorStr.cpp b/src/lib/support/tests/TestErrorStr.cpp index ac8a9f5e9e3469..99e667efe96e17 100644 --- a/src/lib/support/tests/TestErrorStr.cpp +++ b/src/lib/support/tests/TestErrorStr.cpp @@ -67,6 +67,14 @@ static bool trueFormat(char * buf, uint16_t bufSize, CHIP_ERROR err) return true; // means I handled it } +TEST(TestErrorStr, CheckRegisterDeregisterSingleErrorFormatter) +{ + static ErrorFormatter falseFormatter = { falseFormat, nullptr }; + + RegisterErrorFormatter(&falseFormatter); + DeregisterErrorFormatter(&falseFormatter); +} + TEST(TestErrorStr, CheckRegisterDeregisterErrorFormatter) { static ErrorFormatter falseFormatter = { falseFormat, nullptr }; @@ -114,6 +122,8 @@ TEST(TestErrorStr, CheckRegisterDeregisterErrorFormatter) // verify this doesn't crash DeregisterErrorFormatter(&trueFormatter); + DeregisterErrorFormatter(&falseFormatter); + DeregisterErrorFormatter(&falseFormatter2); } TEST(TestErrorStr, CheckNoError) diff --git a/src/messaging/ReliableMessageMgr.cpp b/src/messaging/ReliableMessageMgr.cpp index 119adeef876972..f6af9df2627307 100644 --- a/src/messaging/ReliableMessageMgr.cpp +++ b/src/messaging/ReliableMessageMgr.cpp @@ -513,8 +513,8 @@ void ReliableMessageMgr::CalculateNextRetransTime(RetransTableEntry & entry) ChipLogProgress(ExchangeManager, "??%d [E:" ChipLogFormatExchange " S:%u M:" ChipLogFormatMessageCounter - "] (%s) Msg Retransmission to %u:" ChipLogFormatX64 " in %" PRIu32 "ms [State:%s II:%" PRIu32 " AI:%" PRIu32 - " AT:%u]", + "] (%s) Msg Retransmission to %u:" ChipLogFormatX64 " scheduled for %" PRIu32 + "ms from now [State:%s II:%" PRIu32 " AI:%" PRIu32 " AT:%u]", entry.sendCount + 1, ChipLogValueExchange(&entry.ec.Get()), sessionHandle->SessionIdForLogging(), messageCounter, Transport::GetSessionTypeString(sessionHandle), fabricIndex, ChipLogValueX64(destination), backoff.count(), peerIsActive ? "Active" : "Idle", config.mIdleRetransTimeout.count(), diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn index bca3755f1decd1..66e464b0b2d9a2 100644 --- a/src/platform/silabs/SiWx917/BUILD.gn +++ b/src/platform/silabs/SiWx917/BUILD.gn @@ -18,10 +18,10 @@ import("${chip_root}/src/platform/device.gni") import("${chip_root}/build/chip/buildconfig_header.gni") import("${chip_root}/src/crypto/crypto.gni") -import("${chip_root}/src/platform/silabs/provision/args.gni") import("${chip_root}/src/platform/silabs/wifi/args.gni") import("${chip_root}/third_party/silabs/SiWx917_sdk.gni") import("${chip_root}/third_party/silabs/silabs_board.gni") +import("${matter_support_root}/provision/args.gni") silabs_platform_dir = "${chip_root}/src/platform/silabs" @@ -90,7 +90,7 @@ static_library("SiWx917") { ] deps = [ "${chip_root}/src/platform/logging:headers", - "${sl_provision_root}:provision-headers", + "${sl_provision_root}:headers", ] # Add platform crypto implementation diff --git a/src/platform/silabs/efr32/BLEManagerImpl.cpp b/src/platform/silabs/efr32/BLEManagerImpl.cpp index eb709c395bec5c..890501a9c8198e 100644 --- a/src/platform/silabs/efr32/BLEManagerImpl.cpp +++ b/src/platform/silabs/efr32/BLEManagerImpl.cpp @@ -52,8 +52,8 @@ extern "C" { #include #endif -#include -#include +#include +#include using namespace ::chip; using namespace ::chip::Ble; diff --git a/src/platform/silabs/efr32/BUILD.gn b/src/platform/silabs/efr32/BUILD.gn index 3102a4d924f494..d0bf04d83b4620 100644 --- a/src/platform/silabs/efr32/BUILD.gn +++ b/src/platform/silabs/efr32/BUILD.gn @@ -17,9 +17,9 @@ import("//build_overrides/chip.gni") import("${chip_root}/build/chip/buildconfig_header.gni") import("${chip_root}/src/crypto/crypto.gni") import("${chip_root}/src/platform/device.gni") -import("${chip_root}/src/platform/silabs/provision/args.gni") import("${chip_root}/third_party/silabs/efr32_sdk.gni") import("${chip_root}/third_party/silabs/silabs_board.gni") +import("${matter_support_root}/provision/args.gni") assert(chip_device_platform == "efr32") @@ -115,7 +115,7 @@ static_library("efr32") { "${chip_root}/src/platform:platform_base", "${chip_root}/src/platform/logging:headers", ] - deps = [ "${sl_provision_root}:provision-headers" ] + deps = [ "${sl_provision_root}:headers" ] public_configs = [] # Add platform crypto implementation diff --git a/src/platform/silabs/multi-ota/OTAFactoryDataProcessor.h b/src/platform/silabs/multi-ota/OTAFactoryDataProcessor.h index da325bbba16110..dfafa6610893f5 100644 --- a/src/platform/silabs/multi-ota/OTAFactoryDataProcessor.h +++ b/src/platform/silabs/multi-ota/OTAFactoryDataProcessor.h @@ -18,8 +18,8 @@ #pragma once -#include -#include +#include +#include #include #include #include diff --git a/src/platform/silabs/provision/AttestationKey.h b/src/platform/silabs/provision/AttestationKey.h deleted file mode 100644 index f08755ac8652e5..00000000000000 --- a/src/platform/silabs/provision/AttestationKey.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2024 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include - -namespace chip { -namespace DeviceLayer { -namespace Silabs { -namespace Provision { - -static constexpr uint32_t kCreds_KeyId_Default = 2; //(PSA_KEY_ID_USER_MIN + 1); - -class AttestationKey -{ -public: - AttestationKey(uint32_t id = 0) { mId = (id > 0) ? id : kCreds_KeyId_Default; } - ~AttestationKey() = default; - - uint32_t GetId() { return mId; } - CHIP_ERROR Import(const uint8_t * asn1, size_t size); - CHIP_ERROR Export(uint8_t * asn1, size_t max, size_t & size); - CHIP_ERROR GenerateCSR(uint16_t vid, uint16_t pid, const CharSpan & cn, MutableCharSpan & csr); - CHIP_ERROR SignMessage(const ByteSpan & message, MutableByteSpan & out_span); - -#if (defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE) - static CHIP_ERROR Unwrap(const uint8_t * asn1, size_t size, MutableByteSpan & private_key); - static CHIP_ERROR SignMessageWithKey(const uint8_t * private_key, const ByteSpan & message, MutableByteSpan & out_span); -#endif // SLI_SI91X_MCU_INTERFACE - -protected: - uint32_t mId = 0; -}; - -} // namespace Provision -} // namespace Silabs -} // namespace DeviceLayer -} // namespace chip diff --git a/src/platform/silabs/provision/BUILD.gn b/src/platform/silabs/provision/BUILD.gn deleted file mode 100644 index 7ae41c05154731..00000000000000 --- a/src/platform/silabs/provision/BUILD.gn +++ /dev/null @@ -1,38 +0,0 @@ -# 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("//build_overrides/efr32_sdk.gni") -import("${silabs_sdk_build_root}/silabs_board.gni") - -config("provision-config") { - include_dirs = [ "." ] - - defines = [ "CHIP_DEVICE_CONFIG_ENABLE_EXAMPLE_CREDENTIALS=1" ] - if (use_provision_channel) { - defines += [ "SL_MATTER_PROVISION_CHANNEL_ENABLED=1" ] - } -} - -source_set("provision-headers") { - sources = [ - "AttestationKey.h", - "ProvisionChannel.h", - "ProvisionEncoder.h", - "ProvisionManager.h", - "ProvisionProtocol.h", - "ProvisionStorage.h", - ] - public_configs = [ ":provision-config" ] -} diff --git a/src/platform/silabs/provision/ProvisionChannel.h b/src/platform/silabs/provision/ProvisionChannel.h deleted file mode 100644 index a15b4364a88092..00000000000000 --- a/src/platform/silabs/provision/ProvisionChannel.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2024 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -#include -#include -#include - -namespace chip { -namespace DeviceLayer { -namespace Silabs { -namespace Provision { - -class Channel -{ -public: - Channel() = default; - ~Channel() = default; - - CHIP_ERROR Init(); - CHIP_ERROR Read(uint8_t * buffer, size_t buffer_length, size_t & bytes_read); - CHIP_ERROR Write(const uint8_t * buffer, size_t buffer_length); - - static CHIP_ERROR Update(uint16_t handle); -}; - -} // namespace Provision -} // namespace Silabs -} // namespace DeviceLayer -} // namespace chip diff --git a/src/platform/silabs/provision/ProvisionEncoder.h b/src/platform/silabs/provision/ProvisionEncoder.h deleted file mode 100644 index 74b96fae7884a8..00000000000000 --- a/src/platform/silabs/provision/ProvisionEncoder.h +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (c) 2024 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -#include -#include -#include -#include - -namespace chip { -namespace DeviceLayer { -namespace Silabs { -namespace Provision { -namespace Encoding { - -/* - Generic buffer used to hold incoming and outgoing data. - The "in" pointer marks the next address to be written. - The "out" pointer marks the next address to be read. - When "out" reaches "in", all incoming data has been read. - "Size" is the total amount of bytes written, including the part already read. - "Left" is the number of bytes available for reading. - "Offset" is the number of bytes read. - "Spare" is the number of bytes available for writing. - "Limit" it the total number of bytes allocated (size + spare). -begin out in end - |---------------v---------------v----------------| - |.....offset....|......left.....|.....spare......| - |..............size.............| - |......................limit.....................| -*/ - -struct Buffer -{ - Buffer(uint8_t * ptr, size_t size, bool at_end = false) { Init(ptr, size, at_end); } - - void Init(uint8_t * ptr, size_t size, bool at_end = false) - { - Finish(); - if (nullptr == ptr) - { - ptr = new uint8_t[size]; - allocated = true; - } - this->begin = ptr; - this->end = ptr + size; - this->in = at_end ? end : begin; - this->out = ptr; - } - void Finish() - { - if (this->begin && allocated) - { - delete[] this->begin; - } - this->begin = this->end = this->in = this->out = nullptr; - } - - /** Reset the pointers to initial position. Zero write, zero read. */ - void Clear() { this->in = this->out = this->begin; } - /** @return Total size allocated for the buffer. */ - size_t Limit() { return (this->end > this->begin) ? (this->end - this->begin) : 0; } - /** @return Number of bytes written. */ - size_t Size() { return (this->in > this->begin) ? (this->in - this->begin) : 0; } - /** @return Number of bytes read. */ - size_t Offset() { return (this->out > this->begin) ? (this->out - this->begin) : 0; } - /** @return Number of bytes available for reading. */ - size_t Left() { return this->Size() - this->Offset(); } - /** @return Number of bytes available for writing. */ - size_t Spare() { return this->Limit() - this->Size(); } - - CHIP_ERROR Add(uint8_t in); - CHIP_ERROR Add(uint16_t in); - CHIP_ERROR Add(uint32_t in); - CHIP_ERROR Add(int32_t in); - CHIP_ERROR Add(const uint8_t * in, size_t size); - CHIP_ERROR Add(Buffer & from, size_t size); - CHIP_ERROR Get(uint8_t & out); - CHIP_ERROR Get(uint16_t & out); - CHIP_ERROR Get(uint32_t & out); - CHIP_ERROR Get(uint8_t * out, size_t size); - CHIP_ERROR Get(Buffer & into, size_t size); - - uint8_t * begin = nullptr; - uint8_t * end = nullptr; - uint8_t * in = nullptr; - uint8_t * out = nullptr; - bool allocated = false; -}; - -//------------------------------------------------------------------------------ -// Version 1 -//------------------------------------------------------------------------------ -#ifdef SILABS_PROVISION_PROTOCOL_V1 - -namespace Version1 { - -enum Types : uint8_t -{ - Type_None = 0x00, - Type_Int8u = 0x01, - Type_Int16u = 0x02, - Type_Int32u = 0x03, - Type_Array = 0x04, -}; - -CHIP_ERROR Encode(Buffer & arg, uint8_t in); -CHIP_ERROR Encode(Buffer & arg, uint16_t in); -CHIP_ERROR Encode(Buffer & arg, int32_t in); -CHIP_ERROR Encode(Buffer & arg, uint32_t in); -CHIP_ERROR Encode(Buffer & arg, const uint8_t * in, size_t size); -CHIP_ERROR Encode(Buffer & arg, const char * in); - -CHIP_ERROR Decode(Buffer & arg, uint8_t & out); -CHIP_ERROR Decode(Buffer & arg, uint16_t & out); -CHIP_ERROR Decode(Buffer & arg, uint32_t & out); -CHIP_ERROR Decode(Buffer & arg, uint8_t * out, size_t limit, size_t & size); -CHIP_ERROR Decode(Buffer & arg, char * out, size_t limit, size_t & size); - -namespace Legacy { -CHIP_ERROR DecodeInt8u(Encoding::Buffer & in, uint8_t & out); -CHIP_ERROR DecodeInt16u(Encoding::Buffer & in, uint16_t & out); -CHIP_ERROR DecodeInt32u(Encoding::Buffer & in, uint32_t & out); -} // namespace Legacy - -} // namespace Version1 - -#endif // SILABS_PROVISION_PROTOCOL_V1 - -//------------------------------------------------------------------------------ -// Version 2 -//------------------------------------------------------------------------------ - -namespace Version2 { - -enum Types : uint8_t -{ - Type_Binary = 0x00, - Type_Int8u = 0x01, - Type_Int16u = 0x02, - Type_Int32u = 0x03, - Type_Int64u = 0x04, - Type_String = 0x08, - Type_Int8s = 0x09, - Type_Int16s = 0x0a, - Type_Int32s = 0x0b, - Type_Int64s = 0x0c, -}; - -union Value -{ - uint8_t u8; - uint16_t u16; - uint32_t u32; - uint32_t u64; - uint8_t * b; -}; - -struct Argument : public Buffer -{ - enum States : uint8_t - { - State_Flags = 1, - State_Size = 3, - State_Data = 4, - State_Ready = 5, - }; - - Argument(uint8_t * ptr = nullptr, size_t size = 0) : Buffer(ptr, size) { Reset(); } - - void Reset() - { - this->Clear(); - this->state = State_Flags; - this->id = 0; - this->type = 0; - this->size = 0; - this->size_len = 0; - this->encoded_size = 0; - this->is_null = false; - this->is_binary = false; - this->is_known = false; - this->feedback = false; - this->offset = 0; - memset(&this->value, 0x00, sizeof(Value)); - } - - States state = State_Flags; - uint16_t id = 0; - uint8_t type = 0; - size_t size = 0; - uint8_t size_len = 0; - size_t encoded_size = 0; - bool is_null = false; - bool is_binary = false; - bool is_known = false; - bool feedback = false; - size_t offset = 0; - Value value; -}; - -CHIP_ERROR Encode(uint16_t id, uint8_t * value, Buffer & out); -CHIP_ERROR Encode(uint16_t id, uint16_t * value, Buffer & out); -CHIP_ERROR Encode(uint16_t id, uint32_t * value, Buffer & out); -CHIP_ERROR Encode(uint16_t id, const uint8_t * value, size_t size, Buffer & out); -CHIP_ERROR Decode(Buffer & in, Argument & arg); -CHIP_ERROR Find(Buffer & in, uint16_t id, Argument & arg); - -} // namespace Version2 - -} // namespace Encoding -} // namespace Provision -} // namespace Silabs -} // namespace DeviceLayer -} // namespace chip diff --git a/src/platform/silabs/provision/ProvisionManager.h b/src/platform/silabs/provision/ProvisionManager.h deleted file mode 100644 index c73e920c345ce1..00000000000000 --- a/src/platform/silabs/provision/ProvisionManager.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2024 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -#include "ProvisionChannel.h" -#include "ProvisionProtocol.h" -#include "ProvisionStorage.h" -#include - -namespace chip { -namespace DeviceLayer { -namespace Silabs { -namespace Provision { - -class Manager -{ -public: - Manager() : -#ifdef SILABS_PROVISION_PROTOCOL_V1 - mProtocol1(mStore), -#endif - mProtocol2(mStore) - {} - - CHIP_ERROR Init(); - bool Step(); - bool IsProvisionRequired(); - CHIP_ERROR SetProvisionRequired(bool required); - Storage & GetStorage() { return mStore; } - static Manager & GetInstance(); - -private: - bool ProcessCommand(ByteSpan & request, MutableByteSpan & response); - - Storage mStore; - Channel mChannel; -#ifdef SILABS_PROVISION_PROTOCOL_V1 - Protocol1 mProtocol1; -#endif - Protocol2 mProtocol2; - bool mProvisionRequested = true; -}; - -} // namespace Provision -} // namespace Silabs -} // namespace DeviceLayer -} // namespace chip diff --git a/src/platform/silabs/provision/ProvisionProtocol.h b/src/platform/silabs/provision/ProvisionProtocol.h deleted file mode 100644 index 03182b59af0468..00000000000000 --- a/src/platform/silabs/provision/ProvisionProtocol.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2024 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -#include "ProvisionEncoder.h" -#include "ProvisionStorage.h" -#include -#include -#include - -namespace chip { -namespace DeviceLayer { -namespace Silabs { -namespace Provision { - -//------------------------------------------------------------------------------ -// Common -//------------------------------------------------------------------------------ - -class Protocol -{ -public: - /** - * Must hold the header plus complete argument value - */ - Protocol(Storage & store) : mStore(store) {} - virtual ~Protocol() = default; - virtual bool Execute(ByteSpan & request, MutableByteSpan & response) = 0; - -protected: - Storage & mStore; -}; - -//------------------------------------------------------------------------------ -// Version 1 -//------------------------------------------------------------------------------ -#ifdef SILABS_PROVISION_PROTOCOL_V1 - -class Protocol1 : public Protocol -{ -public: - static constexpr size_t kVersion = 1; - - Protocol1(Storage & store) : Protocol(store) {} - virtual bool Execute(ByteSpan & request, MutableByteSpan & response); - -private: - CHIP_ERROR Init(Encoding::Buffer & in, Encoding::Buffer & out); - CHIP_ERROR GenerateCSR(Encoding::Buffer & in, Encoding::Buffer & out); - CHIP_ERROR Import(Encoding::Buffer & in, Encoding::Buffer & out); - CHIP_ERROR Setup(Encoding::Buffer & in, Encoding::Buffer & out); - CHIP_ERROR Read(Encoding::Buffer & in, Encoding::Buffer & out); -}; - -#endif // SILABS_PROVISION_PROTOCOL_V1 - -//------------------------------------------------------------------------------ -// Version 2 -//------------------------------------------------------------------------------ - -class Protocol2 : public Protocol -{ -public: - static constexpr uint8_t kVersion = 2; - // Command flags - static constexpr uint16_t kResponseFlag = 0x80; - // Payload flags - static constexpr uint16_t kCustomIdMin = 0x0000; - static constexpr uint16_t kCustomIdMax = 0x00ff; - static constexpr uint16_t kKnownIdMin = 0x0100; - static constexpr uint16_t kKnownIdMax = 0x01ff; - static constexpr uint16_t kIdMask = 0x01ff; - static constexpr uint16_t kWellKnownMask = 0x0100; - static constexpr uint16_t kSizeBit = 10; - static constexpr uint16_t kSizeMask = 0x0c00; - static constexpr uint16_t kFeedbackMask = 0x0200; - static constexpr uint16_t kTypeBit = 12; - static constexpr uint16_t kTypeMask = 0xf000; - // Limits - static constexpr size_t kPackageSizeMax = 128; - static constexpr size_t kChecksumSize = 2; - static constexpr size_t kRequestHeaderSize = 4; - static constexpr size_t kResponseHeaderSize = 8; - static_assert(kPackageSizeMax > (kResponseHeaderSize + kChecksumSize)); - - Protocol2(Storage & store) : Protocol(store) {} - virtual bool Execute(ByteSpan & request, MutableByteSpan & response); -}; - -} // namespace Provision -} // namespace Silabs -} // namespace DeviceLayer -} // namespace chip diff --git a/src/platform/silabs/provision/ProvisionStorage.h b/src/platform/silabs/provision/ProvisionStorage.h deleted file mode 100644 index f169ee771f75b8..00000000000000 --- a/src/platform/silabs/provision/ProvisionStorage.h +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright (c) 2024 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -#include "ProvisionStorageGeneric.h" -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace chip { -namespace DeviceLayer { -namespace Silabs { -namespace Provision { - -namespace Parameters { - -enum ID : uint16_t -{ - // Internal, - kFlashAddress = 0x0101, - kFlashSize = 0x0102, - kFlashPageSize = 0x0103, - kCredsAddress = 0x0104, - kCsrFile = 0x0105, - // Options, - kVersion = 0x0111, - kAction = 0x0112, - kExtra = 0x0113, - kStop = 0x0114, - kParamsPath = 0x0121, - kInputsPath = 0x0122, - kOutputPath = 0x0123, - kTemporaryDir = 0x0124, - kTargetDevice = 0x0131, - kChannel = 0x0132, - kGenerateCreds = 0x0133, - kCsrMode = 0x0134, - kGeneratorFW = 0x0135, - kProductionFW = 0x0136, - kCertToolPath = 0x0137, - kPylinkLib = 0x013a, - kBufferSize = 0x013b, - // Instance Info, - kSerialNumber = 0x0141, - kVendorId = 0x0142, - kVendorName = 0x0143, - kProductId = 0x0144, - kProductName = 0x0145, - kProductLabel = 0x0146, - kProductUrl = 0x0147, - kPartNumber = 0x0148, - kHwVersion = 0x0151, - kHwVersionStr = 0x0152, - kManufacturingDate = 0x0153, - kPersistentUniqueId = 0x0154, - // Commissionable Data, - kDiscriminator = 0x0161, - kSpake2pPasscode = 0x0162, - kSpake2pIterations = 0x0163, - kSpake2pSalt = 0x0164, - kSpake2pVerifier = 0x0165, - kSetupPayload = 0x0166, - kCommissioningFlow = 0x0167, - kRendezvousFlags = 0x0168, - // Attestation Credentials, - kFirmwareInfo = 0x0181, - kCertification = 0x0182, - kCdCert = 0x0183, - kCdKey = 0x0184, - kPaaCert = 0x0191, - kPaaKey = 0x0192, - kPaiCert = 0x0193, - kPaiKey = 0x0194, - kDacCert = 0x0195, - kDacKey = 0x0196, - kKeyId = 0x0197, - kKeyPass = 0x0198, - kPKCS12 = 0x0199, - kCommonName = 0x01a1, - kOtaTlvEncryptionKey = 0x01a2, -}; - -} // namespace Parameters - -struct CustomStorage : public GenericStorage -{ - CHIP_ERROR Set(uint16_t id, const uint8_t * value) override; - CHIP_ERROR Get(uint16_t id, uint8_t & value) override; - CHIP_ERROR Set(uint16_t id, const uint16_t * value) override; - CHIP_ERROR Get(uint16_t id, uint16_t & value) override; - CHIP_ERROR Set(uint16_t id, const uint32_t * value) override; - CHIP_ERROR Get(uint16_t id, uint32_t & value) override; - CHIP_ERROR Set(uint16_t id, const uint64_t * value) override; - CHIP_ERROR Get(uint16_t id, uint64_t & value) override; - CHIP_ERROR Get(uint16_t id, uint8_t * value, size_t max_size, size_t & size) override; - CHIP_ERROR Set(uint16_t id, const uint8_t * value, size_t size) override; -}; - -namespace { -constexpr size_t kVersionFieldLengthInBits = 3; -constexpr size_t kVendorIDFieldLengthInBits = 16; -constexpr size_t kProductIDFieldLengthInBits = 16; -constexpr size_t kCommissioningFlowFieldLengthInBits = 2; -constexpr size_t kRendezvousInfoFieldLengthInBits = 8; -constexpr size_t kPayloadDiscriminatorFieldLengthInBits = 12; -constexpr size_t kSetupPINCodeFieldLengthInBits = 27; -constexpr size_t kPaddingFieldLengthInBits = 4; -} // namespace - -struct Storage : public GenericStorage, - public chip::DeviceLayer::DeviceInstanceInfoProvider, - public chip::DeviceLayer::CommissionableDataProvider, - public chip::Credentials::DeviceAttestationCredentialsProvider -{ - static constexpr size_t kArgumentSizeMax = 512; - static constexpr size_t kVersionLengthMax = 16; - static constexpr size_t kSerialNumberLengthMax = 32; - static constexpr size_t kVendorNameLengthMax = 32; - static constexpr size_t kProductNameLengthMax = 32; - static constexpr size_t kProductLabelLengthMax = 32; - static constexpr size_t kProductUrlLengthMax = 32; - static constexpr size_t kPartNumberLengthMax = 32; - static constexpr size_t kHardwareVersionStrLengthMax = 32; - static constexpr size_t kManufacturingDateLengthMax = 11; // yyyy-mm-dd + \0 - static constexpr size_t kPersistentUniqueIdMaxLength = 16; - static constexpr size_t kSpake2pVerifierB64LengthMax = BASE64_ENCODED_LEN(chip::Crypto::kSpake2p_VerifierSerialized_Length) + 1; - static constexpr size_t kSpake2pSaltB64LengthMax = BASE64_ENCODED_LEN(chip::Crypto::kSpake2p_Max_PBKDF_Salt_Length) + 1; - static constexpr size_t kFirmwareInfoSizeMax = 32; - static constexpr size_t kCertificationSizeMax = 350; - static constexpr size_t kDeviceAttestationKeySizeMax = 128; - static constexpr size_t kSetupPayloadSizeMax = 32; - static constexpr size_t kCsrLengthMax = 512; - static constexpr size_t kCommonNameMax = 128; - static constexpr size_t kTotalPayloadDataSizeInBits = - (kVersionFieldLengthInBits + kVendorIDFieldLengthInBits + kProductIDFieldLengthInBits + - kCommissioningFlowFieldLengthInBits + kRendezvousInfoFieldLengthInBits + kPayloadDiscriminatorFieldLengthInBits + - kSetupPINCodeFieldLengthInBits + kPaddingFieldLengthInBits); - static constexpr size_t kTotalPayloadDataSize = kTotalPayloadDataSizeInBits / 8; - -public: - friend class Manager; - friend class Protocol1; - friend class Command; - friend class CsrCommand; - friend class ReadCommand; - friend class WriteCommand; - - // - // Initialization - // - - CHIP_ERROR Initialize(uint32_t flash_addr = 0, uint32_t flash_size = 0); - CHIP_ERROR Commit(); - - // - // Generic Interface - // - - CHIP_ERROR Get(uint16_t id, uint8_t & value) override; - CHIP_ERROR Get(uint16_t id, uint16_t & value) override; - CHIP_ERROR Get(uint16_t id, uint32_t & value) override; - CHIP_ERROR Get(uint16_t id, uint64_t & value) override; - CHIP_ERROR Get(uint16_t id, uint8_t * value, size_t max_size, size_t & size) override; - - // - // DeviceInstanceInfoProvider - // - - CHIP_ERROR GetSerialNumber(char * value, size_t max); - CHIP_ERROR GetVendorId(uint16_t & value); - CHIP_ERROR GetVendorName(char * value, size_t max); - CHIP_ERROR GetProductId(uint16_t & productId); - CHIP_ERROR GetProductName(char * value, size_t max); - CHIP_ERROR GetProductLabel(char * value, size_t max); - CHIP_ERROR GetProductURL(char * value, size_t max); - CHIP_ERROR GetPartNumber(char * value, size_t max); - CHIP_ERROR GetHardwareVersion(uint16_t & value); - CHIP_ERROR GetHardwareVersionString(char * value, size_t max); - CHIP_ERROR GetManufacturingDate(uint16_t & year, uint8_t & month, uint8_t & day); - CHIP_ERROR GetRotatingDeviceIdUniqueId(MutableByteSpan & value); - - // - // CommissionableDataProvider - // - - CHIP_ERROR GetSetupDiscriminator(uint16_t & value); - CHIP_ERROR GetSpake2pIterationCount(uint32_t & value); - CHIP_ERROR GetSetupPasscode(uint32_t & value); - CHIP_ERROR GetSpake2pSalt(MutableByteSpan & value); - CHIP_ERROR GetSpake2pVerifier(MutableByteSpan & value, size_t & size); - - // - // DeviceAttestationCredentialsProvider - // - - CHIP_ERROR GetFirmwareInformation(MutableByteSpan & value); - CHIP_ERROR GetCertificationDeclaration(MutableByteSpan & value); - CHIP_ERROR GetProductAttestationIntermediateCert(MutableByteSpan & value); - CHIP_ERROR GetDeviceAttestationCert(MutableByteSpan & value); - CHIP_ERROR GetDeviceAttestationCSR(uint16_t vid, uint16_t pid, const CharSpan & cn, MutableCharSpan & csr); - CHIP_ERROR SignWithDeviceAttestationKey(const ByteSpan & message, MutableByteSpan & signature); - - CHIP_ERROR SetCertificationDeclaration(const ByteSpan & value); - CHIP_ERROR SetProductAttestationIntermediateCert(const ByteSpan & value); - CHIP_ERROR SetDeviceAttestationCert(const ByteSpan & value); - CHIP_ERROR SetDeviceAttestationKey(const ByteSpan & value); - // - // Other - // - - CHIP_ERROR SetCredentialsBaseAddress(uint32_t addr); - CHIP_ERROR GetCredentialsBaseAddress(uint32_t & addr); - CHIP_ERROR GetSetupPayload(chip::MutableCharSpan & value); - CHIP_ERROR SetProvisionRequest(bool value); - CHIP_ERROR GetProvisionRequest(bool & value); - CHIP_ERROR GetTestEventTriggerKey(MutableByteSpan & keySpan); - void SetBufferSize(size_t size) { mBufferSize = size > 0 ? size : kArgumentSizeMax; } - size_t GetBufferSize() { return mBufferSize; } - -private: - // Generic Interface - CHIP_ERROR Set(uint16_t id, const uint8_t * value) override; - CHIP_ERROR Set(uint16_t id, const uint16_t * value) override; - CHIP_ERROR Set(uint16_t id, const uint32_t * value) override; - CHIP_ERROR Set(uint16_t id, const uint64_t * value) override; - CHIP_ERROR Set(uint16_t id, const uint8_t * value, size_t size) override; - // DeviceInstanceInfoProvider - CHIP_ERROR SetSerialNumber(const char * value, size_t len); - CHIP_ERROR SetVendorId(uint16_t value); - CHIP_ERROR SetVendorName(const char * value, size_t len); - CHIP_ERROR SetProductId(uint16_t productId); - CHIP_ERROR SetProductName(const char * value, size_t len); - CHIP_ERROR SetProductLabel(const char * value, size_t len); - CHIP_ERROR SetProductURL(const char * value, size_t len); - CHIP_ERROR SetPartNumber(const char * value, size_t len); - CHIP_ERROR SetHardwareVersion(uint16_t value); - CHIP_ERROR SetHardwareVersionString(const char * value, size_t len); - CHIP_ERROR SetManufacturingDate(const char * value, size_t len); - CHIP_ERROR GetManufacturingDate(uint8_t * value, size_t max, size_t & size); - // PersistentUniqueId is used to generate the RotatingUniqueId - // This PersistentUniqueId SHALL NOT be the same as the UniqueID attribute exposed in the Basic Information cluster. - CHIP_ERROR SetPersistentUniqueId(const uint8_t * value, size_t size); - CHIP_ERROR GetPersistentUniqueId(uint8_t * value, size_t max, size_t & size); - // CommissionableDataProvider - CHIP_ERROR SetSetupDiscriminator(uint16_t value); - CHIP_ERROR SetSpake2pIterationCount(uint32_t value); - CHIP_ERROR SetSetupPasscode(uint32_t value); - CHIP_ERROR SetSpake2pSalt(const char * value, size_t size); - CHIP_ERROR GetSpake2pSalt(char * value, size_t max, size_t & size); - CHIP_ERROR SetSpake2pVerifier(const char * value, size_t size); - CHIP_ERROR GetSpake2pVerifier(char * value, size_t max, size_t & size); - // DeviceAttestationCredentialsProvider - CHIP_ERROR SetFirmwareInformation(const ByteSpan & value); - - // Other - CHIP_ERROR SetProvisionVersion(const char * value, size_t len); - CHIP_ERROR GetProvisionVersion(char * value, size_t max, size_t & size); - CHIP_ERROR SetSetupPayload(const uint8_t * value, size_t size); - CHIP_ERROR GetSetupPayload(uint8_t * value, size_t max, size_t & size); -#if OTA_ENCRYPTION_ENABLE - CHIP_ERROR SetOtaTlvEncryptionKey(const ByteSpan & value); -#endif - - uint16_t mVendorId = 0; - uint16_t mProductId = 0; - uint16_t mHwVersion = 0; - uint16_t mDiscriminator = 0; // 12-bit - uint32_t mCommissioningFlow = 0; - uint32_t mRendezvousFlags = 0; - uint32_t mPasscode = 0; - uint32_t mKeyId = 0; - uint32_t mBufferSize = kArgumentSizeMax; - char mCommonName[kCommonNameMax] = { 0 }; - CustomStorage mCustom; -}; - -} // namespace Provision -} // namespace Silabs -} // namespace DeviceLayer -} // namespace chip diff --git a/src/platform/silabs/provision/ProvisionStorageGeneric.h b/src/platform/silabs/provision/ProvisionStorageGeneric.h deleted file mode 100644 index 6c3cdc2c42a39f..00000000000000 --- a/src/platform/silabs/provision/ProvisionStorageGeneric.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2024 Project CHIP Authors - * All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#pragma once - -#include -#include -#include - -namespace chip { -namespace DeviceLayer { -namespace Silabs { -namespace Provision { - -struct GenericStorage -{ - virtual ~GenericStorage() = default; - - virtual CHIP_ERROR Set(uint16_t id, const uint8_t * value) = 0; - virtual CHIP_ERROR Get(uint16_t id, uint8_t & value) = 0; - virtual CHIP_ERROR Set(uint16_t id, const uint16_t * value) = 0; - virtual CHIP_ERROR Get(uint16_t id, uint16_t & value) = 0; - virtual CHIP_ERROR Set(uint16_t id, const uint32_t * value) = 0; - virtual CHIP_ERROR Get(uint16_t id, uint32_t & value) = 0; - virtual CHIP_ERROR Set(uint16_t id, const uint64_t * value) = 0; - virtual CHIP_ERROR Get(uint16_t id, uint64_t & value) = 0; - virtual CHIP_ERROR Get(uint16_t id, uint8_t * value, size_t max_size, size_t & size) = 0; - virtual CHIP_ERROR Set(uint16_t id, const uint8_t * value, size_t size) = 0; -}; - -} // namespace Provision -} // namespace Silabs -} // namespace DeviceLayer -} // namespace chip diff --git a/src/platform/silabs/provision/args.gni b/src/platform/silabs/provision/args.gni deleted file mode 100644 index a92793192bed59..00000000000000 --- a/src/platform/silabs/provision/args.gni +++ /dev/null @@ -1,19 +0,0 @@ -# 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") - -declare_args() { - sl_provision_root = "${chip_root}/src/platform/silabs/provision" -} diff --git a/src/platform/silabs/wifi/BUILD.gn b/src/platform/silabs/wifi/BUILD.gn index dd78a42821a824..af6d82fc30cbbc 100644 --- a/src/platform/silabs/wifi/BUILD.gn +++ b/src/platform/silabs/wifi/BUILD.gn @@ -136,7 +136,7 @@ source_set("wifi-platform") { "${silabs_platform_dir}/wifi/wiseconnect-interface/WiseconnectWifiInterface.h", # Wi-Fi Config - Using the file sdk support until the wiseconnect file is fixed - "${sdk_support_root}/components/service/network_manager/src/sl_net_for_lwip.c", + "${matter_support_root}/sdk-copies/components/service/network_manager/src/sl_net_for_lwip.c", ] public_deps += [ "${lwip_root}:lwip" ] diff --git a/src/platform/silabs/wifi/SiWx/ncp/rs9117.gni b/src/platform/silabs/wifi/SiWx/ncp/rs9117.gni index 376bb7546c00bf..4d19d50b161634 100644 --- a/src/platform/silabs/wifi/SiWx/ncp/rs9117.gni +++ b/src/platform/silabs/wifi/SiWx/ncp/rs9117.gni @@ -43,7 +43,7 @@ rs9117_src_sapi = [ "${wifi_sdk_root}/components/device/silabs/si91x/wireless/ncp_interface/sl_si91x_ncp_driver.c", # Wi-Fi Config - Using the file sdk support until the wiseconnect file is fixed - "${sdk_support_root}/components/service/network_manager/src/sl_net_for_lwip.c", + "${matter_support_root}/sdk-copies/components/service/network_manager/src/sl_net_for_lwip.c", # wifi component "${wifi_sdk_root}/components/protocol/wifi/src/sl_wifi_basic_credentials.c", diff --git a/src/platform/telink/tlsr9258a_2m_flash.overlay b/src/platform/telink/tlsr9258a_2m_flash.overlay deleted file mode 100644 index bdfc0a45709fc1..00000000000000 --- a/src/platform/telink/tlsr9258a_2m_flash.overlay +++ /dev/null @@ -1,35 +0,0 @@ -&flash { - reg = <0x20000000 0x200000>; - - /delete-node/ partitions; - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - boot_partition: partition@0 { - label = "mcuboot"; - reg = <0x00000000 0x13000>; - }; - slot0_partition: partition@13000 { - label = "image-0"; - reg = <0x13000 0xef000>; - }; - factory_partition: partition@102000 { - label = "factory-data"; - reg = <0x102000 0x1000>; - }; - storage_partition: partition@103000 { - label = "storage"; - reg = <0x103000 0xc000>; - }; - slot1_partition: partition@10f000 { - label = "image-1"; - reg = <0x10f000 0xef000>; - }; - vendor_partition: partition@1fe000 { - label = "vendor-data"; - reg = <0x1fe000 0x2000>; - }; - }; -}; diff --git a/src/platform/telink/tlsr9258a_retention.overlay b/src/platform/telink/tlsr9258a_retention.overlay deleted file mode 100644 index 0890951e787f96..00000000000000 --- a/src/platform/telink/tlsr9258a_retention.overlay +++ /dev/null @@ -1,24 +0,0 @@ -/ { - /* - * There is no way to keep GPIOs - * during deep-sleep mode so output GPIOs - * and PWM's are useless. - */ - - aliases { - /delete-property/ led0; - /delete-property/ led1; - /delete-property/ led2; - /delete-property/ led3; - /delete-property/ mcuboot-led0; - /delete-property/ pwm-led0; - /delete-property/ pwm-0; - }; - - /delete-node/ leds; - /delete-node/ pwm_leds; -}; - -&pwm0 { - status = "disabled"; -}; diff --git a/src/protocols/bdx/AsyncTransferFacilitator.cpp b/src/protocols/bdx/AsyncTransferFacilitator.cpp index 2e3a0f03794319..eb3d996b1e53b8 100644 --- a/src/protocols/bdx/AsyncTransferFacilitator.cpp +++ b/src/protocols/bdx/AsyncTransferFacilitator.cpp @@ -63,6 +63,17 @@ void AsyncTransferFacilitator::ProcessOutputEvents() mTransfer.GetNextAction(outEvent); while (outEvent.EventType != TransferSession::OutputEventType::kNone) { + + // If the transfer session state machine generates an event of type TransferSession::OutputEventType::kInternalError, + // indicating that the session is in a bad state, it will keep doing that thereafter. + // + // So stop trying to process events, and go ahead and destroy ourselves to clean up the transfer. + if (outEvent.EventType == TransferSession::OutputEventType::kInternalError) + { + mDestroySelfAfterProcessingEvents = true; + break; + } + if (outEvent.EventType == TransferSession::OutputEventType::kMsgToSend) { CHIP_ERROR err = SendMessage(outEvent.msgTypeData, outEvent.MsgData); @@ -170,10 +181,14 @@ void AsyncResponder::NotifyEventHandled(const TransferSession::OutputEventType e ChipLogDetail(BDX, "NotifyEventHandled : Event %s Error %" CHIP_ERROR_FORMAT, TransferSession::OutputEvent::TypeToString(eventType), status.Format()); - // If this is the end of the transfer (whether a clean end, or some sort of error condition), ensure that - // we destroy ourselves after processing any output events that might have been generated by - // the transfer session to handle end-of-transfer (e.g. in some error conditions it might want to send - // out a status report). + // If this is the end of the transfer (whether a clean end, or some sort of error condition), ensure + // that we destroy ourselves after unwinding the processing loop in the ProcessOutputEvents API. + // We can ignore the status for these output events because none of them are supposed to result in + // us sending a StatusReport, and that's all we use the status for. + // + // In particular, for kTransferTimeout, kAckEOFReceived, and kStatusReceived per spec we + // are not supposed to reply with a StatusReport. And for kInternalError the state machine + // is in an unrecoverable state of some sort, and we should stop trying to make use of it. if (eventType == TransferSession::OutputEventType::kAckEOFReceived || eventType == TransferSession::OutputEventType::kInternalError || eventType == TransferSession::OutputEventType::kTransferTimeout || @@ -181,11 +196,10 @@ void AsyncResponder::NotifyEventHandled(const TransferSession::OutputEventType e { mDestroySelfAfterProcessingEvents = true; } - - // If there was an error handling the output event, this should notify the transfer object to abort transfer so it can send a - // status report across the exchange when we call ProcessOutputEvents below. - if (status != CHIP_NO_ERROR) + else if (status != CHIP_NO_ERROR) { + // If there was an error handling the output event, this should notify the transfer object to abort transfer + // so it can send a status report across the exchange when we call ProcessOutputEvents below. mTransfer.AbortTransfer(GetBdxStatusCodeFromChipError(status)); } diff --git a/src/protocols/bdx/AsyncTransferFacilitator.h b/src/protocols/bdx/AsyncTransferFacilitator.h index 1ad95d39e98d2d..b9d4b79bf55c5f 100644 --- a/src/protocols/bdx/AsyncTransferFacilitator.h +++ b/src/protocols/bdx/AsyncTransferFacilitator.h @@ -72,7 +72,9 @@ class AsyncTransferFacilitator : public Messaging::ExchangeDelegate */ virtual void DestroySelf() = 0; - // Calling ProcessOutputEvents can destroy this object before the call returns. + /** + * Calling ProcessOutputEvents can destroy this object before the call returns. + */ void ProcessOutputEvents(); // The transfer session corresponding to this AsyncTransferFacilitator object. diff --git a/src/protocols/secure_channel/CASESession.cpp b/src/protocols/secure_channel/CASESession.cpp index 9ae96c88179483..c608c5b1ca4be9 100644 --- a/src/protocols/secure_channel/CASESession.cpp +++ b/src/protocols/secure_channel/CASESession.cpp @@ -110,6 +110,8 @@ constexpr chip::TLV::Tag AsTlvContextTag(Enum e) return chip::TLV::ContextTag(chip::to_underlying(e)); } +constexpr size_t kCaseOverheadForFutureTBEData = 128; + } // namespace namespace chip { @@ -349,48 +351,6 @@ class CASESession::WorkHelper DATA mData; }; -struct CASESession::SendSigma3Data -{ - FabricIndex fabricIndex; - - // Use one or the other - const FabricTable * fabricTable; - const Crypto::OperationalKeystore * keystore; - - chip::Platform::ScopedMemoryBuffer msg_R3_Signed; - size_t msg_r3_signed_len; - - chip::Platform::ScopedMemoryBuffer msg_R3_Encrypted; - size_t msg_r3_encrypted_len; - - chip::Platform::ScopedMemoryBuffer icacBuf; - MutableByteSpan icaCert; - - chip::Platform::ScopedMemoryBuffer nocBuf; - MutableByteSpan nocCert; - - P256ECDSASignature tbsData3Signature; -}; - -struct CASESession::HandleSigma3Data -{ - chip::Platform::ScopedMemoryBuffer msg_R3_Signed; - size_t msg_r3_signed_len; - - ByteSpan initiatorNOC; - ByteSpan initiatorICAC; - - uint8_t rootCertBuf[kMaxCHIPCertLength]; - ByteSpan fabricRCAC; - - P256ECDSASignature tbsData3Signature; - - FabricId fabricId; - NodeId initiatorNodeId; - - ValidationContext validContext; -}; - CASESession::~CASESession() { // Let's clear out any security state stored in the object, before destroying it. @@ -1163,7 +1123,7 @@ CHIP_ERROR CASESession::PrepareSigma2Resume(EncodeSigma2ResumeInputs & outSigma2 outSigma2ResData.resumptionId = mNewResumptionId; ReturnErrorOnFailure(GenerateSigmaResumeMIC(ByteSpan(mInitiatorRandom), mNewResumptionId, ByteSpan(kKDFS2RKeyInfo), - ByteSpan(kResume2MIC_Nonce), outSigma2ResData.resumeMIC)); + ByteSpan(kResume2MIC_Nonce), outSigma2ResData.sigma2ResumeMIC)); outSigma2ResData.responderMrpConfig = &mLocalMRPConfig.Value(); @@ -1192,7 +1152,7 @@ CHIP_ERROR CASESession::EncodeSigma2Resume(System::PacketBufferHandle & msgR2Res ReturnErrorOnFailure(tlvWriter.StartContainer(AnonymousTag(), kTLVType_Structure, outerContainerType)); ReturnErrorOnFailure(tlvWriter.Put(AsTlvContextTag(Sigma2ResumeTags::kResumptionID), input.resumptionId)); - ReturnErrorOnFailure(tlvWriter.Put(AsTlvContextTag(Sigma2ResumeTags::kSigma2ResumeMIC), input.resumeMIC)); + ReturnErrorOnFailure(tlvWriter.Put(AsTlvContextTag(Sigma2ResumeTags::kSigma2ResumeMIC), input.sigma2ResumeMIC)); ReturnErrorOnFailure(tlvWriter.Put(AsTlvContextTag(Sigma2ResumeTags::kResponderSessionID), input.responderSessionId)); ReturnErrorOnFailure( @@ -1400,54 +1360,35 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg) { MATTER_TRACE_SCOPE("HandleSigma2Resume", "CASESession"); CHIP_ERROR err = CHIP_NO_ERROR; - System::PacketBufferTLVReader tlvReader; - TLV::TLVType containerType = TLV::kTLVType_Structure; - - uint16_t responderSessionId; - - uint32_t decodeTagIdSeq = 0; ChipLogDetail(SecureChannel, "Received Sigma2Resume msg"); MATTER_TRACE_COUNTER("Sigma2Resume"); MATTER_LOG_METRIC_END(kMetricDeviceCASESessionSigma1, err); - uint8_t sigma2ResumeMIC[CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES]; - + System::PacketBufferTLVReader tlvReader; tlvReader.Init(std::move(msg)); - SuccessOrExit(err = tlvReader.Next(containerType, TLV::AnonymousTag())); - SuccessOrExit(err = tlvReader.EnterContainer(containerType)); - - SuccessOrExit(err = tlvReader.Next()); - VerifyOrExit(TLV::TagNumFromTag(tlvReader.GetTag()) == ++decodeTagIdSeq, err = CHIP_ERROR_INVALID_TLV_TAG); - SessionResumptionStorage::ResumptionIdStorage resumptionId; - VerifyOrExit(tlvReader.GetLength() == resumptionId.size(), err = CHIP_ERROR_INVALID_TLV_ELEMENT); - SuccessOrExit(err = tlvReader.GetBytes(resumptionId.data(), resumptionId.size())); + ParsedSigma2Resume parsedSigma2Resume; + SuccessOrExit(err = ParseSigma2Resume(tlvReader, parsedSigma2Resume)); - SuccessOrExit(err = tlvReader.Next()); - VerifyOrExit(TLV::TagNumFromTag(tlvReader.GetTag()) == ++decodeTagIdSeq, err = CHIP_ERROR_INVALID_TLV_TAG); - VerifyOrExit(tlvReader.GetLength() == CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, err = CHIP_ERROR_INVALID_TLV_ELEMENT); - SuccessOrExit(err = tlvReader.GetBytes(sigma2ResumeMIC, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES)); + SuccessOrExit(err = ValidateSigmaResumeMIC(parsedSigma2Resume.sigma2ResumeMIC, ByteSpan(mInitiatorRandom), + parsedSigma2Resume.resumptionId, ByteSpan(kKDFS2RKeyInfo), + ByteSpan(kResume2MIC_Nonce))); - SuccessOrExit(err = ValidateSigmaResumeMIC(ByteSpan(sigma2ResumeMIC), ByteSpan(mInitiatorRandom), resumptionId, - ByteSpan(kKDFS2RKeyInfo), ByteSpan(kResume2MIC_Nonce))); - - SuccessOrExit(err = tlvReader.Next()); - VerifyOrExit(TLV::TagNumFromTag(tlvReader.GetTag()) == ++decodeTagIdSeq, err = CHIP_ERROR_INVALID_TLV_TAG); - SuccessOrExit(err = tlvReader.Get(responderSessionId)); - - if (tlvReader.Next() != CHIP_END_OF_TLV) + if (parsedSigma2Resume.responderSessionParamStructPresent) { - SuccessOrExit(err = DecodeSessionParametersIfPresent(TLV::ContextTag(4), tlvReader, mRemoteSessionParams)); + SetRemoteSessionParameters(parsedSigma2Resume.responderSessionParams); mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters( GetRemoteSessionParameters()); } - ChipLogDetail(SecureChannel, "Peer assigned session session ID %d", responderSessionId); - SetPeerSessionId(responderSessionId); + ChipLogDetail(SecureChannel, "Peer assigned session ID %d", parsedSigma2Resume.responderSessionId); + SetPeerSessionId(parsedSigma2Resume.responderSessionId); if (mSessionResumptionStorage != nullptr) { - CHIP_ERROR err2 = mSessionResumptionStorage->Save(GetPeer(), resumptionId, mSharedSecret, mPeerCATs); + CHIP_ERROR err2 = mSessionResumptionStorage->Save( + GetPeer(), SessionResumptionStorage::ConstResumptionIdView(parsedSigma2Resume.resumptionId.data()), mSharedSecret, + mPeerCATs); if (err2 != CHIP_NO_ERROR) ChipLogError(SecureChannel, "Unable to save session resumption state: %" CHIP_ERROR_FORMAT, err2.Format()); } @@ -1466,12 +1407,52 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg) return err; } +CHIP_ERROR CASESession::ParseSigma2Resume(ContiguousBufferTLVReader & tlvReader, ParsedSigma2Resume & outParsedSigma2Resume) +{ + TLVType containerType = kTLVType_Structure; + + ReturnErrorOnFailure(tlvReader.Next(containerType, AnonymousTag())); + ReturnErrorOnFailure(tlvReader.EnterContainer(containerType)); + + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma2ResumeTags::kResumptionID))); + ReturnErrorOnFailure(tlvReader.GetByteView(outParsedSigma2Resume.resumptionId)); + VerifyOrReturnError(outParsedSigma2Resume.resumptionId.size() == SessionResumptionStorage::kResumptionIdSize, + CHIP_ERROR_INVALID_CASE_PARAMETER); + + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma2ResumeTags::kSigma2ResumeMIC))); + ReturnErrorOnFailure(tlvReader.GetByteView(outParsedSigma2Resume.sigma2ResumeMIC)); + VerifyOrReturnError(outParsedSigma2Resume.sigma2ResumeMIC.size() == CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, + CHIP_ERROR_INVALID_CASE_PARAMETER); + + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma2ResumeTags::kResponderSessionID))); + ReturnErrorOnFailure(tlvReader.Get(outParsedSigma2Resume.responderSessionId)); + + CHIP_ERROR err = tlvReader.Next(); + if (err == CHIP_NO_ERROR && tlvReader.GetTag() == AsTlvContextTag(Sigma2ResumeTags::kResponderSessionParams)) + { + ReturnErrorOnFailure(DecodeSessionParametersIfPresent(AsTlvContextTag(Sigma2ResumeTags::kResponderSessionParams), tlvReader, + outParsedSigma2Resume.responderSessionParams)); + outParsedSigma2Resume.responderSessionParamStructPresent = true; + + err = tlvReader.Next(); + } + + // Future-proofing: CHIP_NO_ERROR will be returned by Next() if we have additional non-parsed TLV Elements, which could + // happen in the future if additional elements are added to the specification. + VerifyOrReturnError(err == CHIP_END_OF_TLV || err == CHIP_NO_ERROR, err); + // Exit Container will fail (return CHIP_END_OF_TLV) if the received encoded message is not properly terminated with an + // EndOfContainer TLV Element. + ReturnErrorOnFailure(tlvReader.ExitContainer(containerType)); + + return CHIP_NO_ERROR; +} + CHIP_ERROR CASESession::HandleSigma2_and_SendSigma3(System::PacketBufferHandle && msg) { MATTER_TRACE_SCOPE("HandleSigma2_and_SendSigma3", "CASESession"); CHIP_ERROR err = HandleSigma2(std::move(msg)); MATTER_LOG_METRIC_END(kMetricDeviceCASESessionSigma1, err); - ReturnErrorOnFailure(err); + SuccessOrExit(err); MATTER_LOG_METRIC_BEGIN(kMetricDeviceCASESessionSigma3); err = SendSigma3a(); @@ -1479,200 +1460,249 @@ CHIP_ERROR CASESession::HandleSigma2_and_SendSigma3(System::PacketBufferHandle & { MATTER_LOG_METRIC_END(kMetricDeviceCASESessionSigma3, err); } + +exit: + if (CHIP_NO_ERROR != err) + { + SendStatusReport(mExchangeCtxt, kProtocolCodeInvalidParam); + mState = State::kInitialized; + } return err; } CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg) { MATTER_TRACE_SCOPE("HandleSigma2", "CASESession"); - CHIP_ERROR err = CHIP_NO_ERROR; - System::PacketBufferTLVReader tlvReader; - TLV::TLVReader decryptedDataTlvReader; - TLV::TLVType containerType = TLV::kTLVType_Structure; + ChipLogProgress(SecureChannel, "Received Sigma2 msg"); + + VerifyOrReturnError(mEphemeralKey != nullptr, CHIP_ERROR_INTERNAL); const uint8_t * buf = msg->Start(); size_t buflen = msg->DataLength(); - - uint8_t msg_salt[kIPKSize + kSigmaParamRandomNumberSize + kP256_PublicKey_Length + kSHA256_Hash_Length]; - - chip::Platform::ScopedMemoryBuffer msg_R2_Encrypted; - size_t msg_r2_encrypted_len = 0; - size_t msg_r2_encrypted_len_with_tag = 0; - - chip::Platform::ScopedMemoryBuffer msg_R2_Signed; - size_t msg_r2_signed_len; - size_t max_msg_r2_signed_enc_len; - constexpr size_t kCaseOverheadForFutureTbeData = 128; - - AutoReleaseSessionKey sr2k(*mSessionManager->GetSessionKeystore()); - - P256ECDSASignature tbsData2Signature; - - NodeId responderNodeId; - P256PublicKey responderPublicKey; - - uint8_t responderRandom[kSigmaParamRandomNumberSize]; - ByteSpan responderNOC; - ByteSpan responderICAC; - - uint16_t responderSessionId; - - ChipLogProgress(SecureChannel, "Received Sigma2 msg"); + VerifyOrReturnError(buf != nullptr, CHIP_ERROR_MESSAGE_INCOMPLETE); FabricId fabricId = kUndefinedFabricId; { - VerifyOrExit(mFabricsTable != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(mFabricsTable != nullptr, CHIP_ERROR_INCORRECT_STATE); const auto * fabricInfo = mFabricsTable->FindFabricWithIndex(mFabricIndex); - VerifyOrExit(fabricInfo != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(fabricInfo != nullptr, CHIP_ERROR_INCORRECT_STATE); fabricId = fabricInfo->GetFabricId(); } - VerifyOrExit(mEphemeralKey != nullptr, err = CHIP_ERROR_INTERNAL); - VerifyOrExit(buf != nullptr, err = CHIP_ERROR_MESSAGE_INCOMPLETE); - + System::PacketBufferTLVReader tlvReader; tlvReader.Init(std::move(msg)); - SuccessOrExit(err = tlvReader.Next(containerType, TLV::AnonymousTag())); - SuccessOrExit(err = tlvReader.EnterContainer(containerType)); - - // Retrieve Responder's Random value - SuccessOrExit(err = tlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(Sigma2Tags::kResponderRandom))); - SuccessOrExit(err = tlvReader.GetBytes(responderRandom, sizeof(responderRandom))); - - // Assign Session ID - SuccessOrExit(err = tlvReader.Next(TLV::kTLVType_UnsignedInteger, AsTlvContextTag(Sigma2Tags::kResponderSessionId))); - SuccessOrExit(err = tlvReader.Get(responderSessionId)); + ParsedSigma2 parsedSigma2; + ReturnErrorOnFailure(ParseSigma2(tlvReader, parsedSigma2)); - ChipLogDetail(SecureChannel, "Peer assigned session session ID %d", responderSessionId); - SetPeerSessionId(responderSessionId); - - // Retrieve Responder's Ephemeral Pubkey - SuccessOrExit(err = tlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(Sigma2Tags::kResponderEphPubKey))); - SuccessOrExit(err = tlvReader.GetBytes(mRemotePubKey, static_cast(mRemotePubKey.Length()))); + // ParseSigma2 ensures that: + // mRemotePubKey.Length() == responderEphPubKey.size() == kP256_PublicKey_Length. + memcpy(mRemotePubKey.Bytes(), parsedSigma2.responderEphPubKey.data(), mRemotePubKey.Length()); // Generate a Shared Secret - SuccessOrExit(err = mEphemeralKey->ECDH_derive_secret(mRemotePubKey, mSharedSecret)); + ReturnErrorOnFailure(mEphemeralKey->ECDH_derive_secret(mRemotePubKey, mSharedSecret)); // Generate the S2K key + AutoReleaseSessionKey sr2k(*mSessionManager->GetSessionKeystore()); { + uint8_t msg_salt[kIPKSize + kSigmaParamRandomNumberSize + kP256_PublicKey_Length + kSHA256_Hash_Length]; MutableByteSpan saltSpan(msg_salt); - SuccessOrExit(err = ConstructSaltSigma2(ByteSpan(responderRandom), mRemotePubKey, ByteSpan(mIPK), saltSpan)); - SuccessOrExit(err = DeriveSigmaKey(saltSpan, ByteSpan(kKDFSR2Info), sr2k)); + ReturnErrorOnFailure(ConstructSaltSigma2(parsedSigma2.responderRandom, mRemotePubKey, ByteSpan(mIPK), saltSpan)); + ReturnErrorOnFailure(DeriveSigmaKey(saltSpan, ByteSpan(kKDFSR2Info), sr2k)); } + // Msg2 should only be added to MessageDigest after we construct SaltSigma2 that is used to derive S2K, + // Because constructing SaltSigma2 uses the MessageDigest at a point when it should only include Msg1. + ReturnErrorOnFailure(mCommissioningHash.AddData(ByteSpan{ buf, buflen })); - SuccessOrExit(err = mCommissioningHash.AddData(ByteSpan{ buf, buflen })); + ReturnErrorOnFailure(AES_CCM_decrypt(parsedSigma2.msgR2EncryptedPayload.data(), parsedSigma2.msgR2EncryptedPayload.size(), + nullptr, 0, parsedSigma2.msgR2MIC.data(), parsedSigma2.msgR2MIC.size(), sr2k.KeyHandle(), + kTBEData2_Nonce, kTBEDataNonceLength, parsedSigma2.msgR2EncryptedPayload.data())); - // Generate decrypted data - SuccessOrExit(err = tlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(Sigma2Tags::kEncrypted2))); - - max_msg_r2_signed_enc_len = - TLV::EstimateStructOverhead(Credentials::kMaxCHIPCertLength, Credentials::kMaxCHIPCertLength, tbsData2Signature.Length(), - SessionResumptionStorage::kResumptionIdSize, kCaseOverheadForFutureTbeData); - msg_r2_encrypted_len_with_tag = tlvReader.GetLength(); - - // Validate we did not receive a buffer larger than legal - VerifyOrExit(msg_r2_encrypted_len_with_tag <= max_msg_r2_signed_enc_len, err = CHIP_ERROR_INVALID_TLV_ELEMENT); - VerifyOrExit(msg_r2_encrypted_len_with_tag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, err = CHIP_ERROR_INVALID_TLV_ELEMENT); - VerifyOrExit(msg_R2_Encrypted.Alloc(msg_r2_encrypted_len_with_tag), err = CHIP_ERROR_NO_MEMORY); - - SuccessOrExit(err = tlvReader.GetBytes(msg_R2_Encrypted.Get(), static_cast(msg_r2_encrypted_len_with_tag))); - msg_r2_encrypted_len = msg_r2_encrypted_len_with_tag - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES; - - SuccessOrExit(err = AES_CCM_decrypt(msg_R2_Encrypted.Get(), msg_r2_encrypted_len, nullptr, 0, - msg_R2_Encrypted.Get() + msg_r2_encrypted_len, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, - sr2k.KeyHandle(), kTBEData2_Nonce, kTBEDataNonceLength, msg_R2_Encrypted.Get())); - - decryptedDataTlvReader.Init(msg_R2_Encrypted.Get(), msg_r2_encrypted_len); - containerType = TLV::kTLVType_Structure; - SuccessOrExit(err = decryptedDataTlvReader.Next(containerType, TLV::AnonymousTag())); - SuccessOrExit(err = decryptedDataTlvReader.EnterContainer(containerType)); + ContiguousBufferTLVReader decryptedDataTlvReader; + decryptedDataTlvReader.Init(parsedSigma2.msgR2EncryptedPayload.data(), parsedSigma2.msgR2EncryptedPayload.size()); + ParsedSigma2TBEData parsedSigma2TBEData; + ReturnErrorOnFailure(ParseSigma2TBEData(decryptedDataTlvReader, parsedSigma2TBEData)); - SuccessOrExit(err = decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSenderNOC))); - SuccessOrExit(err = decryptedDataTlvReader.Get(responderNOC)); - - SuccessOrExit(err = decryptedDataTlvReader.Next()); - if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC)) - { - VerifyOrExit(decryptedDataTlvReader.GetType() == TLV::kTLVType_ByteString, err = CHIP_ERROR_WRONG_TLV_TYPE); - SuccessOrExit(err = decryptedDataTlvReader.Get(responderICAC)); - SuccessOrExit(err = decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature))); - } - - // Validate responder identity located in msg_r2_encrypted + // Validate responder identity located in msgR2Encrypted // Constructing responder identity + P256PublicKey responderPublicKey; { + NodeId responderNodeId; + CompressedFabricId unused; FabricId responderFabricId; - SuccessOrExit(err = SetEffectiveTime()); - SuccessOrExit(err = mFabricsTable->VerifyCredentials(mFabricIndex, responderNOC, responderICAC, mValidContext, unused, - responderFabricId, responderNodeId, responderPublicKey)); - VerifyOrExit(fabricId == responderFabricId, err = CHIP_ERROR_INVALID_CASE_PARAMETER); + ReturnErrorOnFailure(SetEffectiveTime()); + ReturnErrorOnFailure(mFabricsTable->VerifyCredentials(mFabricIndex, parsedSigma2TBEData.responderNOC, + parsedSigma2TBEData.responderICAC, mValidContext, unused, + responderFabricId, responderNodeId, responderPublicKey)); + VerifyOrReturnError(fabricId == responderFabricId, CHIP_ERROR_INVALID_CASE_PARAMETER); // Verify that responderNodeId (from responderNOC) matches one that was included // in the computation of the Destination Identifier when generating Sigma1. - VerifyOrExit(mPeerNodeId == responderNodeId, err = CHIP_ERROR_INVALID_CASE_PARAMETER); + VerifyOrReturnError(mPeerNodeId == responderNodeId, CHIP_ERROR_INVALID_CASE_PARAMETER); } - // Construct msg_R2_Signed and validate the signature in msg_r2_encrypted - msg_r2_signed_len = TLV::EstimateStructOverhead(sizeof(uint16_t), responderNOC.size(), responderICAC.size(), - kP256_PublicKey_Length, kP256_PublicKey_Length); - - VerifyOrExit(msg_R2_Signed.Alloc(msg_r2_signed_len), err = CHIP_ERROR_NO_MEMORY); + // Construct msgR2Signed and validate the signature in msgR2Encrypted. + size_t msgR2SignedLen = EstimateStructOverhead(parsedSigma2TBEData.responderNOC.size(), // resonderNOC + parsedSigma2TBEData.responderICAC.size(), // responderICAC + kP256_PublicKey_Length, // responderEphPubKey + kP256_PublicKey_Length // initiatorEphPubKey + ); - SuccessOrExit(err = ConstructTBSData(responderNOC, responderICAC, ByteSpan(mRemotePubKey, mRemotePubKey.Length()), - ByteSpan(mEphemeralKey->Pubkey(), mEphemeralKey->Pubkey().Length()), msg_R2_Signed.Get(), - msg_r2_signed_len)); + chip::Platform::ScopedMemoryBuffer msgR2Signed; + VerifyOrReturnError(msgR2Signed.Alloc(msgR2SignedLen), CHIP_ERROR_NO_MEMORY); - VerifyOrExit(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature), err = CHIP_ERROR_INVALID_TLV_TAG); - VerifyOrExit(tbsData2Signature.Capacity() >= decryptedDataTlvReader.GetLength(), err = CHIP_ERROR_INVALID_TLV_ELEMENT); - tbsData2Signature.SetLength(decryptedDataTlvReader.GetLength()); - SuccessOrExit(err = decryptedDataTlvReader.GetBytes(tbsData2Signature.Bytes(), tbsData2Signature.Length())); + ReturnErrorOnFailure(ConstructTBSData( + parsedSigma2TBEData.responderNOC, parsedSigma2TBEData.responderICAC, ByteSpan(mRemotePubKey, mRemotePubKey.Length()), + ByteSpan(mEphemeralKey->Pubkey(), mEphemeralKey->Pubkey().Length()), msgR2Signed.Get(), msgR2SignedLen)); // Validate signature - SuccessOrExit(err = responderPublicKey.ECDSA_validate_msg_signature(msg_R2_Signed.Get(), msg_r2_signed_len, tbsData2Signature)); + ReturnErrorOnFailure( + responderPublicKey.ECDSA_validate_msg_signature(msgR2Signed.Get(), msgR2SignedLen, parsedSigma2TBEData.tbsData2Signature)); - // Retrieve session resumption ID - SuccessOrExit(err = decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kResumptionID))); - SuccessOrExit(err = decryptedDataTlvReader.GetBytes(mNewResumptionId.data(), mNewResumptionId.size())); + ChipLogDetail(SecureChannel, "Peer assigned session ID %d", parsedSigma2.responderSessionId); + SetPeerSessionId(parsedSigma2.responderSessionId); + + std::copy(parsedSigma2TBEData.resumptionId.begin(), parsedSigma2TBEData.resumptionId.end(), mNewResumptionId.begin()); // Retrieve peer CASE Authenticated Tags (CATs) from peer's NOC. - SuccessOrExit(err = ExtractCATsFromOpCert(responderNOC, mPeerCATs)); + ReturnErrorOnFailure(ExtractCATsFromOpCert(parsedSigma2TBEData.responderNOC, mPeerCATs)); - // Retrieve responderMRPParams if present - if (tlvReader.Next() != CHIP_END_OF_TLV) + if (parsedSigma2.responderSessionParamStructPresent) { - SuccessOrExit(err = DecodeSessionParametersIfPresent(AsTlvContextTag(Sigma2Tags::kResponderSessionParams), tlvReader, - mRemoteSessionParams)); + SetRemoteSessionParameters(parsedSigma2.responderSessionParams); mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters( GetRemoteSessionParameters()); } -exit: - if (err != CHIP_NO_ERROR) + return CHIP_NO_ERROR; +} + +CHIP_ERROR CASESession::ParseSigma2(ContiguousBufferTLVReader & tlvReader, ParsedSigma2 & outParsedSigma2) +{ + TLVType containerType = kTLVType_Structure; + + ReturnErrorOnFailure(tlvReader.Next(containerType, AnonymousTag())); + ReturnErrorOnFailure(tlvReader.EnterContainer(containerType)); + + // Retrieve Responder's Random value + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma2Tags::kResponderRandom))); + ReturnErrorOnFailure(tlvReader.GetByteView(outParsedSigma2.responderRandom)); + VerifyOrReturnError(outParsedSigma2.responderRandom.size() == kSigmaParamRandomNumberSize, CHIP_ERROR_INVALID_CASE_PARAMETER); + + // Assign Session ID + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma2Tags::kResponderSessionId))); + ReturnErrorOnFailure(tlvReader.Get(outParsedSigma2.responderSessionId)); + + // Retrieve Responder's Ephemeral Pubkey + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma2Tags::kResponderEphPubKey))); + ReturnErrorOnFailure(tlvReader.GetByteView(outParsedSigma2.responderEphPubKey)); + VerifyOrReturnError(outParsedSigma2.responderEphPubKey.size() == kP256_PublicKey_Length, CHIP_ERROR_INVALID_CASE_PARAMETER); + + // Generate decrypted data + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma2Tags::kEncrypted2))); + + size_t maxMsgR2SignedEncLen = EstimateStructOverhead(kMaxCHIPCertLength, // responderNOC + kMaxCHIPCertLength, // responderICAC + kMax_ECDSA_Signature_Length, // signature + SessionResumptionStorage::kResumptionIdSize, // resumptionID + kCaseOverheadForFutureTBEData // extra bytes for future-proofing + ); + + size_t msgR2EncryptedLenWithTag = tlvReader.GetLength(); + + // Validate we did not receive a buffer larger than legal + VerifyOrReturnError(msgR2EncryptedLenWithTag <= maxMsgR2SignedEncLen, CHIP_ERROR_INVALID_TLV_ELEMENT); + VerifyOrReturnError(msgR2EncryptedLenWithTag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, CHIP_ERROR_INVALID_TLV_ELEMENT); + VerifyOrReturnError(outParsedSigma2.msgR2Encrypted.Alloc(msgR2EncryptedLenWithTag), CHIP_ERROR_NO_MEMORY); + ReturnErrorOnFailure(tlvReader.GetBytes(outParsedSigma2.msgR2Encrypted.Get(), outParsedSigma2.msgR2Encrypted.AllocatedSize())); + + size_t msgR2EncryptedPayloadLen = msgR2EncryptedLenWithTag - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES; + outParsedSigma2.msgR2EncryptedPayload = MutableByteSpan(outParsedSigma2.msgR2Encrypted.Get(), msgR2EncryptedPayloadLen); + outParsedSigma2.msgR2MIC = + ByteSpan(outParsedSigma2.msgR2Encrypted.Get() + msgR2EncryptedPayloadLen, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES); + + // Retrieve responderSessionParams if present + CHIP_ERROR err = tlvReader.Next(); + if (err == CHIP_NO_ERROR && tlvReader.GetTag() == AsTlvContextTag(Sigma2Tags::kResponderSessionParams)) { - SendStatusReport(mExchangeCtxt, kProtocolCodeInvalidParam); + ReturnErrorOnFailure(DecodeSessionParametersIfPresent(AsTlvContextTag(Sigma2Tags::kResponderSessionParams), tlvReader, + outParsedSigma2.responderSessionParams)); + outParsedSigma2.responderSessionParamStructPresent = true; + + err = tlvReader.Next(); } - return err; + + // Future-proofing: CHIP_NO_ERROR will be returned by Next() if we have additional non-parsed TLV Elements, which could + // happen in the future if additional elements are added to the specification. + VerifyOrReturnError(err == CHIP_END_OF_TLV || err == CHIP_NO_ERROR, err); + + // Exit Container will fail (return CHIP_END_OF_TLV) if the received encoded message is not properly terminated with an + // EndOfContainer TLV Element. + ReturnErrorOnFailure(tlvReader.ExitContainer(containerType)); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR CASESession::ParseSigma2TBEData(ContiguousBufferTLVReader & decryptedDataTlvReader, + ParsedSigma2TBEData & outParsedSigma2TBE) +{ + TLVType containerType = kTLVType_Structure; + + ReturnErrorOnFailure(decryptedDataTlvReader.Next(containerType, AnonymousTag())); + ReturnErrorOnFailure(decryptedDataTlvReader.EnterContainer(containerType)); + + ReturnErrorOnFailure(decryptedDataTlvReader.Next(AsTlvContextTag(TBEDataTags::kSenderNOC))); + ReturnErrorOnFailure(decryptedDataTlvReader.GetByteView(outParsedSigma2TBE.responderNOC)); + VerifyOrReturnError(outParsedSigma2TBE.responderNOC.size() <= kMaxCHIPCertLength, CHIP_ERROR_INVALID_CASE_PARAMETER); + + ReturnErrorOnFailure(decryptedDataTlvReader.Next()); + if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC)) + { + ReturnErrorOnFailure(decryptedDataTlvReader.GetByteView(outParsedSigma2TBE.responderICAC)); + VerifyOrReturnError(outParsedSigma2TBE.responderICAC.size() <= kMaxCHIPCertLength, CHIP_ERROR_INVALID_CASE_PARAMETER); + + ReturnErrorOnFailure(decryptedDataTlvReader.Next(kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature))); + } + + VerifyOrReturnError(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature), CHIP_ERROR_INVALID_TLV_TAG); + // tbsData2Signature's length should equal kMax_ECDSA_Signature_Length as per the Specification + size_t signatureLen = decryptedDataTlvReader.GetLength(); + VerifyOrReturnError(outParsedSigma2TBE.tbsData2Signature.Capacity() == signatureLen, CHIP_ERROR_INVALID_TLV_ELEMENT); + outParsedSigma2TBE.tbsData2Signature.SetLength(signatureLen); + ReturnErrorOnFailure(decryptedDataTlvReader.GetBytes(outParsedSigma2TBE.tbsData2Signature.Bytes(), + outParsedSigma2TBE.tbsData2Signature.Length())); + + // Retrieve session resumption ID + ReturnErrorOnFailure(decryptedDataTlvReader.Next(AsTlvContextTag(TBEDataTags::kResumptionID))); + ReturnErrorOnFailure(decryptedDataTlvReader.GetByteView(outParsedSigma2TBE.resumptionId)); + VerifyOrReturnError(outParsedSigma2TBE.resumptionId.size() == SessionResumptionStorage::kResumptionIdSize, + CHIP_ERROR_INVALID_CASE_PARAMETER); + + // Exit Container will fail (return CHIP_END_OF_TLV) if the received encoded message is not properly terminated with an + // EndOfContainer TLV Element. + ReturnErrorOnFailure(decryptedDataTlvReader.ExitContainer(containerType)); + + return CHIP_NO_ERROR; } CHIP_ERROR CASESession::SendSigma3a() { MATTER_TRACE_SCOPE("SendSigma3", "CASESession"); - CHIP_ERROR err = CHIP_NO_ERROR; ChipLogDetail(SecureChannel, "Sending Sigma3"); auto helper = WorkHelper::Create(*this, &SendSigma3b, &CASESession::SendSigma3c); - VerifyOrExit(helper, err = CHIP_ERROR_NO_MEMORY); + VerifyOrReturnError(helper, CHIP_ERROR_NO_MEMORY); { auto & data = helper->mData; - VerifyOrExit(mFabricsTable != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(mFabricsTable != nullptr, CHIP_ERROR_INCORRECT_STATE); data.fabricIndex = mFabricIndex; data.fabricTable = nullptr; data.keystore = nullptr; { const FabricInfo * fabricInfo = mFabricsTable->FindFabricWithIndex(mFabricIndex); - VerifyOrExit(fabricInfo != nullptr, err = CHIP_ERROR_KEY_NOT_FOUND); + VerifyOrReturnError(fabricInfo != nullptr, CHIP_ERROR_KEY_NOT_FOUND); auto * keystore = mFabricsTable->GetOperationalKeystore(); if (!fabricInfo->HasOperationalKey() && keystore != nullptr && keystore->SupportsSignWithOpKeypairInBackground()) { @@ -1686,48 +1716,41 @@ CHIP_ERROR CASESession::SendSigma3a() } } - VerifyOrExit(mEphemeralKey != nullptr, err = CHIP_ERROR_INTERNAL); + VerifyOrReturnError(mEphemeralKey != nullptr, CHIP_ERROR_INTERNAL); - VerifyOrExit(data.icacBuf.Alloc(kMaxCHIPCertLength), err = CHIP_ERROR_NO_MEMORY); + VerifyOrReturnError(data.icacBuf.Alloc(kMaxCHIPCertLength), CHIP_ERROR_NO_MEMORY); data.icaCert = MutableByteSpan{ data.icacBuf.Get(), kMaxCHIPCertLength }; - VerifyOrExit(data.nocBuf.Alloc(kMaxCHIPCertLength), err = CHIP_ERROR_NO_MEMORY); + VerifyOrReturnError(data.nocBuf.Alloc(kMaxCHIPCertLength), CHIP_ERROR_NO_MEMORY); data.nocCert = MutableByteSpan{ data.nocBuf.Get(), kMaxCHIPCertLength }; - SuccessOrExit(err = mFabricsTable->FetchICACert(mFabricIndex, data.icaCert)); - SuccessOrExit(err = mFabricsTable->FetchNOCCert(mFabricIndex, data.nocCert)); + ReturnErrorOnFailure(mFabricsTable->FetchICACert(mFabricIndex, data.icaCert)); + ReturnErrorOnFailure(mFabricsTable->FetchNOCCert(mFabricIndex, data.nocCert)); // Prepare Sigma3 TBS Data Blob data.msg_r3_signed_len = - TLV::EstimateStructOverhead(data.icaCert.size(), data.nocCert.size(), kP256_PublicKey_Length, kP256_PublicKey_Length); + EstimateStructOverhead(data.icaCert.size(), data.nocCert.size(), kP256_PublicKey_Length, kP256_PublicKey_Length); - VerifyOrExit(data.msg_R3_Signed.Alloc(data.msg_r3_signed_len), err = CHIP_ERROR_NO_MEMORY); + VerifyOrReturnError(data.msg_R3_Signed.Alloc(data.msg_r3_signed_len), CHIP_ERROR_NO_MEMORY); - SuccessOrExit(err = ConstructTBSData( - data.nocCert, data.icaCert, ByteSpan(mEphemeralKey->Pubkey(), mEphemeralKey->Pubkey().Length()), - ByteSpan(mRemotePubKey, mRemotePubKey.Length()), data.msg_R3_Signed.Get(), data.msg_r3_signed_len)); + ReturnErrorOnFailure( + ConstructTBSData(data.nocCert, data.icaCert, ByteSpan(mEphemeralKey->Pubkey(), mEphemeralKey->Pubkey().Length()), + ByteSpan(mRemotePubKey, mRemotePubKey.Length()), data.msg_R3_Signed.Get(), data.msg_r3_signed_len)); if (data.keystore != nullptr) { - SuccessOrExit(err = helper->ScheduleWork()); + ReturnErrorOnFailure(helper->ScheduleWork()); mSendSigma3Helper = helper; mExchangeCtxt.Value()->WillSendMessage(); mState = State::kSendSigma3Pending; } else { - SuccessOrExit(err = helper->DoWork()); + ReturnErrorOnFailure(helper->DoWork()); } } -exit: - if (err != CHIP_NO_ERROR) - { - SendStatusReport(mExchangeCtxt, kProtocolCodeInvalidParam); - mState = State::kInitialized; - } - - return err; + return CHIP_NO_ERROR; } CHIP_ERROR CASESession::SendSigma3b(SendSigma3Data & data, bool & cancel) @@ -1754,11 +1777,11 @@ CHIP_ERROR CASESession::SendSigma3b(SendSigma3Data & data, bool & cancel) CHIP_ERROR_NO_MEMORY); { - TLV::TLVWriter tlvWriter; - TLV::TLVType outerContainerType = TLV::kTLVType_NotSpecified; + TLVWriter tlvWriter; + TLVType outerContainerType = kTLVType_NotSpecified; tlvWriter.Init(data.msg_R3_Encrypted.Get(), data.msg_r3_encrypted_len); - ReturnErrorOnFailure(tlvWriter.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outerContainerType)); + ReturnErrorOnFailure(tlvWriter.StartContainer(AnonymousTag(), kTLVType_Structure, outerContainerType)); ReturnErrorOnFailure(tlvWriter.Put(AsTlvContextTag(TBEDataTags::kSenderNOC), data.nocCert)); if (!data.icaCert.empty()) { @@ -1823,9 +1846,9 @@ CHIP_ERROR CASESession::SendSigma3c(SendSigma3Data & data, CHIP_ERROR status) TLV::TLVType outerContainerType = TLV::kTLVType_NotSpecified; tlvWriter.Init(std::move(msg_R3)); - err = tlvWriter.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outerContainerType); + err = tlvWriter.StartContainer(AnonymousTag(), kTLVType_Structure, outerContainerType); SuccessOrExit(err); - err = tlvWriter.PutBytes(TLV::ContextTag(1), data.msg_R3_Encrypted.Get(), + err = tlvWriter.PutBytes(AsTlvContextTag(Sigma3Tags::kEncrypted3), data.msg_R3_Encrypted.Get(), static_cast(data.msg_r3_encrypted_len + CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES)); SuccessOrExit(err); err = tlvWriter.EndContainer(outerContainerType); @@ -1871,20 +1894,12 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg) { MATTER_TRACE_SCOPE("HandleSigma3", "CASESession"); CHIP_ERROR err = CHIP_NO_ERROR; - System::PacketBufferTLVReader tlvReader; - TLV::TLVReader decryptedDataTlvReader; - TLV::TLVType containerType = TLV::kTLVType_Structure; + ContiguousBufferTLVReader decryptedDataTlvReader; + TLVType containerType = kTLVType_Structure; const uint8_t * buf = msg->Start(); const size_t bufLen = msg->DataLength(); - constexpr size_t kCaseOverheadForFutureTbeData = 128; - - chip::Platform::ScopedMemoryBuffer msg_R3_Encrypted; - size_t msg_r3_encrypted_len = 0; - size_t msg_r3_encrypted_len_with_tag = 0; - size_t max_msg_r3_signed_enc_len; - AutoReleaseSessionKey sr3k(*mSessionManager->GetSessionKeystore()); uint8_t msg_salt[kIPKSize + kSHA256_Hash_Length]; @@ -1907,72 +1922,47 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg) VerifyOrExit(mEphemeralKey != nullptr, err = CHIP_ERROR_INTERNAL); - tlvReader.Init(std::move(msg)); - SuccessOrExit(err = tlvReader.Next(containerType, TLV::AnonymousTag())); - SuccessOrExit(err = tlvReader.EnterContainer(containerType)); - - // Fetch encrypted data - max_msg_r3_signed_enc_len = TLV::EstimateStructOverhead(Credentials::kMaxCHIPCertLength, Credentials::kMaxCHIPCertLength, - data.tbsData3Signature.Length(), kCaseOverheadForFutureTbeData); - - SuccessOrExit(err = tlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(Sigma3Tags::kEncrypted3))); - - msg_r3_encrypted_len_with_tag = tlvReader.GetLength(); - - // Validate we did not receive a buffer larger than legal - VerifyOrExit(msg_r3_encrypted_len_with_tag <= max_msg_r3_signed_enc_len, err = CHIP_ERROR_INVALID_TLV_ELEMENT); - VerifyOrExit(msg_r3_encrypted_len_with_tag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, err = CHIP_ERROR_INVALID_TLV_ELEMENT); - - VerifyOrExit(msg_R3_Encrypted.Alloc(msg_r3_encrypted_len_with_tag), err = CHIP_ERROR_NO_MEMORY); - SuccessOrExit(err = tlvReader.GetBytes(msg_R3_Encrypted.Get(), static_cast(msg_r3_encrypted_len_with_tag))); - msg_r3_encrypted_len = msg_r3_encrypted_len_with_tag - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES; - // Step 1 + // msgR3Encrypted will be allocated and initialised within ParseSigma3() + Platform::ScopedMemoryBufferWithSize msgR3Encrypted; + // both msgR3EncryptedPayload and msgR3MIC will become backed by msgR3Encrypted in ParseSigma3() + MutableByteSpan msgR3EncryptedPayload; + ByteSpan msgR3MIC; { + System::PacketBufferTLVReader tlvReader; + tlvReader.Init(std::move(msg)); + SuccessOrExit(err = ParseSigma3(tlvReader, msgR3Encrypted, msgR3EncryptedPayload, msgR3MIC)); + + // Generate the S3K key MutableByteSpan saltSpan(msg_salt); SuccessOrExit(err = ConstructSaltSigma3(ByteSpan(mIPK), saltSpan)); SuccessOrExit(err = DeriveSigmaKey(saltSpan, ByteSpan(kKDFSR3Info), sr3k)); - } - - SuccessOrExit(err = mCommissioningHash.AddData(ByteSpan{ buf, bufLen })); + // Add Sigma3 to the TranscriptHash which will be used to generate the Session Encryption Keys + SuccessOrExit(err = mCommissioningHash.AddData(ByteSpan{ buf, bufLen })); + } // Step 2 - Decrypt data blob - SuccessOrExit(err = AES_CCM_decrypt(msg_R3_Encrypted.Get(), msg_r3_encrypted_len, nullptr, 0, - msg_R3_Encrypted.Get() + msg_r3_encrypted_len, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, - sr3k.KeyHandle(), kTBEData3_Nonce, kTBEDataNonceLength, msg_R3_Encrypted.Get())); - - decryptedDataTlvReader.Init(msg_R3_Encrypted.Get(), msg_r3_encrypted_len); - containerType = TLV::kTLVType_Structure; - SuccessOrExit(err = decryptedDataTlvReader.Next(containerType, TLV::AnonymousTag())); - SuccessOrExit(err = decryptedDataTlvReader.EnterContainer(containerType)); + SuccessOrExit(err = AES_CCM_decrypt(msgR3EncryptedPayload.data(), msgR3EncryptedPayload.size(), nullptr, 0, msgR3MIC.data(), + msgR3MIC.size(), sr3k.KeyHandle(), kTBEData3_Nonce, kTBEDataNonceLength, + msgR3EncryptedPayload.data())); - SuccessOrExit(err = decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSenderNOC))); - SuccessOrExit(err = decryptedDataTlvReader.Get(data.initiatorNOC)); + decryptedDataTlvReader.Init(msgR3EncryptedPayload.data(), msgR3EncryptedPayload.size()); + SuccessOrExit(err = ParseSigma3TBEData(decryptedDataTlvReader, data)); - SuccessOrExit(err = decryptedDataTlvReader.Next()); - if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC)) - { - VerifyOrExit(decryptedDataTlvReader.GetType() == TLV::kTLVType_ByteString, err = CHIP_ERROR_WRONG_TLV_TYPE); - SuccessOrExit(err = decryptedDataTlvReader.Get(data.initiatorICAC)); - SuccessOrExit(err = decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature))); - } + // Step 3 - Construct Sigma3 TBS Data + data.msgR3SignedLen = TLV::EstimateStructOverhead(data.initiatorNOC.size(), // initiatorNOC + data.initiatorICAC.size(), // initiatorICAC + kP256_PublicKey_Length, // initiatorEphPubKey + kP256_PublicKey_Length // responderEphPubKey + ); - // Step 4 - Construct Sigma3 TBS Data - data.msg_r3_signed_len = TLV::EstimateStructOverhead(sizeof(uint16_t), data.initiatorNOC.size(), data.initiatorICAC.size(), - kP256_PublicKey_Length, kP256_PublicKey_Length); - - VerifyOrExit(data.msg_R3_Signed.Alloc(data.msg_r3_signed_len), err = CHIP_ERROR_NO_MEMORY); + VerifyOrExit(data.msgR3Signed.Alloc(data.msgR3SignedLen), err = CHIP_ERROR_NO_MEMORY); SuccessOrExit(err = ConstructTBSData(data.initiatorNOC, data.initiatorICAC, ByteSpan(mRemotePubKey, mRemotePubKey.Length()), ByteSpan(mEphemeralKey->Pubkey(), mEphemeralKey->Pubkey().Length()), - data.msg_R3_Signed.Get(), data.msg_r3_signed_len)); - - VerifyOrExit(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature), err = CHIP_ERROR_INVALID_TLV_TAG); - VerifyOrExit(data.tbsData3Signature.Capacity() >= decryptedDataTlvReader.GetLength(), err = CHIP_ERROR_INVALID_TLV_ELEMENT); - data.tbsData3Signature.SetLength(decryptedDataTlvReader.GetLength()); - SuccessOrExit(err = decryptedDataTlvReader.GetBytes(data.tbsData3Signature.Bytes(), data.tbsData3Signature.Length())); + data.msgR3Signed.Get(), data.msgR3SignedLen)); - // Prepare for Step 5/6 + // Prepare for Step 4/5 { MutableByteSpan fabricRCAC{ data.rootCertBuf }; SuccessOrExit(err = mFabricsTable->FetchRootCert(mFabricIndex, fabricRCAC)); @@ -1985,22 +1975,24 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg) { data.validContext = mValidContext; - // initiatorNOC and initiatorICAC are spans into msg_R3_Encrypted + // initiatorNOC and initiatorICAC are spans into msgR3Encrypted // which is going away, so to save memory, redirect them to their // copies in msg_R3_signed, which is staying around - TLV::TLVReader signedDataTlvReader; - signedDataTlvReader.Init(data.msg_R3_Signed.Get(), data.msg_r3_signed_len); - SuccessOrExit(err = signedDataTlvReader.Next(TLV::kTLVType_Structure, TLV::AnonymousTag())); + TLV::ContiguousBufferTLVReader signedDataTlvReader; + signedDataTlvReader.Init(data.msgR3Signed.Get(), data.msgR3SignedLen); + SuccessOrExit(err = signedDataTlvReader.Next(containerType, AnonymousTag())); SuccessOrExit(err = signedDataTlvReader.EnterContainer(containerType)); - SuccessOrExit(err = signedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBSDataTags::kSenderNOC))); - SuccessOrExit(err = signedDataTlvReader.Get(data.initiatorNOC)); + SuccessOrExit(err = signedDataTlvReader.Next(AsTlvContextTag(TBSDataTags::kSenderNOC))); + SuccessOrExit(err = signedDataTlvReader.GetByteView(data.initiatorNOC)); if (!data.initiatorICAC.empty()) { - SuccessOrExit(err = signedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBSDataTags::kSenderICAC))); - SuccessOrExit(err = signedDataTlvReader.Get(data.initiatorICAC)); + SuccessOrExit(err = signedDataTlvReader.Next(AsTlvContextTag(TBSDataTags::kSenderICAC))); + SuccessOrExit(err = signedDataTlvReader.GetByteView(data.initiatorICAC)); } + + SuccessOrExit(err = signedDataTlvReader.ExitContainer(containerType)); } SuccessOrExit(err = helper->ScheduleWork()); @@ -2018,6 +2010,73 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg) return err; } +CHIP_ERROR CASESession::ParseSigma3(ContiguousBufferTLVReader & tlvReader, + Platform::ScopedMemoryBufferWithSize & outMsgR3Encrypted, + MutableByteSpan & outMsgR3EncryptedPayload, ByteSpan & outMsgR3MIC) +{ + TLVType containerType = kTLVType_Structure; + + ReturnErrorOnFailure(tlvReader.Next(containerType, AnonymousTag())); + ReturnErrorOnFailure(tlvReader.EnterContainer(containerType)); + + // Fetch encrypted data + ReturnErrorOnFailure(tlvReader.Next(AsTlvContextTag(Sigma3Tags::kEncrypted3))); + + size_t maxMsgR3SignedEncLen = EstimateStructOverhead(kMaxCHIPCertLength, // initiatorNOC + kMaxCHIPCertLength, // initiatorICAC + kMax_ECDSA_Signature_Length, // signature + kCaseOverheadForFutureTBEData // extra bytes for future-proofing + ); + + size_t msgR3EncryptedLenWithTag = tlvReader.GetLength(); + + // Validate we did not receive a buffer larger than legal + VerifyOrReturnError(msgR3EncryptedLenWithTag <= maxMsgR3SignedEncLen, CHIP_ERROR_INVALID_TLV_ELEMENT); + VerifyOrReturnError(msgR3EncryptedLenWithTag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, CHIP_ERROR_INVALID_TLV_ELEMENT); + VerifyOrReturnError(outMsgR3Encrypted.Alloc(msgR3EncryptedLenWithTag), CHIP_ERROR_NO_MEMORY); + ReturnErrorOnFailure(tlvReader.GetBytes(outMsgR3Encrypted.Get(), outMsgR3Encrypted.AllocatedSize())); + + size_t msgR3EncryptedPayloadLen = msgR3EncryptedLenWithTag - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES; + outMsgR3EncryptedPayload = MutableByteSpan(outMsgR3Encrypted.Get(), msgR3EncryptedPayloadLen); + outMsgR3MIC = ByteSpan(outMsgR3Encrypted.Get() + msgR3EncryptedPayloadLen, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES); + + ReturnErrorOnFailure(tlvReader.ExitContainer(containerType)); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR CASESession::ParseSigma3TBEData(ContiguousBufferTLVReader & decryptedDataTlvReader, + HandleSigma3Data & outHandleSigma3TBEData) +{ + + TLVType containerType = kTLVType_Structure; + ReturnErrorOnFailure(decryptedDataTlvReader.Next(containerType, TLV::AnonymousTag())); + ReturnErrorOnFailure(decryptedDataTlvReader.EnterContainer(containerType)); + + ReturnErrorOnFailure(decryptedDataTlvReader.Next(AsTlvContextTag(TBEDataTags::kSenderNOC))); + ReturnErrorOnFailure(decryptedDataTlvReader.GetByteView(outHandleSigma3TBEData.initiatorNOC)); + VerifyOrReturnError(outHandleSigma3TBEData.initiatorNOC.size() <= kMaxCHIPCertLength, CHIP_ERROR_INVALID_CASE_PARAMETER); + + ReturnErrorOnFailure(decryptedDataTlvReader.Next()); + if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC)) + { + ReturnErrorOnFailure(decryptedDataTlvReader.GetByteView(outHandleSigma3TBEData.initiatorICAC)); + VerifyOrReturnError(outHandleSigma3TBEData.initiatorICAC.size() <= kMaxCHIPCertLength, CHIP_ERROR_INVALID_CASE_PARAMETER); + ReturnErrorOnFailure(decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature))); + } + + VerifyOrReturnError(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature), CHIP_ERROR_INVALID_TLV_TAG); + size_t signatureLen = decryptedDataTlvReader.GetLength(); + VerifyOrReturnError(outHandleSigma3TBEData.tbsData3Signature.Capacity() == signatureLen, CHIP_ERROR_INVALID_TLV_ELEMENT); + outHandleSigma3TBEData.tbsData3Signature.SetLength(signatureLen); + ReturnErrorOnFailure(decryptedDataTlvReader.GetBytes(outHandleSigma3TBEData.tbsData3Signature.Bytes(), + outHandleSigma3TBEData.tbsData3Signature.Length())); + + ReturnErrorOnFailure(decryptedDataTlvReader.ExitContainer(containerType)); + + return CHIP_NO_ERROR; +} + CHIP_ERROR CASESession::HandleSigma3b(HandleSigma3Data & data, bool & cancel) { // Step 5/6 @@ -2037,7 +2096,7 @@ CHIP_ERROR CASESession::HandleSigma3b(HandleSigma3Data & data, bool & cancel) // The same change should be made in Sigma2 processing. // Step 7 - Validate Signature ReturnErrorOnFailure( - initiatorPublicKey.ECDSA_validate_msg_signature(data.msg_R3_Signed.Get(), data.msg_r3_signed_len, data.tbsData3Signature)); + initiatorPublicKey.ECDSA_validate_msg_signature(data.msgR3Signed.Get(), data.msgR3SignedLen, data.tbsData3Signature)); return CHIP_NO_ERROR; } @@ -2184,11 +2243,11 @@ CHIP_ERROR CASESession::ValidateSigmaResumeMIC(const ByteSpan & resumeMIC, const CHIP_ERROR CASESession::ConstructTBSData(const ByteSpan & senderNOC, const ByteSpan & senderICAC, const ByteSpan & senderPubKey, const ByteSpan & receiverPubKey, uint8_t * tbsData, size_t & tbsDataLen) { - TLV::TLVWriter tlvWriter; - TLV::TLVType outerContainerType = TLV::kTLVType_NotSpecified; + TLVWriter tlvWriter; + TLVType outerContainerType = kTLVType_NotSpecified; tlvWriter.Init(tbsData, tbsDataLen); - ReturnErrorOnFailure(tlvWriter.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, outerContainerType)); + ReturnErrorOnFailure(tlvWriter.StartContainer(AnonymousTag(), kTLVType_Structure, outerContainerType)); ReturnErrorOnFailure(tlvWriter.Put(AsTlvContextTag(TBSDataTags::kSenderNOC), senderNOC)); if (!senderICAC.empty()) { @@ -2514,7 +2573,8 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea case State::kSentSigma2Resume: if (msgType == Protocols::SecureChannel::MsgType::StatusReport) { - // Need to capture before invoking status report since 'this' might be deallocated on successful completion of sigma3 + // Need to capture before invoking status report since 'this' might be deallocated on successful completion of + // sigma3 MetricKey key = (mState == State::kSentSigma3) ? kMetricDeviceCASESessionSigma3 : kMetricDeviceCASESessionSigma2Resume; err = HandleStatusReport(std::move(msg), /* successExpected*/ true); MATTER_LOG_METRIC_END(key, err); diff --git a/src/protocols/secure_channel/CASESession.h b/src/protocols/secure_channel/CASESession.h index 4928cb633dc77c..d232e42d22c26e 100644 --- a/src/protocols/secure_channel/CASESession.h +++ b/src/protocols/secure_channel/CASESession.h @@ -221,6 +221,9 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, struct ParsedSigma1 : Sigma1Param { + // Backed by: Sigma1 PacketBuffer passed to the method HandleSigma1() + // Lifetime: Valid for the lifetime of the TLVReader, which takes ownership of the Sigma1 PacketBuffer in the HandleSigma1() + // method. ByteSpan initiatorEphPubKey; bool initiatorSessionParamStructPresent = false; SessionParameters initiatorSessionParams; @@ -237,16 +240,99 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, size_t encrypted2Length = 0; const ReliableMessageProtocolConfig * responderMrpConfig; }; + struct ParsedSigma2 + { + // Below ByteSpans are Backed by: Sigma2 PacketBuffer passed to the method HandleSigma2() + // Lifetime: Valid for the lifetime of the TLVReader, which takes ownership of the Sigma2 PacketBuffer in the HandleSigma2() + // method. + ByteSpan responderRandom; + ByteSpan responderEphPubKey; + + Platform::ScopedMemoryBufferWithSize msgR2Encrypted; + // Below ByteSpans are Backed by: msgR2Encrypted buffer + // Lifetime: Valid as long as msgR2Encrypted is not released + MutableByteSpan msgR2EncryptedPayload; + ByteSpan msgR2MIC; + SessionParameters responderSessionParams; + uint16_t responderSessionId; + bool responderSessionParamStructPresent = false; + }; + + struct ParsedSigma2TBEData + { + // Below ByteSpans are Backed by: msgR2Encrypted Buffer, member of ParsedSigma2 struct + // Lifetime: Valid for the lifetime of the instance of ParsedSigma2 that contains the msgR2Encrypted Buffer. + ByteSpan responderNOC; + ByteSpan responderICAC; + ByteSpan resumptionId; + Crypto::P256ECDSASignature tbsData2Signature; + }; struct EncodeSigma2ResumeInputs { ByteSpan resumptionId; uint8_t sigma2ResumeMICBuffer[Crypto::CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES]; - MutableByteSpan resumeMIC{ sigma2ResumeMICBuffer }; + MutableByteSpan sigma2ResumeMIC{ sigma2ResumeMICBuffer }; uint16_t responderSessionId; const ReliableMessageProtocolConfig * responderMrpConfig; }; + struct ParsedSigma2Resume + { + // Below ByteSpans are Backed by: Sigma2Resume PacketBuffer passed to the method HandleSigma2Resume() + // Lifetime: Valid for the lifetime of the TLVReader, which takes ownership of the Sigma2Resume PacketBuffer in the + // HandleSigma2Resume() method. + ByteSpan resumptionId; + ByteSpan sigma2ResumeMIC; + SessionParameters responderSessionParams; + uint16_t responderSessionId; + bool responderSessionParamStructPresent = false; + }; + + struct SendSigma3Data + { + FabricIndex fabricIndex; + + // Use one or the other + const FabricTable * fabricTable; + const Crypto::OperationalKeystore * keystore; + + chip::Platform::ScopedMemoryBuffer msg_R3_Signed; + size_t msg_r3_signed_len; + + chip::Platform::ScopedMemoryBuffer msg_R3_Encrypted; + size_t msg_r3_encrypted_len; + + chip::Platform::ScopedMemoryBuffer icacBuf; + MutableByteSpan icaCert; + + chip::Platform::ScopedMemoryBuffer nocBuf; + MutableByteSpan nocCert; + + Crypto::P256ECDSASignature tbsData3Signature; + }; + + struct HandleSigma3Data + { + chip::Platform::ScopedMemoryBuffer msgR3Signed; + size_t msgR3SignedLen; + + // Below ByteSpans are Backed by: msgR3Encrypted Buffer, local to the HandleSigma3a() method, + // The Spans are later modified to point to the msgR3Signed member of this struct. + ByteSpan initiatorNOC; + ByteSpan initiatorICAC; + + uint8_t rootCertBuf[Credentials::kMaxCHIPCertLength]; + ByteSpan fabricRCAC; + + Crypto::P256ECDSASignature tbsData3Signature; + + FabricId fabricId; + NodeId initiatorNodeId; + + Credentials::ValidationContext validContext; + }; + /** * @brief Encodes a Sigma1 message into TLV format and allocates a buffer for it, which is owned by the PacketBufferHandle * outparam. @@ -280,6 +366,42 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, */ static CHIP_ERROR ParseSigma1(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma1 & parsedMessage); + /** + * Parse a Sigma2 message. This function will return success only if the + * message passes schema checks. + * + * @param tlvReader a reference to the TLVReader that has ownership of the Sigma2 PacketBuffer. + * @param outParsedSigma2 a reference to ParsedSigma2. All members of parsedMessage will stay valid as long as tlvReader is + * valid. + * + * @note Calls to this function must always be made with a newly created and fresh ParsedSigma2 parameter. + **/ + static CHIP_ERROR ParseSigma2(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2 & outParsedSigma2); + + /** + * Parse a decrypted TBEData2Encrypted message. This function will return success only if the message passes schema checks. + * + * @param tlvReader a reference to the TLVReader that points to the decrypted TBEData2Encrypted buffer (i.e. + * msgR2Encrypted member of ParsedSigma2 struct) + * @param outParsedSigma2TBEData a reference to ParsedSigma2TBEData. All members of parsedMessage will stay valid as long + * as the msgR2Encrypted member of ParsedSigma2 is valid + * + * @note Calls to this function must always be made with a newly created and fresh ParsedSigma2TBEData parameter. + **/ + static CHIP_ERROR ParseSigma2TBEData(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2TBEData & outParsedSigma2TBEData); + + /** + * Parse a Sigma2Resume message. This function will return success only if the + * message passes schema checks. + * + * @param tlvReader a reference to the TLVReader that has ownership of the Sigma2Resume PacketBuffer. + * @param outParsedSigma2Resume a reference to ParsedSigma2Resume. All members of parsedMessage will stay valid as long + * as tlvReader is valid. + * + * @note Calls to this function must always be made with a newly created and fresh ParsedSigma2Resume parameter. + **/ + static CHIP_ERROR ParseSigma2Resume(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2Resume & outParsedSigma2Resume); + /** * @brief Encodes a Sigma2 message into TLV format and allocates a buffer for it, which is owned by the PacketBufferHandle * outparam. @@ -289,6 +411,7 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, * * @param inParam a struct containing all the values that will be encoded into TLV format * + * @note The inParam member msgR2Encrypted will be freed after encoding it. **/ static CHIP_ERROR EncodeSigma2(System::PacketBufferHandle & outMsg, EncodeSigma2Inputs & inParam); @@ -305,6 +428,39 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, **/ static CHIP_ERROR EncodeSigma2Resume(System::PacketBufferHandle & outMsg, EncodeSigma2ResumeInputs & inParam); + /** + * Parse a Sigma3 message. This function will return success only if the + * message passes schema checks. + * + * @param tlvReader a reference to the TLVReader that has ownership of the Sigma3 PacketBuffer. + * + * @param outMsgR3Encrypted The encrypted3 (TBEData3Encrypted) TLV element. This will be a buffer that is owned by the caller + * but is allocated and initialised within ParseSigma3. Calls to this function must always be made with + * a newly created and fresh outMsgR3Encrypted + * + * @param outMsgR3EncryptedPayload reference to a span that will be set to point to the payload of outMsgR3Encrypted within + * ParseSigma3. Calls to this function must always be made with a newly created and fresh + * outMsgR3MIC + * + * @param outMsgR3MIC reference to a span that will be set to point to the MIC of outMsgR3Encrypted within ParseSigma3. + * Calls to this function must always be made with a newly created and fresh outMsgR3MIC + * + * @note all out parameters will be valid as long the Buffer outMsgR3Encrypted is valid. + **/ + static CHIP_ERROR ParseSigma3(TLV::ContiguousBufferTLVReader & tlvReader, + Platform::ScopedMemoryBufferWithSize & outMsgR3Encrypted, + MutableByteSpan & outMsgR3EncryptedPayload, ByteSpan & outMsgR3MIC); + + /** + * Parse a decrypted TBEData3Encrypted message. This function will return success only if the + * message passes schema checks. + * + * @param tlvReader a reference to the TLVReader that points to the decrypted TBEData3Encrypted buffer. + * @param data a reference to HandleSigma3Data. + * + **/ + static CHIP_ERROR ParseSigma3TBEData(TLV::ContiguousBufferTLVReader & tlvReader, HandleSigma3Data & data); + private: friend class TestCASESession; @@ -343,12 +499,10 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler, CHIP_ERROR HandleSigma2(System::PacketBufferHandle && msg); CHIP_ERROR HandleSigma2Resume(System::PacketBufferHandle && msg); - struct SendSigma3Data; CHIP_ERROR SendSigma3a(); static CHIP_ERROR SendSigma3b(SendSigma3Data & data, bool & cancel); CHIP_ERROR SendSigma3c(SendSigma3Data & data, CHIP_ERROR status); - struct HandleSigma3Data; CHIP_ERROR HandleSigma3a(System::PacketBufferHandle && msg); static CHIP_ERROR HandleSigma3b(HandleSigma3Data & data, bool & cancel); CHIP_ERROR HandleSigma3c(HandleSigma3Data & data, CHIP_ERROR status); diff --git a/src/protocols/secure_channel/tests/TestCASESession.cpp b/src/protocols/secure_channel/tests/TestCASESession.cpp index e44c85a3480595..d62c0a3d463eb3 100644 --- a/src/protocols/secure_channel/tests/TestCASESession.cpp +++ b/src/protocols/secure_channel/tests/TestCASESession.cpp @@ -1,3 +1,4 @@ + /* * * Copyright (c) 2021 Project CHIP Authors @@ -68,12 +69,21 @@ class CASESessionAccess : public CASESession using CASESession::EncodeSigma1Inputs; using CASESession::EncodeSigma2Inputs; using CASESession::EncodeSigma2ResumeInputs; + using CASESession::HandleSigma3Data; using CASESession::ParsedSigma1; + using CASESession::ParsedSigma2; + using CASESession::ParsedSigma2Resume; + using CASESession::ParsedSigma2TBEData; using CASESession::EncodeSigma1; using CASESession::EncodeSigma2; using CASESession::EncodeSigma2Resume; using CASESession::ParseSigma1; + using CASESession::ParseSigma2; + using CASESession::ParseSigma2Resume; + using CASESession::ParseSigma2TBEData; + using CASESession::ParseSigma3; + using CASESession::ParseSigma3TBEData; }; class TestCASESession : public Test::LoopbackMessagingContext @@ -631,12 +641,13 @@ struct Sigma1Params { // Purposefully not using constants like kSigmaParamRandomNumberSize that // the code uses, so we have a cross-check. - static constexpr size_t kInitiatorRandomLen = 32; - static constexpr uint16_t kInitiatorSessionId = 0; - static constexpr size_t kDestinationIdLen = 32; - static constexpr size_t kInitiatorEphPubKeyLen = 65; - static constexpr size_t kResumptionIdLen = 0; // Nonzero means include it. - static constexpr size_t kInitiatorResumeMICLen = 0; // Nonzero means include it. + static constexpr size_t kInitiatorRandomLen = 32; + static constexpr uint16_t kInitiatorSessionId = 0; + static constexpr size_t kDestinationIdLen = 32; + static constexpr size_t kInitiatorEphPubKeyLen = 65; + static constexpr size_t kResumptionIdLen = 0; // Nonzero means include it. + static constexpr size_t kInitiatorResumeMICLen = 0; // Nonzero means include it. + static constexpr uint16_t kFutureProofTlvElement = 77; static constexpr uint8_t kInitiatorRandomTag = 1; static constexpr uint8_t kInitiatorSessionIdTag = 2; @@ -644,8 +655,12 @@ struct Sigma1Params static constexpr uint8_t kInitiatorEphPubKeyTag = 4; static constexpr uint8_t kResumptionIdTag = 6; static constexpr uint8_t kInitiatorResumeMICTag = 7; + // Choosing a tag that is higher than the current highest tag value in the Specification + static constexpr uint8_t kFutureProofTlvElementTag = 11; static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ContextTag(num); } + static constexpr bool kIncludeFutureProofTlvElement = false; + static constexpr bool kIncludeStructEnd = true; static constexpr bool kExpectSuccess = true; @@ -742,6 +757,12 @@ static CHIP_ERROR EncodeSigma1Helper(MutableByteSpan & buf) ByteSpan(initiatorResumeMIC, Params::kInitiatorResumeMICLen))); } + // Future-proofing: Ensure that TLV elements being added to the specification in the future are properly handled. + if constexpr (Params::kIncludeFutureProofTlvElement) + { + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kFutureProofTlvElementTag), Params::kFutureProofTlvElement)); + } + if constexpr (Params::kIncludeStructEnd) { ReturnErrorOnFailure(writer.EndContainer(containerType)); @@ -755,7 +776,7 @@ static CHIP_ERROR EncodeSigma1Helper(MutableByteSpan & buf) #define TestSigma1Parsing(mem, bufferSize, params) \ do \ { \ - MutableByteSpan buf(mem.Get(), bufferSize); \ + MutableByteSpan buf((mem).Get(), (bufferSize)); \ EXPECT_EQ(EncodeSigma1Helper(buf), CHIP_NO_ERROR); \ \ TLV::ContiguousBufferTLVReader reader; \ @@ -828,7 +849,7 @@ struct Sigma1TooLongResumptionId : public Sigma1WithResumption static constexpr bool kExpectSuccess = false; }; -struct Sigma1TooShortResumptionId : public BadSigma1ParamsBase +struct Sigma1TooShortResumptionId : public Sigma1WithResumption { static constexpr size_t kResumptionIdLen = 15; static constexpr bool kExpectSuccess = false; @@ -846,6 +867,18 @@ struct Sigma1TooShortResumeMIC : public Sigma1WithResumption static constexpr bool kExpectSuccess = false; }; +struct Sigma1WithResumptionIdNoResumeMIC : public Sigma1WithResumption +{ + static constexpr size_t kInitiatorResumeMICLen = 0; + static constexpr bool kExpectSuccess = false; +}; + +struct Sigma1WithResumeMICNoResumptionId : public Sigma1WithResumption +{ + static constexpr size_t kResumptionIdLen = 0; + static constexpr bool kExpectSuccess = false; +}; + struct Sigma1SessionIdMax : public Sigma1Params { static constexpr uint32_t kInitiatorSessionId = UINT16_MAX; @@ -856,6 +889,17 @@ struct Sigma1SessionIdTooBig : public BadSigma1ParamsBase static constexpr uint32_t kInitiatorSessionId = UINT16_MAX + 1; }; +struct Sigma1FutureProofTlvElement : public Sigma1Params +{ + static constexpr bool kIncludeFutureProofTlvElement = true; +}; + +struct Sigma1FutureProofTlvElementNoStructEnd : public BadSigma1ParamsBase +{ + static constexpr bool kIncludeFutureProofTlvElement = true; + static constexpr bool kIncludeStructEnd = false; +}; + TEST_F(TestCASESession, Sigma1ParsingTest) { // 1280 bytes must be enough by definition. @@ -877,8 +921,12 @@ TEST_F(TestCASESession, Sigma1ParsingTest) TestSigma1Parsing(mem, bufferSize, Sigma1TooShortResumptionId); TestSigma1Parsing(mem, bufferSize, Sigma1TooLongResumeMIC); TestSigma1Parsing(mem, bufferSize, Sigma1TooShortResumeMIC); + TestSigma1Parsing(mem, bufferSize, Sigma1WithResumptionIdNoResumeMIC); + TestSigma1Parsing(mem, bufferSize, Sigma1WithResumeMICNoResumptionId); TestSigma1Parsing(mem, bufferSize, Sigma1SessionIdMax); TestSigma1Parsing(mem, bufferSize, Sigma1SessionIdTooBig); + TestSigma1Parsing(mem, bufferSize, Sigma1FutureProofTlvElement); + TestSigma1Parsing(mem, bufferSize, Sigma1FutureProofTlvElementNoStructEnd); } TEST_F(TestCASESession, EncodeSigma1Test) @@ -987,6 +1035,195 @@ TEST_F(TestCASESession, EncodeSigma1Test) gDeviceOperationalKeystore.ReleaseEphemeralKeypair(ephemeralKey); } +constexpr size_t kCaseOverheadForFutureTbeData = 128; + +constexpr size_t kMaxMsgR2SignedEncLen = + TLV::EstimateStructOverhead(kMaxCHIPCertLength, // responderNOC + kMaxCHIPCertLength, // responderICAC + kMax_ECDSA_Signature_Length, // signature + SessionResumptionStorage::kResumptionIdSize, // resumptionID + kCaseOverheadForFutureTbeData // extra bytes for future-proofing + ); + +struct Sigma2Params +{ + // Purposefully not using constants like kSigmaParamRandomNumberSize that + // the code uses, so we have a cross-check. + static constexpr size_t kResponderRandomLen = 32; + static constexpr uint16_t kResponderSessionId = 0; + static constexpr size_t kResponderEphPubKeyLen = 65; + static constexpr size_t kEncrypted2Len = + CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES + 1; // Needs to be bigger than CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES + static constexpr uint16_t kFutureProofTlvElement = 77; + + static constexpr uint8_t kResponderRandomTag = 1; + static constexpr uint8_t kResponderSessionIdTag = 2; + static constexpr uint8_t kResponderEphPubKeyTag = 3; + static constexpr uint8_t kEncrypted2Tag = 4; + static constexpr uint8_t kFutureProofTlvElementTag = 11; + + static constexpr uint8_t kTestValueResponderRandom = 1; + static constexpr uint8_t kTestValueResponderEphPubKey = 2; + static constexpr uint8_t kTestValueEncrypted2 = 3; + + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ContextTag(num); } + + static constexpr bool kIncludeFutureProofTlvElement = false; + + static constexpr bool kIncludeStructEnd = true; + + static constexpr bool kExpectSuccess = true; +}; + +template +static CHIP_ERROR EncodeSigma2Helper(MutableByteSpan & buf) +{ + using namespace TLV; + + TLVWriter writer; + writer.Init(buf); + + TLVType containerType; + ReturnErrorOnFailure(writer.StartContainer(AnonymousTag(), kTLVType_Structure, containerType)); + + uint8_t responderRandom[Params::kResponderRandomLen] = { Params::kTestValueResponderRandom }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResponderRandomTag), ByteSpan(responderRandom))); + + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResponderSessionIdTag), Params::kResponderSessionId)); + + uint8_t responderEphPubKey[Params::kResponderEphPubKeyLen] = { Params::kTestValueResponderEphPubKey }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResponderEphPubKeyTag), ByteSpan(responderEphPubKey))); + + uint8_t encrypted2[Params::kEncrypted2Len] = { Params::kTestValueEncrypted2 }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kEncrypted2Tag), ByteSpan(encrypted2))); + // Future-proofing: Ensure that TLV elements being added to the specification in the future are properly handled. + if constexpr (Params::kIncludeFutureProofTlvElement) + { + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kFutureProofTlvElementTag), Params::kFutureProofTlvElement)); + } + + if constexpr (Params::kIncludeStructEnd) + { + ReturnErrorOnFailure(writer.EndContainer(containerType)); + } + + buf.reduce_size(writer.GetLengthWritten()); + return CHIP_NO_ERROR; +} + +// A macro, so we can tell which test failed based on line number. +#define TestSigma2Parsing(mem, bufferSize, params) \ + do \ + { \ + MutableByteSpan buf((mem).Get(), (bufferSize)); \ + EXPECT_EQ(EncodeSigma2Helper(buf), CHIP_NO_ERROR); \ + \ + TLV::ContiguousBufferTLVReader reader; \ + reader.Init(buf); \ + CASESessionAccess::ParsedSigma2 parsedSigma2; \ + \ + EXPECT_EQ(CASESessionAccess::ParseSigma2(reader, parsedSigma2) == CHIP_NO_ERROR, params::kExpectSuccess); \ + if (params::kExpectSuccess) \ + { \ + \ + uint8_t expectedRandom[params::kResponderRandomLen] = { params::kTestValueResponderRandom }; \ + uint8_t expectedEphKey[params::kResponderEphPubKeyLen] = { params::kTestValueResponderEphPubKey }; \ + uint8_t expectedEncrypted2[params::kEncrypted2Len] = { params::kTestValueEncrypted2 }; \ + \ + EXPECT_TRUE(parsedSigma2.responderRandom.data_equal(ByteSpan(expectedRandom))); \ + EXPECT_EQ(parsedSigma2.responderSessionId, params::kResponderSessionId); \ + EXPECT_TRUE(parsedSigma2.responderEphPubKey.data_equal(ByteSpan(expectedEphKey))); \ + EXPECT_TRUE(ByteSpan(parsedSigma2.msgR2Encrypted.Get(), parsedSigma2.msgR2Encrypted.AllocatedSize()) \ + .data_equal(ByteSpan(expectedEncrypted2))); \ + } \ + } while (0) + +struct BadSigma2ParamsBase : public Sigma2Params +{ + static constexpr bool kExpectSuccess = false; +}; + +struct Sigma2NoStructEnd : public BadSigma2ParamsBase +{ + static constexpr bool kIncludeStructEnd = false; +}; + +struct Sigma2WrongTags : public BadSigma2ParamsBase +{ + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ProfileTag(0, num); } +}; + +struct Sigma2TooLongRandom : public BadSigma2ParamsBase +{ + static constexpr size_t kResponderRandomLen = 33; +}; + +struct Sigma2TooShortRandom : public BadSigma2ParamsBase +{ + static constexpr size_t kResponderRandomLen = 31; +}; + +struct Sigma2SessionIdMax : public Sigma2Params +{ + static constexpr uint32_t kResponderSessionId = UINT16_MAX; +}; + +struct Sigma2SessionIdTooBig : public BadSigma2ParamsBase +{ + static constexpr uint32_t kResponderSessionId = UINT16_MAX + 1; +}; +struct Sigma2TooLongPubkey : public BadSigma2ParamsBase +{ + static constexpr size_t kResponderEphPubKeyLen = 66; +}; + +struct Sigma2TooShortPubkey : public BadSigma2ParamsBase +{ + static constexpr size_t kResponderEphPubKeyLen = 64; +}; + +struct Sigma2TooLongEncrypted2 : public BadSigma2ParamsBase +{ + static constexpr size_t kEncrypted2Len = kMaxMsgR2SignedEncLen + 1; +}; +struct Sigma2TooShortEncrypted2 : public BadSigma2ParamsBase +{ + static constexpr size_t kEncrypted2Len = CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES; +}; + +struct Sigma2FutureProofTlvElement : public Sigma2Params +{ + static constexpr bool kIncludeFutureProofTlvElement = true; +}; + +struct Sigma2FutureProofTlvElementNoStructEnd : public BadSigma2ParamsBase +{ + static constexpr bool kIncludeFutureProofTlvElement = true; + static constexpr bool kIncludeStructEnd = false; +}; + +TEST_F(TestCASESession, Sigma2ParsingTest) +{ + // 1280 bytes must be enough by definition. + constexpr size_t bufferSize = 1280; + chip::Platform::ScopedMemoryBuffer mem; + EXPECT_TRUE(mem.Calloc(bufferSize)); + + TestSigma2Parsing(mem, bufferSize, Sigma2Params); + TestSigma2Parsing(mem, bufferSize, Sigma2NoStructEnd); + TestSigma2Parsing(mem, bufferSize, Sigma2WrongTags); + TestSigma2Parsing(mem, bufferSize, Sigma2TooLongRandom); + TestSigma2Parsing(mem, bufferSize, Sigma2TooShortRandom); + TestSigma2Parsing(mem, bufferSize, Sigma2SessionIdMax); + TestSigma2Parsing(mem, bufferSize, Sigma2SessionIdTooBig); + TestSigma2Parsing(mem, bufferSize, Sigma2TooLongPubkey); + TestSigma2Parsing(mem, bufferSize, Sigma2TooShortPubkey); + TestSigma2Parsing(mem, bufferSize, Sigma2TooLongEncrypted2); + TestSigma2Parsing(mem, bufferSize, Sigma2TooShortEncrypted2); + TestSigma2Parsing(mem, bufferSize, Sigma2FutureProofTlvElement); + TestSigma2Parsing(mem, bufferSize, Sigma2FutureProofTlvElementNoStructEnd); +} + TEST_F(TestCASESession, EncodeSigma2Test) { CASESessionAccess::EncodeSigma2Inputs encodeParams; @@ -1006,8 +1243,10 @@ TEST_F(TestCASESession, EncodeSigma2Test) encodeParams.msgR2Encrypted.Alloc(encodeParams.encrypted2Length); // responder Session Parameters - ReliableMessageProtocolConfig mrpConfig = GetDefaultMRPConfig(); - encodeParams.responderMrpConfig = &mrpConfig; + ReliableMessageProtocolConfig mrpConfig(System::Clock::Milliseconds32(100), System::Clock::Milliseconds32(200), + System::Clock::Milliseconds16(4000)); + + encodeParams.responderMrpConfig = &mrpConfig; { System::PacketBufferHandle msg; @@ -1069,20 +1308,214 @@ TEST_F(TestCASESession, EncodeSigma2Test) // Succeed when MRP Config is provided encodeParams.responderMrpConfig = &mrpConfig; EXPECT_EQ(CHIP_NO_ERROR, CASESessionAccess::EncodeSigma2(msg, encodeParams)); + // EncodeSigma2 frees msgR2Encrypted after encoding it + encodeParams.msgR2Encrypted.Alloc(encodeParams.encrypted2Length); + } + + // Round Trip Test: Encode then Parse Sigma2 + { + System::PacketBufferHandle msg; + // Succeed when MRP Config is provided + encodeParams.responderMrpConfig = &mrpConfig; + EXPECT_EQ(CHIP_NO_ERROR, CASESessionAccess::EncodeSigma2(msg, encodeParams)); + + System::PacketBufferTLVReader tlvReader; + tlvReader.Init(std::move(msg)); + CASESessionAccess::ParsedSigma2 parsedMessage; + + EXPECT_EQ(CHIP_NO_ERROR, CASESessionAccess::ParseSigma2(tlvReader, parsedMessage)); + + // compare parsed values with original values + EXPECT_TRUE(parsedMessage.responderRandom.data_equal(ByteSpan(encodeParams.responderRandom))); + EXPECT_EQ(parsedMessage.responderSessionId, encodeParams.responderSessionId); + EXPECT_TRUE(parsedMessage.responderEphPubKey.data_equal( + ByteSpan(encodeParams.responderEphPubKey->ConstBytes(), encodeParams.responderEphPubKey->Length()))); + + EXPECT_EQ(parsedMessage.responderSessionParams.GetMRPConfig(), *encodeParams.responderMrpConfig); } + // Release EphemeralKeyPair gDeviceOperationalKeystore.ReleaseEphemeralKeypair(ephemeralKey); } +struct Sigma2ResumeParams +{ + // Purposefully not using constants like kSigmaParamRandomNumberSize that + // the code uses, so we have a cross-check. + static constexpr size_t kResumptionIdLen = 16; + static constexpr size_t kSigma2ResumeMICLen = 16; + static constexpr uint16_t kResponderSessionId = 0; + static constexpr uint16_t kFutureProofTlvElement = 77; + + static constexpr uint8_t kResumptionIdTag = 1; + static constexpr uint8_t kSigma2ResumeMICTag = 2; + static constexpr uint8_t kResponderSessionIdTag = 3; + static constexpr uint8_t kFutureProofTlvElementTag = 11; + + static constexpr uint8_t kTestValueResumptionId = 1; + static constexpr uint8_t kTestValueSigma2ResumeMIC = 2; + + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ContextTag(num); } + + static constexpr bool kIncludeFutureProofTlvElement = false; + + static constexpr bool kIncludeStructEnd = true; + + static constexpr bool kExpectSuccess = true; +}; + +template +static CHIP_ERROR EncodeSigma2ResumeHelper(MutableByteSpan & buf) +{ + using namespace TLV; + + TLVWriter writer; + writer.Init(buf); + + TLVType containerType; + ReturnErrorOnFailure(writer.StartContainer(AnonymousTag(), kTLVType_Structure, containerType)); + + uint8_t resumptionId[Params::kResumptionIdLen] = { Params::kTestValueResumptionId }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResumptionIdTag), ByteSpan(resumptionId))); + + uint8_t sigma2ResumeMIC[Params::kSigma2ResumeMICLen] = { Params::kTestValueSigma2ResumeMIC }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kSigma2ResumeMICTag), ByteSpan(sigma2ResumeMIC))); + + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResponderSessionIdTag), Params::kResponderSessionId)); + + // Future-proofing: Ensure that TLV elements being added to the specification in the future are properly handled. + if constexpr (Params::kIncludeFutureProofTlvElement) + { + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kFutureProofTlvElementTag), Params::kFutureProofTlvElement)); + } + + if constexpr (Params::kIncludeStructEnd) + { + ReturnErrorOnFailure(writer.EndContainer(containerType)); + } + + buf.reduce_size(writer.GetLengthWritten()); + return CHIP_NO_ERROR; +} + +#define TestSigma2ResumeParsing(mem, bufferSize, params) \ + do \ + { \ + MutableByteSpan buf((mem).Get(), (bufferSize)); \ + EXPECT_EQ(EncodeSigma2ResumeHelper(buf), CHIP_NO_ERROR); \ + \ + TLV::ContiguousBufferTLVReader reader; \ + reader.Init(buf); \ + CASESessionAccess::ParsedSigma2Resume parsedSigma2Resume; \ + \ + EXPECT_EQ(CASESessionAccess::ParseSigma2Resume(reader, parsedSigma2Resume) == CHIP_NO_ERROR, params::kExpectSuccess); \ + if (params::kExpectSuccess) \ + { \ + uint8_t expectedResumptionId[params::kResumptionIdLen] = { params::kTestValueResumptionId }; \ + uint8_t expectedSigma2ResumeMIC[params::kSigma2ResumeMICLen] = { params::kTestValueSigma2ResumeMIC }; \ + \ + EXPECT_TRUE(parsedSigma2Resume.resumptionId.data_equal(ByteSpan(expectedResumptionId))); \ + EXPECT_TRUE(parsedSigma2Resume.sigma2ResumeMIC.data_equal(ByteSpan(expectedSigma2ResumeMIC))); \ + EXPECT_EQ(parsedSigma2Resume.responderSessionId, params::kResponderSessionId); \ + } \ + } while (0) + +struct BadSigma2ResumeParamsBase : public Sigma2ResumeParams +{ + static constexpr bool kExpectSuccess = false; +}; + +struct Sigma2ResumeNoStructEnd : public BadSigma2ResumeParamsBase +{ + static constexpr bool kIncludeStructEnd = false; +}; + +struct Sigma2ResumeWrongTags : public BadSigma2ResumeParamsBase +{ + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ProfileTag(0, num); } +}; + +struct Sigma2ResumeTooLongResumptionID : public BadSigma2ResumeParamsBase +{ + static constexpr size_t kResumptionIdLen = 17; +}; + +struct Sigma2ResumeTooShortResumptionID : public BadSigma2ResumeParamsBase +{ + static constexpr size_t kResumptionIdLen = 15; +}; + +struct Sigma2ResumeTooLongResumeMIC : public BadSigma2ResumeParamsBase +{ + static constexpr size_t kSigma2ResumeMICLen = 17; +}; + +struct Sigma2ResumeTooShortResumeMIC : public BadSigma2ResumeParamsBase +{ + static constexpr size_t kSigma2ResumeMICLen = 15; +}; + +struct Sigma2ResumeSessionIdMax : public Sigma2ResumeParams +{ + static constexpr uint32_t kResponderSessionId = UINT16_MAX; +}; + +struct Sigma2ResumeSessionIdTooBig : public BadSigma2ResumeParamsBase +{ + static constexpr uint32_t kResponderSessionId = UINT16_MAX + 1; +}; + +struct Sigma2ResumeFutureProofTlvElement : public Sigma2ResumeParams +{ + static constexpr bool kIncludeFutureProofTlvElement = true; +}; + +struct Sigma2ResumeFutureProofTlvElementNoStructEnd : public BadSigma2ResumeParamsBase +{ + static constexpr bool kIncludeFutureProofTlvElement = true; + static constexpr bool kIncludeStructEnd = false; +}; + +TEST_F(TestCASESession, ParseSigma2Resume) +{ + // 1280 bytes must be enough by definition. + constexpr size_t bufferSize = 1280; + chip::Platform::ScopedMemoryBuffer mem; + EXPECT_TRUE(mem.Calloc(bufferSize)); + + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeParams); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeNoStructEnd); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeWrongTags); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeTooLongResumptionID); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeTooShortResumptionID); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeTooLongResumeMIC); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeTooShortResumeMIC); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeSessionIdMax); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeSessionIdTooBig); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeFutureProofTlvElement); + TestSigma2ResumeParsing(mem, bufferSize, Sigma2ResumeFutureProofTlvElementNoStructEnd); +} + TEST_F(TestCASESession, EncodeSigma2ResumeTest) { CASESessionAccess::EncodeSigma2ResumeInputs encodeParams; + // Set ResumptionID + SessionResumptionStorage::ResumptionIdStorage resumptionId; + EXPECT_EQ(chip::Crypto::DRBG_get_bytes(resumptionId.data(), resumptionId.size()), CHIP_NO_ERROR); + encodeParams.resumptionId = ByteSpan(resumptionId.data(), resumptionId.size()); + + // Set Sigma2ResumeMIC + EXPECT_EQ(chip::Crypto::DRBG_get_bytes(&encodeParams.sigma2ResumeMICBuffer[0], sizeof(encodeParams.sigma2ResumeMICBuffer)), + CHIP_NO_ERROR); + + // Set Responder Session ID encodeParams.responderSessionId = 7315; - // responder Session Parameters - ReliableMessageProtocolConfig mrpConfig = GetDefaultMRPConfig(); - encodeParams.responderMrpConfig = &mrpConfig; + // Set responder MRP Parameters + ReliableMessageProtocolConfig mrpConfig(System::Clock::Milliseconds32(100), System::Clock::Milliseconds32(200), + System::Clock::Milliseconds16(4000)); + encodeParams.responderMrpConfig = &mrpConfig; { System::PacketBufferHandle msg; @@ -1102,6 +1535,26 @@ TEST_F(TestCASESession, EncodeSigma2ResumeTest) encodeParams.responderMrpConfig = &mrpConfig; EXPECT_EQ(CHIP_NO_ERROR, CASESessionAccess::EncodeSigma2Resume(msg, encodeParams)); } + + // Round Trip Test: Encode Parse Sigma2Resume + { + System::PacketBufferHandle msg; + // Succeed when MRP Config is provided + encodeParams.responderMrpConfig = &mrpConfig; + EXPECT_EQ(CHIP_NO_ERROR, CASESessionAccess::EncodeSigma2Resume(msg, encodeParams)); + + System::PacketBufferTLVReader tlvReader; + tlvReader.Init(std::move(msg)); + CASESessionAccess::ParsedSigma2Resume parsedMessage; + + EXPECT_EQ(CHIP_NO_ERROR, CASESessionAccess::ParseSigma2Resume(tlvReader, parsedMessage)); + + // compare parsed values with original values + EXPECT_TRUE(parsedMessage.resumptionId.data_equal(encodeParams.resumptionId)); + EXPECT_TRUE(parsedMessage.sigma2ResumeMIC.data_equal(encodeParams.sigma2ResumeMIC)); + EXPECT_EQ(parsedMessage.responderSessionId, encodeParams.responderSessionId); + EXPECT_EQ(parsedMessage.responderSessionParams.GetMRPConfig(), *encodeParams.responderMrpConfig); + } } struct SessionResumptionTestStorage : SessionResumptionStorage @@ -1386,4 +1839,452 @@ TEST_F(TestCASESession, Sigma1BadDestinationIdTest) caseSession.Clear(); } +struct Sigma2TBEDataParams +{ + // Purposefully not using constants like kSigmaParamRandomNumberSize that + // the code uses, so we have a cross-check. + static constexpr size_t kResponderNOCLen = 400; + static constexpr size_t kResponderICACLen = 400; + static constexpr size_t kSignatureLen = 64; + static constexpr size_t kResumptionIdLen = 16; + static constexpr uint16_t kFutureProofTlvElement = 77; + + static constexpr uint8_t kResponderNOCTag = 1; + static constexpr uint8_t kResponderICACTag = 2; + static constexpr uint8_t kSignatureTag = 3; + static constexpr uint8_t kResumptionIdTag = 4; + static constexpr uint8_t kFutureProofTlvElementTag = 11; + + static constexpr uint8_t kTestValueResponderNOC = 1; + static constexpr uint8_t kTestValueResponderICAC = 2; + static constexpr uint8_t kTestValueSignature = 3; + static constexpr uint8_t kTestValueResumptionId = 4; + + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ContextTag(num); } + + static constexpr bool kIncludeFutureProofTlvElement = false; + + static constexpr bool kIncludeStructEnd = true; + + static constexpr bool kExpectSuccess = true; +}; + +template +static CHIP_ERROR EncodeSigma2TBEDataHelper(MutableByteSpan & buf) +{ + using namespace TLV; + + TLVWriter writer; + writer.Init(buf); + + TLVType containerType; + ReturnErrorOnFailure(writer.StartContainer(AnonymousTag(), kTLVType_Structure, containerType)); + uint8_t responderNOC[Params::kResponderNOCLen] = { Params::kTestValueResponderNOC }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResponderNOCTag), ByteSpan(responderNOC))); + + uint8_t responderICAC[Params::kResponderICACLen] = { Params::kTestValueResponderICAC }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResponderICACTag), ByteSpan(responderICAC))); + + uint8_t signature[Params::kSignatureLen] = { Params::kTestValueSignature }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kSignatureTag), ByteSpan(signature))); + + uint8_t resumptionId[Params::kResumptionIdLen] = { Params::kTestValueResumptionId }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kResumptionIdTag), ByteSpan(resumptionId))); + + // Future-proofing: Ensure that TLV elements being added to the specification in the future are properly handled. + if constexpr (Params::kIncludeFutureProofTlvElement) + { + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kFutureProofTlvElementTag), Params::kFutureProofTlvElement)); + } + + if constexpr (Params::kIncludeStructEnd) + { + ReturnErrorOnFailure(writer.EndContainer(containerType)); + } + + buf.reduce_size(writer.GetLengthWritten()); + return CHIP_NO_ERROR; +} + +// A macro, so we can tell which test failed based on line number. +#define TestSigma2TBEParsing(mem, bufferSize, params) \ + do \ + { \ + MutableByteSpan buf((mem).Get(), (bufferSize)); \ + EXPECT_EQ(EncodeSigma2TBEDataHelper(buf), CHIP_NO_ERROR); \ + \ + TLV::ContiguousBufferTLVReader reader; \ + reader.Init(buf); \ + CASESessionAccess::ParsedSigma2TBEData parsedSigma2TBEData; \ + \ + EXPECT_EQ(CASESessionAccess::ParseSigma2TBEData(reader, parsedSigma2TBEData) == CHIP_NO_ERROR, params::kExpectSuccess); \ + if (params::kExpectSuccess) \ + { \ + uint8_t expectedNOC[params::kResponderNOCLen] = { params::kTestValueResponderNOC }; \ + uint8_t expectedICAC[params::kResponderICACLen] = { params::kTestValueResponderICAC }; \ + uint8_t expectedSignature[params::kSignatureLen] = { params::kTestValueSignature }; \ + uint8_t expectedResumptionId[params::kResumptionIdLen] = { params::kTestValueResumptionId }; \ + \ + EXPECT_TRUE(parsedSigma2TBEData.responderNOC.data_equal(ByteSpan(expectedNOC))); \ + EXPECT_TRUE(parsedSigma2TBEData.responderICAC.data_equal(ByteSpan(expectedICAC))); \ + EXPECT_TRUE(ByteSpan(parsedSigma2TBEData.tbsData2Signature.Bytes(), parsedSigma2TBEData.tbsData2Signature.Length()) \ + .data_equal(ByteSpan(expectedSignature))); \ + EXPECT_TRUE(parsedSigma2TBEData.resumptionId.data_equal(ByteSpan(expectedResumptionId))); \ + } \ + } while (0) + +struct BadSigma2TBEParamsBase : public Sigma2TBEDataParams +{ + static constexpr bool kExpectSuccess = false; +}; + +struct Sigma2TBENoStructEnd : public BadSigma2TBEParamsBase +{ + static constexpr bool kIncludeStructEnd = false; +}; + +struct Sigma2TBEWrongTags : public BadSigma2TBEParamsBase +{ + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ProfileTag(0, num); } +}; + +struct Sigma2TBETooLongNOC : public BadSigma2TBEParamsBase +{ + static constexpr size_t kResponderNOCLen = 401; +}; + +struct Sigma2TBETooLongICAC : public BadSigma2TBEParamsBase +{ + static constexpr size_t kResponderICACLen = 401; +}; + +struct Sigma2TBETooLongSignature : public BadSigma2TBEParamsBase +{ + static constexpr size_t kSignatureLen = 65; +}; +struct Sigma2TBETooShortSignature : public BadSigma2TBEParamsBase +{ + static constexpr size_t kSignatureLen = 63; +}; + +struct Sigma2TBETooLongResumptionID : public BadSigma2TBEParamsBase +{ + static constexpr size_t kResumptionIdLen = 17; +}; + +struct Sigma2TBETooShortResumptionID : public BadSigma2TBEParamsBase +{ + static constexpr size_t kResumptionIdLen = 15; +}; + +struct Sigma2TBEFutureProofTlvElement : public Sigma2TBEDataParams +{ + static constexpr bool kIncludeFutureProofTlvElement = true; +}; + +struct Sigma2TBEFutureProofTlvElementNoStructEnd : public BadSigma2TBEParamsBase +{ + static constexpr bool kIncludeFutureProofTlvElement = true; + static constexpr bool kIncludeStructEnd = false; +}; + +TEST_F(TestCASESession, ParseSigma2TBEData) +{ + // 1280 bytes must be enough by definition. + constexpr size_t bufferSize = 1280; + chip::Platform::ScopedMemoryBuffer mem; + EXPECT_TRUE(mem.Calloc(bufferSize)); + + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBEDataParams); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBENoStructEnd); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBEWrongTags); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBETooLongNOC); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBETooLongICAC); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBETooLongSignature); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBETooShortSignature); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBETooLongResumptionID); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBETooShortResumptionID); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBEFutureProofTlvElement); + TestSigma2TBEParsing(mem, bufferSize, Sigma2TBEFutureProofTlvElementNoStructEnd); +} + +constexpr size_t kMaxMsgR3SignedEncLen = + TLV::EstimateStructOverhead(kMaxCHIPCertLength, // responderNOC + kMaxCHIPCertLength, // responderICAC + kMax_ECDSA_Signature_Length, // signature + kCaseOverheadForFutureTbeData // extra bytes for future-proofing + ); + +struct Sigma3Params +{ + // Purposefully not using constants like kSigmaParamRandomNumberSize that + // the code uses, so we have a cross-check. + + static constexpr size_t kEncrypted3Len = + CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES + 1; // Needs to be bigger than CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES + static constexpr uint16_t kFutureProofTlvElement = 77; + + static constexpr uint8_t kEncrypted3Tag = 1; + static constexpr uint8_t kFutureProofTlvElementTag = 7; + + static constexpr uint8_t kTestValueEncrypted3 = { 1 }; + + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ContextTag(num); } + + static constexpr bool kIncludeFutureProofTlvElement = false; + static constexpr bool kIncludeStructEnd = true; + + static constexpr bool kExpectSuccess = true; +}; + +template +static CHIP_ERROR EncodeSigma3Helper(MutableByteSpan & buf) +{ + using namespace TLV; + + TLVWriter writer; + writer.Init(buf); + + TLVType containerType; + ReturnErrorOnFailure(writer.StartContainer(AnonymousTag(), kTLVType_Structure, containerType)); + + uint8_t encrypted3[Params::kEncrypted3Len] = { Params::kTestValueEncrypted3 }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kEncrypted3Tag), ByteSpan(encrypted3))); + + // Future-proofing: Ensure that TLV elements being added to the specification in the future are properly handled. + if constexpr (Params::kIncludeFutureProofTlvElement) + { + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kFutureProofTlvElementTag), Params::kFutureProofTlvElement)); + } + + if constexpr (Params::kIncludeStructEnd) + { + ReturnErrorOnFailure(writer.EndContainer(containerType)); + } + + buf.reduce_size(writer.GetLengthWritten()); + return CHIP_NO_ERROR; +} + +// A macro, so we can tell which test failed based on line number. +#define TestSigma3Parsing(mem, bufferSize, params) \ + do \ + { \ + MutableByteSpan buf((mem).Get(), (bufferSize)); \ + EXPECT_EQ(EncodeSigma3Helper(buf), CHIP_NO_ERROR); \ + \ + TLV::ContiguousBufferTLVReader reader; \ + reader.Init(buf); \ + Platform::ScopedMemoryBufferWithSize msgR3Encrypted; \ + MutableByteSpan msgR3EncryptedPayload; \ + ByteSpan msgR3Mic; \ + \ + EXPECT_EQ(CASESessionAccess::ParseSigma3(reader, msgR3Encrypted, msgR3EncryptedPayload, msgR3Mic) == CHIP_NO_ERROR, \ + params::kExpectSuccess); \ + if (params::kExpectSuccess) \ + { \ + uint8_t expectedEncrypted3[params::kEncrypted3Len] = { params::kTestValueEncrypted3 }; \ + EXPECT_TRUE(ByteSpan(msgR3Encrypted.Get(), msgR3Encrypted.AllocatedSize()).data_equal(ByteSpan(expectedEncrypted3))); \ + } \ + } while (0) + +struct BadSigma3ParamsBase : public Sigma3Params +{ + static constexpr bool kExpectSuccess = false; +}; + +struct Sigma3NoStructEnd : public BadSigma3ParamsBase +{ + static constexpr bool kIncludeStructEnd = false; +}; + +struct Sigma3WrongTags : public BadSigma3ParamsBase +{ + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ProfileTag(0, num); } +}; + +struct Sigma3TooLongEncrypted3 : public BadSigma3ParamsBase +{ + static constexpr size_t kEncrypted3Len = kMaxMsgR3SignedEncLen + 1; +}; +struct Sigma3TooShortEncrypted3 : public BadSigma3ParamsBase +{ + static constexpr size_t kEncrypted3Len = CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES; +}; + +struct Sigma3FutureProofTlvElement : public Sigma3Params +{ + static constexpr bool kIncludeFutureProofTlvElement = true; +}; + +struct Sigma3FutureProofTlvElementNoStructEnd : public BadSigma3ParamsBase +{ + static constexpr bool kIncludeFutureProofTlvElement = true; + static constexpr bool kIncludeStructEnd = false; +}; + +TEST_F(TestCASESession, Sigma3ParsingTest) +{ + // 1280 bytes must be enough by definition. + constexpr size_t bufferSize = 1280; + chip::Platform::ScopedMemoryBuffer mem; + EXPECT_TRUE(mem.Calloc(bufferSize)); + + TestSigma3Parsing(mem, bufferSize, Sigma3Params); + TestSigma3Parsing(mem, bufferSize, Sigma3NoStructEnd); + TestSigma3Parsing(mem, bufferSize, Sigma3WrongTags); + TestSigma3Parsing(mem, bufferSize, Sigma3TooLongEncrypted3); + TestSigma3Parsing(mem, bufferSize, Sigma3TooShortEncrypted3); + TestSigma3Parsing(mem, bufferSize, Sigma3FutureProofTlvElement); + TestSigma3Parsing(mem, bufferSize, Sigma3FutureProofTlvElementNoStructEnd); +} + +struct Sigma3TBEDataParams +{ + // Purposefully not using constants like kSigmaParamRandomNumberSize that + // the code uses, so we have a cross-check. + static constexpr size_t kInitiatorNOCLen = 400; + static constexpr size_t kInitiatorICACLen = 400; + static constexpr size_t kSignatureLen = 64; + static constexpr uint16_t kFutureProofTlvElement = 77; + + static constexpr uint8_t kInitiatorNOCTag = 1; + static constexpr uint8_t kInitiatorICACTag = 2; + static constexpr uint8_t kSignatureTag = 3; + static constexpr uint8_t kFutureProofTlvElementTag = 11; + + static constexpr uint8_t kTestValueInitiatorNOC = 1; + static constexpr uint8_t kTestValueInitiatorICAC = 2; + static constexpr uint8_t kTestValueSignature = 3; + + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ContextTag(num); } + + static constexpr bool kIncludeFutureProofTlvElement = false; + static constexpr bool kIncludeStructEnd = true; + + static constexpr bool kExpectSuccess = true; +}; + +template +static CHIP_ERROR EncodeSigma3TBEDataHelper(MutableByteSpan & buf) +{ + using namespace TLV; + + TLVWriter writer; + writer.Init(buf); + + TLVType containerType; + ReturnErrorOnFailure(writer.StartContainer(AnonymousTag(), kTLVType_Structure, containerType)); + + uint8_t initiatorNOC[Params::kInitiatorNOCLen] = { Params::kTestValueInitiatorNOC }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kInitiatorNOCTag), ByteSpan(initiatorNOC))); + + uint8_t initiatorICAC[Params::kInitiatorICACLen] = { Params::kTestValueInitiatorICAC }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kInitiatorICACTag), ByteSpan(initiatorICAC))); + + uint8_t signature[Params::kSignatureLen] = { Params::kTestValueSignature }; + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kSignatureTag), ByteSpan(signature))); + + // Future-proofing: Ensure that TLV elements being added to the specification in the future are properly handled. + if constexpr (Params::kIncludeFutureProofTlvElement) + { + ReturnErrorOnFailure(writer.Put(Params::NumToTag(Params::kFutureProofTlvElementTag), Params::kFutureProofTlvElement)); + } + + if constexpr (Params::kIncludeStructEnd) + { + ReturnErrorOnFailure(writer.EndContainer(containerType)); + } + + buf.reduce_size(writer.GetLengthWritten()); + return CHIP_NO_ERROR; +} + +#define TestSigma3TBEParsing(mem, bufferSize, params) \ + do \ + { \ + MutableByteSpan buf((mem).Get(), (bufferSize)); \ + EXPECT_EQ(EncodeSigma3TBEDataHelper(buf), CHIP_NO_ERROR); \ + \ + TLV::ContiguousBufferTLVReader reader; \ + reader.Init(buf); \ + CASESessionAccess::HandleSigma3Data handleSigma3Data; \ + \ + EXPECT_EQ(CASESessionAccess::ParseSigma3TBEData(reader, handleSigma3Data) == CHIP_NO_ERROR, params::kExpectSuccess); \ + if (params::kExpectSuccess) \ + { \ + uint8_t expectedNOC[params::kInitiatorNOCLen] = { params::kTestValueInitiatorNOC }; \ + uint8_t expectedICAC[params::kInitiatorICACLen] = { params::kTestValueInitiatorICAC }; \ + uint8_t expectedSignature[params::kSignatureLen] = { params::kTestValueSignature }; \ + \ + EXPECT_TRUE(handleSigma3Data.initiatorNOC.data_equal(ByteSpan(expectedNOC))); \ + EXPECT_TRUE(handleSigma3Data.initiatorICAC.data_equal(ByteSpan(expectedICAC))); \ + EXPECT_TRUE(ByteSpan(handleSigma3Data.tbsData3Signature.Bytes(), handleSigma3Data.tbsData3Signature.Length()) \ + .data_equal(ByteSpan(expectedSignature))); \ + } \ + } while (0) + +struct BadSigma3TBEParamsBase : public Sigma3TBEDataParams +{ + static constexpr bool kExpectSuccess = false; +}; + +struct Sigma3TBENoStructEnd : public BadSigma3TBEParamsBase +{ + static constexpr bool kIncludeStructEnd = false; +}; + +struct Sigma3TBEWrongTags : public BadSigma3TBEParamsBase +{ + static constexpr TLV::Tag NumToTag(uint8_t num) { return TLV::ProfileTag(0, num); } +}; + +struct Sigma3TBETooLongNOC : public BadSigma3TBEParamsBase +{ + static constexpr size_t kInitiatorNOCLen = 401; +}; + +struct Sigma3TBETooLongICAC : public BadSigma3TBEParamsBase +{ + static constexpr size_t kInitiatorICACLen = 401; +}; + +struct Sigma3TBETooLongSignature : public BadSigma3TBEParamsBase +{ + static constexpr size_t kSignatureLen = 65; +}; +struct Sigma3TBETooShortSignature : public BadSigma3TBEParamsBase +{ + static constexpr size_t kSignatureLen = 63; +}; + +struct Sigma3TBEFutureProofTlvElement : public Sigma3TBEDataParams +{ + static constexpr bool kIncludeFutureProofTlvElement = true; +}; + +struct Sigma3TBEFutureProofTlvElementNoStructEnd : public BadSigma3TBEParamsBase +{ + static constexpr bool kIncludeFutureProofTlvElement = true; + static constexpr bool kIncludeStructEnd = false; +}; + +TEST_F(TestCASESession, ParseSigma3TBEData) +{ + // 1280 bytes must be enough by definition. + constexpr size_t bufferSize = 1280; + chip::Platform::ScopedMemoryBuffer mem; + EXPECT_TRUE(mem.Calloc(bufferSize)); + + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBEDataParams); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBENoStructEnd); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBEWrongTags); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBETooLongNOC); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBETooLongICAC); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBETooLongSignature); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBETooShortSignature); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBEFutureProofTlvElement); + TestSigma3TBEParsing(mem, bufferSize, Sigma3TBEFutureProofTlvElementNoStructEnd); +} + } // namespace chip diff --git a/src/python_testing/TCP_Tests.py b/src/python_testing/TCP_Tests.py index f38cdb5651bce0..6e36085c3ddaf2 100644 --- a/src/python_testing/TCP_Tests.py +++ b/src/python_testing/TCP_Tests.py @@ -33,7 +33,7 @@ import chip.clusters as Clusters from chip import ChipDeviceCtrl from chip.interaction_model import InteractionModelError -from chip.testing.matter_testing import MatterBaseTest, async_test_body, default_matter_test_main +from chip.testing.matter_testing import MatterBaseTest, TestStep, async_test_body, default_matter_test_main from mobly import asserts @@ -48,141 +48,265 @@ async def teardown_test(self): await self.send_single_cmd(cmd=cmd, endpoint=0, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) - def pics_SC_8_1(self): + def pics_TC_SC_8_1(self): return ['MCORE.SC.TCP'] + def steps_TC_SC_8_1(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "TH initiates a CASE session establishment with DUT, requesting a session supporting large payloads."), + TestStep(3, "Verifying that a session is set up with an underlying TCP connection established with DUT."), + ] + return steps + # TCP Connection Establishment @async_test_body async def test_TC_SC_8_1(self): + self.step(1) try: + self.step(2) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(3) asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") - def pics_SC_8_2(self): + def pics_TC_SC_8_2(self): return ['MCORE.SC.TCP'] + def steps_TC_SC_8_2(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "TH initiates a CASE session establishment with DUT, requesting a session supporting large payloads."), + TestStep(3, "Verifying that the session established with DUT allows large payloads."), + ] + return steps + # Large Payload Session Establishment @async_test_body async def test_TC_SC_8_2(self): + self.step(1) try: + self.step(2) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(3) asserts.assert_equal(device.sessionAllowsLargePayload, True, "Session does not have associated TCP connection") - def pics_SC_8_3(self): + def pics_TC_SC_8_3(self): return ['MCORE.SC.TCP'] + def steps_TC_SC_8_3(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "TH initiates a CASE session establishment with DUT, requesting a session supporting large payloads."), + TestStep(3, "Verifying that a session is set up with an underlying TCP connection established with DUT."), + TestStep(4, "TH closes the TCP connection with DUT"), + TestStep(5, "Verifying that the secure session with DUT is inactive."), + ] + return steps + # Session Inactive After TCP Disconnect @async_test_body async def test_TC_SC_8_3(self): + self.step(1) try: + self.step(2) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(3) asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") + self.step(4) device.closeTCPConnectionWithPeer() + + self.step(5) asserts.assert_equal(device.isActiveSession, False, "Large Payload Session should not be active after TCP connection closure") - def pics_SC_8_4(self): + def pics_TC_SC_8_4(self): return ['MCORE.SC.TCP'] + def steps_TC_SC_8_4(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "TH initiates a CASE session establishment with DUT, requesting a session supporting large payloads."), + TestStep(3, "Verifying that a session is set up with an underlying TCP connection established with DUT."), + TestStep(4, "TH closes the TCP connection with DUT"), + TestStep(5, "Verifyng that the secure session with DUT is inactive."), + TestStep(6, "TH re-initiates CASE session establishment over TCP with DUT"), + TestStep(7, "Verifying that a session is set up with an underlying TCP connection established with DUT."), + TestStep(8, "Verifying that the large-payload secure session with DUT is active."), + ] + return steps + # TCP Connect, Disconnect, Then Connect Again @async_test_body async def test_TC_SC_8_4(self): + self.step(1) try: + self.step(2) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(3) asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") + self.step(4) device.closeTCPConnectionWithPeer() + + self.step(5) asserts.assert_equal(device.isActiveSession, False, "Large Payload Session should not be active after TCP connection closure") # Connect again try: + self.step(6) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(7) asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") + + self.step(8) asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") - def pics_SC_8_5(self): + def pics_TC_SC_8_5(self): return ['MCORE.SC.TCP'] + def steps_TC_SC_8_5(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "TH initiates a CASE session establishment with DUT, requesting a session supporting large payloads."), + TestStep(3, "Verifying that a session is set up with an underlying TCP connection established with DUT."), + TestStep(4, "Verifying that the large-payload secure session with DUT is active."), + TestStep(5, "TH initiates an InvokeCommandRequest with DUT over the established session."), + TestStep(6, "Verifying successful invocation with DUT over the established session without any error."), + ] + return steps + @async_test_body async def test_TC_SC_8_5(self): + self.step(1) try: + self.step(2) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(3) asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") + + self.step(4) asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") asserts.assert_equal(device.sessionAllowsLargePayload, True, "Session does not have associated TCP connection") try: + self.step(5) await self.send_arm_cmd(ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except InteractionModelError: asserts.fail("Unexpected error returned by DUT") + self.step(6) - def pics_SC_8_6(self): + def pics_TC_SC_8_6(self): return ['MCORE.SC.TCP'] + def steps_TC_SC_8_6(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "TH initiates a CASE session establishment with DUT, requesting a session supporting large payloads."), + TestStep(3, "Verifying that a session is set up with an underlying TCP connection established with DUT."), + TestStep(4, "Verifying that the large-payload secure session with DUT is active."), + TestStep(5, "TH initiates a Read of all attributes of all clusters of DUT."), + TestStep(6, "Verifying wildcard read was successful with DUT over the established session without any error."), + ] + return steps + # WildCard Read Over TCP Session @async_test_body async def test_TC_SC_8_6(self): + self.step(1) try: + self.step(2) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(3) asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") + + self.step(4) asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") asserts.assert_equal(device.sessionAllowsLargePayload, True, "Session does not have associated TCP connection") try: + self.step(5) await self.default_controller.Read(self.dut_node_id, [()], payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except InteractionModelError: asserts.fail("Unexpected error returned by DUT") + self.step(6) - def pics_SC_8_7(self): + def pics_TC_SC_8_7(self): return ['MCORE.SC.TCP'] + def steps_TC_SC_8_7(self) -> list[TestStep]: + steps = [ + TestStep(1, "Commissioning, already done", is_commissioning=True), + TestStep(2, "TH initiates a CASE session establishment with DUT, requesting a session supporting large payloads."), + TestStep(3, "Verifying that a session is set up with an underlying TCP connection established with DUT."), + TestStep(4, "Verifying that the large-payload secure session with DUT is active."), + TestStep(5, "TH initiates a regularly-sized InvokeCommandRequest with DUT, specifying that either a MRP or TCP-based session is usable."), + TestStep(6, "Verifying successful invocation with DUT over the established TCP-based session without any error."), + ] + return steps + # Use TCP Session If Available For MRP Interaction @async_test_body async def test_TC_SC_8_7(self): + self.step(1) + try: + self.step(2) device = await self.default_controller.GetConnectedDevice(nodeid=self.dut_node_id, allowPASE=False, timeoutMs=1000, payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except TimeoutError: asserts.fail("Unable to establish a CASE session over TCP to the device") + + self.step(3) asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") + + self.step(4) asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") asserts.assert_equal(device.sessionAllowsLargePayload, True, "Session does not have associated TCP connection") try: + self.step(5) self.send_arm_cmd(ChipDeviceCtrl.TransportPayloadCapability.MRP_OR_TCP_PAYLOAD) except InteractionModelError: asserts.fail("Unexpected error returned by DUT") + self.step(6) if __name__ == "__main__": diff --git a/src/python_testing/TC_DGWIFI_2_1.py b/src/python_testing/TC_DGWIFI_2_1.py index e32f1487291263..a1dd0b8e1eeaf1 100644 --- a/src/python_testing/TC_DGWIFI_2_1.py +++ b/src/python_testing/TC_DGWIFI_2_1.py @@ -138,7 +138,7 @@ async def test_TC_DGWIFI_2_1(self): Clusters.Objects.WiFiNetworkDiagnostics.Enums.SecurityTypeEnum) # Additional check that it's not kUnknownEnumValue: - self.assert_true( + asserts.assert_true( security_type != Clusters.Objects.WiFiNetworkDiagnostics.Enums.SecurityTypeEnum.kUnknownEnumValue, f"SecurityType should not be kUnknownEnumValue " f"({Clusters.Objects.WiFiNetworkDiagnostics.Enums.SecurityTypeEnum.kUnknownEnumValue})" @@ -158,8 +158,8 @@ async def test_TC_DGWIFI_2_1(self): Clusters.Objects.WiFiNetworkDiagnostics.Enums.WiFiVersionEnum) # Additional check that it's not kUnknownEnumValue: - self.assert_true(wifi_version != Clusters.Objects.WiFiNetworkDiagnostics.Enums.WiFiVersionEnum.kUnknownEnumValue, - f"WiFiVersion should not be kUnknownEnumValue ({Clusters.Objects.WiFiNetworkDiagnostics.Enums.WiFiVersionEnum.kUnknownEnumValue})") + asserts.assert_true(wifi_version != Clusters.Objects.WiFiNetworkDiagnostics.Enums.WiFiVersionEnum.kUnknownEnumValue, + f"WiFiVersion should not be kUnknownEnumValue ({Clusters.Objects.WiFiNetworkDiagnostics.Enums.WiFiVersionEnum.kUnknownEnumValue})") # # STEP 5: TH reads ChannelNumber attribute diff --git a/src/python_testing/TC_DeviceConformance.py b/src/python_testing/TC_DeviceConformance.py index a7843a521105a0..de6714abb30a1e 100644 --- a/src/python_testing/TC_DeviceConformance.py +++ b/src/python_testing/TC_DeviceConformance.py @@ -68,9 +68,9 @@ def _has_device_type_supporting_macl(self): # Currently this is just NIM. We may later be able to pull this from the device type scrape using the ManagedAclAllowed condition, # but these are not currently exposed directly by the device. allowed_ids = [self._get_device_type_id('network infrastructure manager')] - for endpoint in self.endpoints_tlv.values(): + for endpoint in self.endpoints.values(): desc = Clusters.Descriptor - device_types = [dt.deviceType for dt in endpoint[desc.id][desc.Attributes.DeviceTypeList.attribute_id]] + device_types = [dt.deviceType for dt in endpoint[desc][desc.Attributes.DeviceTypeList]] if set(allowed_ids).intersection(set(device_types)): # TODO: it's unclear if this needs to be present on every endpoint. Right now, this assumes one is sufficient. return True diff --git a/src/python_testing/TC_FLABEL_2_1.py b/src/python_testing/TC_FLABEL_2_1.py new file mode 100644 index 00000000000000..39544b734d0db5 --- /dev/null +++ b/src/python_testing/TC_FLABEL_2_1.py @@ -0,0 +1,110 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# === BEGIN CI TEST ARGUMENTS === +# test-runner-runs: +# run1: +# app: ${ALL_CLUSTERS_APP} +# app-args: --discriminator 1234 --KVS kvs1 --trace-to json:${TRACE_APP}.json +# script-args: > +# --storage-path admin_storage.json +# --commissioning-method on-network +# --discriminator 1234 +# --passcode 20202021 +# --endpoint 1 +# --trace-to json:${TRACE_TEST_JSON}.json +# --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto +# factory-reset: true +# quiet: true +# === END CI TEST ARGUMENTS === + +import chip.clusters as Clusters +from chip.interaction_model import Status +from chip.testing.matter_testing import MatterBaseTest, TestStep, default_matter_test_main, has_attribute, run_if_endpoint_matches +from mobly import asserts + + +class Test_TC_FLABEL_2_1(MatterBaseTest): + def pics_TC_FLABEL_2_1(self) -> list[str]: + return ["FLABEL.S"] + + def steps_TC_FLABEL_2_1(self) -> list[TestStep]: + return [ + TestStep(1, "Commission DUT to TH", is_commissioning=True), + TestStep(2, "TH reads LabelList from the DUT", "Read is successful"), + TestStep(3, "TH tries to write LabelList attribute", "Write fails with UNSUPPORTED_WRITE"), + TestStep(4, "Verify LabelList hasn't changed", "LabelList matches initial read") + ] + + def desc_TC_FLABEL_2_1(self) -> str: + return "[TC-FLABEL-2.1] Fixed Label Cluster [DUT-server]" + + @run_if_endpoint_matches(has_attribute(Clusters.FixedLabel.Attributes.LabelList)) + async def test_TC_FLABEL_2_1(self): + # Step 1: Commission DUT (already done) + self.step(1) + + # Step 2: Read LabelList attribute + self.step(2) + initial_labels = await self.read_single_attribute_check_success( + cluster=Clusters.Objects.FixedLabel, + attribute=Clusters.Objects.FixedLabel.Attributes.LabelList + ) + asserts.assert_true(isinstance(initial_labels, list), "LabelList should be a list type") + + # Verify each label in the list meets the requirements + for label_struct in initial_labels: + # Verify label field + asserts.assert_true(isinstance(label_struct.label, str), + "Label field must be a string") + asserts.assert_true(len(label_struct.label.encode('utf-8')) <= 16, + f"Label '{label_struct.label}' exceeds 16 bytes") + + # Verify value field + asserts.assert_true(isinstance(label_struct.value, str), + "Value field must be a string") + asserts.assert_true(len(label_struct.value.encode('utf-8')) <= 16, + f"Value '{label_struct.value}' exceeds 16 bytes") + + # Step 3: Attempt to write LabelList (should fail) + self.step(3) + test_label = Clusters.Objects.FixedLabel.Attributes.LabelList( + [Clusters.Objects.FixedLabel.Structs.LabelStruct( + label="Test_Label", + value="Test_Value" + )] + ) + + # Use write_single_attribute with expect_success=False since we expect it to fail + write_status = await self.write_single_attribute( + attribute_value=test_label, + expect_success=False + ) + asserts.assert_equal(write_status, Status.UnsupportedWrite, "Expected UNSUPPORTED_WRITE status") + + # Step 4: Verify LabelList hasn't changed + self.step(4) + final_labels = await self.read_single_attribute_check_success( + cluster=Clusters.Objects.FixedLabel, + attribute=Clusters.Objects.FixedLabel.Attributes.LabelList + ) + asserts.assert_equal(initial_labels, final_labels, + "LabelList should remain unchanged after write attempt") + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TC_MCORE_FS_1_4.py b/src/python_testing/TC_MCORE_FS_1_4.py index e866533f15c36f..469d5481eebed2 100644 --- a/src/python_testing/TC_MCORE_FS_1_4.py +++ b/src/python_testing/TC_MCORE_FS_1_4.py @@ -393,7 +393,7 @@ async def test_TC_MCORE_FS_1_4(self): asserts.assert_true(dut_fsa_bridge_endpoints_new.issuperset(dut_fsa_bridge_endpoints), "Expected only new endpoints to be added") unique_endpoints_set = dut_fsa_bridge_endpoints_new - dut_fsa_bridge_endpoints - asserts.assert_equal(len(unique_endpoints_set), 1, "Expected only one new endpoint on DUT_FSA") + asserts.assert_equal(len(unique_endpoints_set), 1, "Expected exactly one new endpoint on DUT_FSA") dut_fsa_bridge_th_server_endpoint = list(unique_endpoints_set)[0] # Verify that DUT_FSA copied the TH_SERVER_NO_UID UniqueID from TH_FSA. diff --git a/src/python_testing/TestConformanceTest.py b/src/python_testing/TestConformanceTest.py index ddf3e421a7f75c..c7b73495b67596 100644 --- a/src/python_testing/TestConformanceTest.py +++ b/src/python_testing/TestConformanceTest.py @@ -15,7 +15,7 @@ # limitations under the License. # -from typing import Any +from typing import Any, Optional import chip.clusters as Clusters from chip.testing.basic_composition import arls_populated @@ -142,6 +142,12 @@ async def test_provisional_cluster(self): success, problems = self.check_conformance(ignore_in_progress=False, is_ci=False, allow_provisional=False) asserts.assert_true(success, "Unexpected failure parsing endpoint with no clusters marked as provisional") + def _get_field_by_label(self, cl_object: Clusters.ClusterObjects.ClusterObject, label: str) -> Optional[Clusters.ClusterObjects.ClusterObjectFieldDescriptor]: + for field in cl_object.descriptor.Fields: + if field.Label == label: + return field + return None + def _create_minimal_cluster(self, cluster_id: int) -> dict[int, Any]: attrs = {} attrs[GlobalAttributeIds.FEATURE_MAP_ID] = 0 @@ -160,11 +166,11 @@ def _create_minimal_cluster(self, cluster_id: int) -> dict[int, Any]: attrs[GlobalAttributeIds.CLUSTER_REVISION_ID] = self.xml_clusters[cluster_id].revision return attrs - def _create_minimal_dt(self, device_type_id: int) -> dict[int, dict[int, Any]]: - ''' Creates the internals of an endpoint_tlv with the minimal set of clusters, with the minimal set of attributes and commands. Global attributes only. + def _create_minimal_dt(self, device_type_id: int, is_tlv_endpoint: bool = True) -> dict[int, dict[int, Any]]: + ''' Creates the internals of an endpoint with the minimal set of clusters, with the minimal set of attributes and commands. Global attributes only. Does NOT take into account overrides yet. ''' - endpoint_tlv = {} + endpoint = {} required_servers = [id for id, c in self.xml_device_types[device_type_id].server_clusters.items() if is_mandatory(c.conformance)] required_clients = [id for id, c in self.xml_device_types[device_type_id].client_clusters.items() @@ -172,25 +178,49 @@ def _create_minimal_dt(self, device_type_id: int) -> dict[int, dict[int, Any]]: device_type_revision = self.xml_device_types[device_type_id].revision for s in required_servers: - endpoint_tlv[s] = self._create_minimal_cluster(s) + endpoint[s] = self._create_minimal_cluster(s) # Descriptor attr = Clusters.Descriptor.Attributes + structs = Clusters.Descriptor.Structs attrs = {} - attrs[attr.FeatureMap.attribute_id] = 0 - attrs[attr.AcceptedCommandList.attribute_id] = [] - attrs[attr.GeneratedCommandList.attribute_id] = [] - attrs[attr.ClusterRevision.attribute_id] = self.xml_clusters[Clusters.Descriptor.id].revision - attrs[attr.DeviceTypeList.attribute_id] = [ - Clusters.Descriptor.Structs.DeviceTypeStruct(deviceType=device_type_id, revision=device_type_revision)] - attrs[attr.ServerList.attribute_id] = required_servers - attrs[attr.ClientList.attribute_id] = required_clients - attrs[attr.PartsList.attribute_id] = [] - attrs[attr.AttributeList.attribute_id] = [] - attrs[attr.AttributeList.attribute_id] = list(attrs.keys()) - - endpoint_tlv[Clusters.Descriptor.id] = attrs - return endpoint_tlv + + attributes = [ + attr.FeatureMap, + attr.AcceptedCommandList, + attr.GeneratedCommandList, + attr.ClusterRevision, + attr.DeviceTypeList, + attr.ServerList, + attr.ClientList, + attr.PartsList, + ] + + attribute_values = [ + (0, 0), # FeatureMap + ([], []), # AcceptedCommandList + ([], []), # GeneratedCommandList + (self.xml_clusters[Clusters.Descriptor.id].revision, + self.xml_clusters[Clusters.Descriptor.id].revision), # ClusterRevision + ([{self._get_field_by_label(structs.DeviceTypeStruct, "deviceType").Tag: device_type_id, + self._get_field_by_label(structs.DeviceTypeStruct, "revision").Tag: device_type_revision}], + [Clusters.Descriptor.Structs.DeviceTypeStruct( + deviceType=device_type_id, revision=device_type_revision)]), # DeviceTypeList + (required_servers, required_servers), # ServerList + (required_clients, required_clients), # ClientList + ([], []), # PartsList + ] + + for attribute_name, attribute_value in zip(attributes, attribute_values): + key = attribute_name.attribute_id if is_tlv_endpoint else attribute_name + attrs[key] = attribute_value[0] if is_tlv_endpoint else attribute_value[1] + + # Append the attribute list now that is populated. + attrs[attr.AttributeList.attribute_id if is_tlv_endpoint else attr.AttributeList] = list(attrs.keys()) + + endpoint[Clusters.Descriptor.id if is_tlv_endpoint else Clusters.Descriptor] = attrs + + return endpoint def add_macl(self, root_endpoint: dict[int, dict[int, Any]], populate_arl: bool = False, populate_commissioning_arl: bool = False): ac = Clusters.AccessControl @@ -220,6 +250,10 @@ async def test_macl_handling(self): root = self._create_minimal_dt(device_type_id=root_node_id) nim = self._create_minimal_dt(device_type_id=nim_id) self.endpoints_tlv = {0: root, 1: nim} + + root_no_tlv = self._create_minimal_dt(device_type_id=root_node_id, is_tlv_endpoint=False) + nim_no_tlv = self._create_minimal_dt(device_type_id=nim_id, is_tlv_endpoint=False) + self.endpoints = {0: root_no_tlv, 1: nim_no_tlv} asserts.assert_true(self._has_device_type_supporting_macl(), "Did not find supported device in generated device") success, problems = self.check_conformance(ignore_in_progress=False, is_ci=False, allow_provisional=True) @@ -233,7 +267,7 @@ async def test_macl_handling(self): asserts.assert_true(success, "Unexpected failure with NIM and MACL") # A MACL is not allowed when there is no NIM - self.endpoints_tlv[1] = self._create_minimal_dt(device_type_id=on_off_id) + self.endpoints[1] = self._create_minimal_dt(device_type_id=on_off_id, is_tlv_endpoint=False) success, problems = self.check_conformance(ignore_in_progress=False, is_ci=False, allow_provisional=True) self.problems.extend(problems) asserts.assert_false(success, "Unexpected success with On/Off and MACL") diff --git a/src/python_testing/TestInvokeReturnCodes.py b/src/python_testing/TestInvokeReturnCodes.py new file mode 100644 index 00000000000000..cd01f8882338c4 --- /dev/null +++ b/src/python_testing/TestInvokeReturnCodes.py @@ -0,0 +1,81 @@ +# +# Copyright (c) 2025 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. +# + +# === BEGIN CI TEST ARGUMENTS === +# test-runner-runs: +# run1: +# app: ${ALL_CLUSTERS_APP} +# app-args: > +# --discriminator 1234 +# --KVS kvs1 +# --trace-to json:${TRACE_APP}.json +# script-args: > +# --storage-path admin_storage.json +# --commissioning-method on-network +# --discriminator 1234 +# --passcode 20202021 +# --trace-to json:${TRACE_TEST_JSON}.json +# --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto +# factory-reset: true +# quiet: true +# === END CI TEST ARGUMENTS === + +import chip.clusters as Clusters +from chip.interaction_model import InteractionModelError, Status +from chip.testing.matter_testing import MatterBaseTest, async_test_body, default_matter_test_main +from mobly import asserts + + +class TestInvokeReturnCodes(MatterBaseTest): + """ + Validates that the invoke action correctly refuses commands + on invalid endpoints. + """ + + @async_test_body + async def test_invalid_endpoint_command(self): + self.print_step(0, "Commissioning - already done") + + self.print_step(1, "Find an invalid endpoint id") + root_parts = await self.read_single_attribute_check_success( + cluster=Clusters.Descriptor, + attribute=Clusters.Descriptor.Attributes.PartsList, + endpoint=0, + ) + endpoints = set(root_parts) + invalid_endpoint_id = 1 + while invalid_endpoint_id in endpoints: + invalid_endpoint_id += 1 + + self.print_step( + 2, + "Attempt to invoke SoftwareDiagnostics::ResetWatermarks on an invalid endpoint", + ) + try: + await self.send_single_cmd( + cmd=Clusters.SoftwareDiagnostics.Commands.ResetWatermarks(), + endpoint=invalid_endpoint_id, + ) + asserts.fail("Unexpected command success on an invalid endpoint") + except InteractionModelError as e: + asserts.assert_equal( + e.status, Status.UnsupportedEndpoint, "Unexpected error returned" + ) + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/TestSpecParsingDeviceType.py b/src/python_testing/TestSpecParsingDeviceType.py index 6101ceb4cf7b97..fe1e8efd822a21 100644 --- a/src/python_testing/TestSpecParsingDeviceType.py +++ b/src/python_testing/TestSpecParsingDeviceType.py @@ -249,11 +249,13 @@ def test_disallowed_cluster(self): def test_spec_files(self): one_three, _ = build_xml_device_types(PrebuiltDataModelDirectory.k1_3) one_four, one_four_problems = build_xml_device_types(PrebuiltDataModelDirectory.k1_4) + one_four_one, one_four_one_problems = build_xml_device_types(PrebuiltDataModelDirectory.k1_4_1) tot, tot_problems = build_xml_device_types(PrebuiltDataModelDirectory.kMaster) # 1.3 has a couple of problems related to proxy clusters and a random file from the DM editor. # Some of these should be fixed with the move to alchemy. For now, let's just make sure 1.4 # and the current pull don't introduce NEW problems. asserts.assert_equal(len(one_four_problems), 0, "Problems found when parsing 1.4 spec") + asserts.assert_equal(len(one_four_one_problems), 0, "Problems found when parsing 1.4.1 spec") # TOT has a bunch of problems related to IDs being allocated for closures and TBR. These should all # mention ID-TBD as the id, so let's pull those out for now and make sure there are no UNKNOWN problems. filtered_tot_problems = [p for p in tot_problems if 'ID-TBD' not in p.problem] @@ -265,6 +267,8 @@ def test_spec_files(self): 0, "Master dir does not contain any device types not in 1.4") asserts.assert_greater(len(set(one_four.keys()) - set(one_three.keys())), 0, "1.4 dir does not contain any clusters not in 1.3") + asserts.assert_equal(len(one_four.keys()), len(one_four_one.keys()), + "Number of device types in 1.4 and 1.4.1 does not match") asserts.assert_equal(set(one_three.keys()) - set(one_four.keys()), set(), "There are some 1.3 device types that are unexpectedly not included in the 1.4 spec") asserts.assert_equal(set(one_four.keys())-set(tot.keys()), diff --git a/src/python_testing/TestSpecParsingSupport.py b/src/python_testing/TestSpecParsingSupport.py index d16662bbbf6669..5033e1babefa66 100644 --- a/src/python_testing/TestSpecParsingSupport.py +++ b/src/python_testing/TestSpecParsingSupport.py @@ -260,13 +260,21 @@ def test_build_xml_override(self): # checks that the 1.3 spec (default) does not contain in-progress clusters and the TOT does tot_xml_clusters, problems = build_xml_clusters(PrebuiltDataModelDirectory.kMaster) one_three_clusters, problems = build_xml_clusters(PrebuiltDataModelDirectory.k1_3) - one_four_clusters, problems = build_xml_clusters(PrebuiltDataModelDirectory.k1_4) + one_four_clusters, one_four_problems = build_xml_clusters(PrebuiltDataModelDirectory.k1_4) + one_four_one_clusters, one_four_one_problems = build_xml_clusters(PrebuiltDataModelDirectory.k1_4_1) + + # We know 1.4 and 1.4.1 are clear of errors, ensure it stays that way. + asserts.assert_equal(len(one_four_problems), 0, "Unexpected problems found on 1.4 cluster parsing") + asserts.assert_equal(len(one_four_one_problems), 0, "Unexpected problems found on 1.4.1 cluster parsing") + asserts.assert_greater(len(set(tot_xml_clusters.keys()) - set(one_three_clusters.keys())), 0, "Master dir does not contain any clusters not in 1.3") asserts.assert_greater(len(set(tot_xml_clusters.keys()) - set(one_four_clusters.keys())), 0, "Master dir does not contain any clusters not in 1.4") asserts.assert_greater(len(set(one_four_clusters.keys()) - set(one_three_clusters.keys())), 0, "1.4 dir does not contain any clusters not in 1.3") + asserts.assert_equal(len(one_four_clusters.keys()), len(one_four_one_clusters.keys()), + "1.4 and 1.4.1 do not contain the same clusters") # only the pulse width modulation cluster was removed post 1.3 one_four_removed = set([Clusters.PulseWidthModulation.id]) asserts.assert_equal(set(one_three_clusters.keys()) - set(one_four_clusters.keys()), diff --git a/src/python_testing/TestWriteReadOnlyAttributes.py b/src/python_testing/TestWriteReadOnlyAttributes.py new file mode 100644 index 00000000000000..71abbc5e6e6739 --- /dev/null +++ b/src/python_testing/TestWriteReadOnlyAttributes.py @@ -0,0 +1,115 @@ +# +# Copyright (c) 2025 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. +# + +# See https://github.com/project-chip/connectedhomeip/blob/master/docs/testing/python.md#defining-the-ci-test-arguments +# for details about the block below. +# +# === BEGIN CI TEST ARGUMENTS === +# test-runner-runs: +# run1: +# app: ${ALL_CLUSTERS_APP} +# app-args: --discriminator 1234 --KVS kvs1 --trace-to json:${TRACE_APP}.json +# script-args: > +# --storage-path admin_storage.json +# --commissioning-method on-network +# --discriminator 1234 +# --passcode 20202021 +# --endpoint 1 +# --PICS src/app/tests/suites/certification/ci-pics-values +# --trace-to json:${TRACE_TEST_JSON}.json +# --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto +# factory-reset: true +# quiet: true +# === END CI TEST ARGUMENTS === + +import logging +from typing import cast + +import chip.clusters as Clusters +from chip.interaction_model import Status +from chip.testing.matter_testing import MatterBaseTest, async_test_body, default_matter_test_main +from mobly import asserts + +logger = logging.getLogger(__name__) + + +class TestWriteReadOnlyAttributes(MatterBaseTest): + + @async_test_body + async def test_invalid_endpoint_command(self): + self.print_step(0, "Commissioning - already done") + + self.print_step(1, "Find an invalid endpoint id") + root_parts = cast( + list[int], + await self.read_single_attribute_check_success( + cluster=Clusters.Descriptor, + attribute=Clusters.Descriptor.Attributes.PartsList, + endpoint=0, + ), + ) + endpoints = set(root_parts) + invalid_endpoint_id = 1 + while invalid_endpoint_id in endpoints: + invalid_endpoint_id += 1 + non_root_endpoint = endpoints.pop() + + # The test assumes the following known ids: + # invalid_endpoint_id - is NOT a valid endpoint in general + # non_root_endpoint - a VALID endpoint id, but it is not Endpoint0 + # In particular, root endpoint clusters should not exist there + # like AccessControl. So `non_root_endpoint/AccessControl::ClusterRevision/attributeList/...` is + # a invalid ReadOnly path + read_only_attributes = [ + Clusters.AccessControl.Attributes.ClusterRevision(123), + Clusters.AccessControl.Attributes.AcceptedCommandList([1, 2, 3]), + Clusters.AccessControl.Attributes.GeneratedCommandList([2, 3]), + Clusters.AccessControl.Attributes.AttributeList([100, 200]), + ] + + self.print_step(2, "Write read only attributes on a VALID cluster") + for attr in read_only_attributes: + asserts.assert_equal( + await self.write_single_attribute( + attr, endpoint_id=0, expect_success=False + ), + Status.UnsupportedWrite, + ) + + self.print_step( + 3, "Write read only attributes on a Invalid cluster for that endpoint" + ) + for attr in read_only_attributes: + asserts.assert_equal( + await self.write_single_attribute( + attr, endpoint_id=non_root_endpoint, expect_success=False + ), + Status.UnsupportedCluster, + ) + + self.print_step(4, "Write read only attributes on a Invalid endpoint") + for attr in read_only_attributes: + asserts.assert_equal( + await self.write_single_attribute( + attr, endpoint_id=invalid_endpoint_id, expect_success=False + ), + Status.UnsupportedEndpoint, + ) + + +if __name__ == "__main__": + default_matter_test_main() diff --git a/src/python_testing/matter_testing_infrastructure/BUILD.gn b/src/python_testing/matter_testing_infrastructure/BUILD.gn index 28269a3df1fbed..f4d92e9496215c 100644 --- a/src/python_testing/matter_testing_infrastructure/BUILD.gn +++ b/src/python_testing/matter_testing_infrastructure/BUILD.gn @@ -18,6 +18,7 @@ import("//build_overrides/pigweed.gni") import("//src/python_testing/matter_testing_infrastructure/data_model_xmls.gni") import("$dir_pw_build/python.gni") import("$dir_pw_build/python_dist.gni") +import("$dir_pw_build/zip.gni") pw_python_package("chip-testing-module") { generate_setup = { @@ -55,19 +56,63 @@ pw_python_package("chip-testing-module") { ] } +pw_zip("data_model_zip_1_3") { + inputs = [] + foreach(file, data_model_XMLS_1_3) { + zip_path = rebase_path(file, "${chip_root}/data_model/1.3/", "/") + inputs += [ "${file} > /${zip_path}" ] + } + output = "${root_out_dir}/data_model/zip_1_3.zip" +} + +pw_zip("data_model_zip_1_4") { + inputs = [] + foreach(file, data_model_XMLS_1_4) { + zip_path = rebase_path(file, "${chip_root}/data_model/1.4/", "/") + inputs += [ "${file} > /${zip_path}" ] + } + output = "${root_out_dir}/data_model/zip_1_4.zip" +} + +pw_zip("data_model_zip_1_4_1") { + inputs = [] + foreach(file, data_model_XMLS_1_4_1) { + zip_path = rebase_path(file, "${chip_root}/data_model/1.4.1/", "/") + inputs += [ "${file} > /${zip_path}" ] + } + output = "${root_out_dir}/data_model/zip_1_4_1.zip" +} + +pw_zip("data_model_zip_master") { + inputs = [] + foreach(file, data_model_XMLS_master) { + zip_path = rebase_path(file, "${chip_root}/data_model/master/", "/") + inputs += [ "${file} > /${zip_path}" ] + } + output = "${root_out_dir}/data_model/zip_master.zip" +} + pw_python_distribution("chip-testing") { packages = [ ":chip-testing-module" ] generate_setup_cfg = { name = "chip-testing" - version = "1.4.0" + version = "1.4.1" include_default_pyproject_file = true include_extra_files_in_package_data = true } - # Use the imported data_model_XMLS directly - extra_files = [] - foreach(file, data_model_XMLS) { - extra_files += [ "${file} > chip/testing/${file}" ] - } + public_deps = [ + ":data_model_zip_1_3", + ":data_model_zip_1_4", + ":data_model_zip_1_4_1", + ":data_model_zip_master", + ] + + extra_files = [ + "${root_out_dir}/data_model/zip_1_3.zip > chip/testing/data_model/1.3/allfiles.zip", + "${root_out_dir}/data_model/zip_1_4.zip > chip/testing/data_model/1.4/allfiles.zip", + "${root_out_dir}/data_model/zip_1_4_1.zip > chip/testing/data_model/1.4.1/allfiles.zip", + "${root_out_dir}/data_model/zip_master.zip > chip/testing/data_model/master/allfiles.zip", + ] } diff --git a/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py b/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py index 0f19bcc154d62b..5b43ca8705bf72 100644 --- a/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py +++ b/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py @@ -20,6 +20,7 @@ import logging import typing import xml.etree.ElementTree as ElementTree +import zipfile from copy import deepcopy from dataclasses import dataclass from enum import Enum, auto @@ -539,6 +540,7 @@ def check_clusters_for_unknown_commands(clusters: dict[uint, XmlCluster], proble class PrebuiltDataModelDirectory(Enum): k1_3 = auto() k1_4 = auto() + k1_4_1 = auto() kMaster = auto() @property @@ -547,6 +549,8 @@ def dirname(self): return "1.3" if self == PrebuiltDataModelDirectory.k1_4: return "1.4" + if self == PrebuiltDataModelDirectory.k1_4_1: + return "1.4.1" if self == PrebuiltDataModelDirectory.kMaster: return "master" raise KeyError("Invalid enum: %r" % self) @@ -577,11 +581,14 @@ def get_data_model_directory(data_model_directory: Union[PrebuiltDataModelDirect return data_model_directory # If it's a prebuilt directory, build the path based on the version and data model level - return pkg_resources.files(importlib.import_module('chip.testing')).joinpath( - 'data_model').joinpath(data_model_directory.dirname).joinpath(data_model_level.dirname) + zip_path = pkg_resources.files(importlib.import_module('chip.testing')).joinpath( + 'data_model').joinpath(data_model_directory.dirname).joinpath('allfiles.zip') + path = zipfile.Path(zip_path) + return path.joinpath(data_model_level.dirname) -def build_xml_clusters(data_model_directory: Union[PrebuiltDataModelDirectory, Traversable] = PrebuiltDataModelDirectory.k1_4) -> typing.Tuple[dict[uint, XmlCluster], list[ProblemNotice]]: + +def build_xml_clusters(data_model_directory: Union[PrebuiltDataModelDirectory, Traversable] = PrebuiltDataModelDirectory.k1_4_1) -> typing.Tuple[dict[uint, XmlCluster], list[ProblemNotice]]: """ Build XML clusters from the specified data model directory. This function supports both pre-built locations and full paths. @@ -856,7 +863,7 @@ def parse_single_device_type(root: ElementTree.Element) -> tuple[dict[int, XmlDe return device_types, problems -def build_xml_device_types(data_model_directory: typing.Union[PrebuiltDataModelDirectory, Traversable] = PrebuiltDataModelDirectory.k1_4) -> tuple[dict[int, XmlDeviceType], list[ProblemNotice]]: +def build_xml_device_types(data_model_directory: typing.Union[PrebuiltDataModelDirectory, Traversable] = PrebuiltDataModelDirectory.k1_4_1) -> tuple[dict[int, XmlDeviceType], list[ProblemNotice]]: top = get_data_model_directory(data_model_directory, DataModelLevel.kDeviceType) device_types: dict[int, XmlDeviceType] = {} problems: list[ProblemNotice] = [] diff --git a/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni b/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni index a1db224506033e..d9b0fc256e6159 100644 --- a/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni +++ b/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni @@ -11,10 +11,15 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +# +# This file is generated by +# src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py +# +# Manually re-generate this file on any changes to the data_model directory. import("//build_overrides/chip.gni") -data_model_XMLS = [ +data_model_XMLS_1_3 = [ "${chip_root}/data_model/1.3/clusters/ACL-Cluster.xml", "${chip_root}/data_model/1.3/clusters/AccountLogin.xml", "${chip_root}/data_model/1.3/clusters/AdminCommissioningCluster.xml", @@ -116,7 +121,6 @@ data_model_XMLS = [ "${chip_root}/data_model/1.3/clusters/WindowCovering.xml", "${chip_root}/data_model/1.3/clusters/bridge-clusters-ActionsCluster.xml", "${chip_root}/data_model/1.3/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml", - "${chip_root}/data_model/1.3/clusters/cluster_ids.json", "${chip_root}/data_model/1.3/device_types/Aggregator.xml", "${chip_root}/data_model/1.3/device_types/AirPurifier.xml", "${chip_root}/data_model/1.3/device_types/AirQualitySensor.xml", @@ -180,6 +184,9 @@ data_model_XMLS = [ "${chip_root}/data_model/1.3/device_types/WaterValve.xml", "${chip_root}/data_model/1.3/device_types/WindowCovering.xml", "${chip_root}/data_model/1.3/device_types/WindowCoveringController.xml", +] + +data_model_XMLS_1_4 = [ "${chip_root}/data_model/1.4/clusters/ACL-Cluster.xml", "${chip_root}/data_model/1.4/clusters/AccountLogin.xml", "${chip_root}/data_model/1.4/clusters/AdminCommissioningCluster.xml", @@ -291,7 +298,6 @@ data_model_XMLS = [ "${chip_root}/data_model/1.4/clusters/WindowCovering.xml", "${chip_root}/data_model/1.4/clusters/bridge-clusters-ActionsCluster.xml", "${chip_root}/data_model/1.4/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml", - "${chip_root}/data_model/1.4/clusters/cluster_ids.json", "${chip_root}/data_model/1.4/device_types/Aggregator.xml", "${chip_root}/data_model/1.4/device_types/AirPurifier.xml", "${chip_root}/data_model/1.4/device_types/AirQualitySensor.xml", @@ -365,6 +371,196 @@ data_model_XMLS = [ "${chip_root}/data_model/1.4/device_types/WaterValve.xml", "${chip_root}/data_model/1.4/device_types/WindowCovering.xml", "${chip_root}/data_model/1.4/device_types/WindowCoveringController.xml", +] + +data_model_XMLS_1_4_1 = [ + "${chip_root}/data_model/1.4.1/clusters/ACL-Cluster.xml", + "${chip_root}/data_model/1.4.1/clusters/AccountLogin.xml", + "${chip_root}/data_model/1.4.1/clusters/AdminCommissioningCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/AirQuality.xml", + "${chip_root}/data_model/1.4.1/clusters/AlarmBase.xml", + "${chip_root}/data_model/1.4.1/clusters/ApplicationBasic.xml", + "${chip_root}/data_model/1.4.1/clusters/ApplicationLauncher.xml", + "${chip_root}/data_model/1.4.1/clusters/AudioOutput.xml", + "${chip_root}/data_model/1.4.1/clusters/BallastConfiguration.xml", + "${chip_root}/data_model/1.4.1/clusters/BasicInformationCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/Binding-Cluster.xml", + "${chip_root}/data_model/1.4.1/clusters/BooleanState.xml", + "${chip_root}/data_model/1.4.1/clusters/BooleanStateConfiguration.xml", + "${chip_root}/data_model/1.4.1/clusters/Channel.xml", + "${chip_root}/data_model/1.4.1/clusters/ColorControl.xml", + "${chip_root}/data_model/1.4.1/clusters/CommissionerControlCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/ConcentrationMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/ContentAppObserver.xml", + "${chip_root}/data_model/1.4.1/clusters/ContentControl.xml", + "${chip_root}/data_model/1.4.1/clusters/ContentLauncher.xml", + "${chip_root}/data_model/1.4.1/clusters/Descriptor-Cluster.xml", + "${chip_root}/data_model/1.4.1/clusters/DeviceEnergyManagement.xml", + "${chip_root}/data_model/1.4.1/clusters/DiagnosticLogsCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/DiagnosticsEthernet.xml", + "${chip_root}/data_model/1.4.1/clusters/DiagnosticsGeneral.xml", + "${chip_root}/data_model/1.4.1/clusters/DiagnosticsSoftware.xml", + "${chip_root}/data_model/1.4.1/clusters/DiagnosticsThread.xml", + "${chip_root}/data_model/1.4.1/clusters/DiagnosticsWiFi.xml", + "${chip_root}/data_model/1.4.1/clusters/DishwasherAlarm.xml", + "${chip_root}/data_model/1.4.1/clusters/DoorLock.xml", + "${chip_root}/data_model/1.4.1/clusters/EcosystemInformationCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/ElectricalEnergyMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/ElectricalPowerMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/EnergyEVSE.xml", + "${chip_root}/data_model/1.4.1/clusters/EnergyPreference.xml", + "${chip_root}/data_model/1.4.1/clusters/FanControl.xml", + "${chip_root}/data_model/1.4.1/clusters/FlowMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/GeneralCommissioningCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/Group-Key-Management-Cluster.xml", + "${chip_root}/data_model/1.4.1/clusters/Groups.xml", + "${chip_root}/data_model/1.4.1/clusters/ICDManagement.xml", + "${chip_root}/data_model/1.4.1/clusters/Identify.xml", + "${chip_root}/data_model/1.4.1/clusters/IlluminanceMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/JointFabricDatastoreCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/JointFabricPKICluster.xml", + "${chip_root}/data_model/1.4.1/clusters/KeypadInput.xml", + "${chip_root}/data_model/1.4.1/clusters/Label-Cluster-FixedLabelCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/Label-Cluster-LabelCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/Label-Cluster-UserLabelCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/LaundryDryerControls.xml", + "${chip_root}/data_model/1.4.1/clusters/LaundryWasherControls.xml", + "${chip_root}/data_model/1.4.1/clusters/LevelControl.xml", + "${chip_root}/data_model/1.4.1/clusters/LocalizationConfiguration.xml", + "${chip_root}/data_model/1.4.1/clusters/LocalizationTimeFormat.xml", + "${chip_root}/data_model/1.4.1/clusters/LocalizationUnit.xml", + "${chip_root}/data_model/1.4.1/clusters/LowPower.xml", + "${chip_root}/data_model/1.4.1/clusters/MediaInput.xml", + "${chip_root}/data_model/1.4.1/clusters/MediaPlayback.xml", + "${chip_root}/data_model/1.4.1/clusters/Messages.xml", + "${chip_root}/data_model/1.4.1/clusters/MicrowaveOvenControl.xml", + "${chip_root}/data_model/1.4.1/clusters/ModeBase.xml", + "${chip_root}/data_model/1.4.1/clusters/ModeSelect.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_DeviceEnergyManagement.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_Dishwasher.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_EVSE.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_LaundryWasher.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_MicrowaveOven.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_Oven.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_RVCClean.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_RVCRun.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_Refrigerator.xml", + "${chip_root}/data_model/1.4.1/clusters/Mode_WaterHeater.xml", + "${chip_root}/data_model/1.4.1/clusters/NetworkCommissioningCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/OTAProvider.xml", + "${chip_root}/data_model/1.4.1/clusters/OTARequestor.xml", + "${chip_root}/data_model/1.4.1/clusters/OccupancySensing.xml", + "${chip_root}/data_model/1.4.1/clusters/OnOff.xml", + "${chip_root}/data_model/1.4.1/clusters/OperationalCredentialCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/OperationalState.xml", + "${chip_root}/data_model/1.4.1/clusters/OperationalState_Oven.xml", + "${chip_root}/data_model/1.4.1/clusters/OperationalState_RVC.xml", + "${chip_root}/data_model/1.4.1/clusters/PowerSourceCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/PowerSourceConfigurationCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/PowerTopology.xml", + "${chip_root}/data_model/1.4.1/clusters/PressureMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/ProxyConfiguration-Cluster.xml", + "${chip_root}/data_model/1.4.1/clusters/ProxyDiscovery-Cluster.xml", + "${chip_root}/data_model/1.4.1/clusters/PumpConfigurationControl.xml", + "${chip_root}/data_model/1.4.1/clusters/RefrigeratorAlarm.xml", + "${chip_root}/data_model/1.4.1/clusters/ResourceMonitoring.xml", + "${chip_root}/data_model/1.4.1/clusters/Scenes.xml", + "${chip_root}/data_model/1.4.1/clusters/ServiceArea.xml", + "${chip_root}/data_model/1.4.1/clusters/SmokeCOAlarm.xml", + "${chip_root}/data_model/1.4.1/clusters/Switch.xml", + "${chip_root}/data_model/1.4.1/clusters/TargetNavigator.xml", + "${chip_root}/data_model/1.4.1/clusters/TemperatureControl.xml", + "${chip_root}/data_model/1.4.1/clusters/TemperatureMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/Thermostat.xml", + "${chip_root}/data_model/1.4.1/clusters/ThermostatUserInterfaceConfiguration.xml", + "${chip_root}/data_model/1.4.1/clusters/ThreadBorderRouterManagement.xml", + "${chip_root}/data_model/1.4.1/clusters/ThreadNetworkDirectory.xml", + "${chip_root}/data_model/1.4.1/clusters/TimeSync.xml", + "${chip_root}/data_model/1.4.1/clusters/ValidProxies-Cluster.xml", + "${chip_root}/data_model/1.4.1/clusters/ValveConfigurationControl.xml", + "${chip_root}/data_model/1.4.1/clusters/WakeOnLAN.xml", + "${chip_root}/data_model/1.4.1/clusters/WaterContentMeasurement.xml", + "${chip_root}/data_model/1.4.1/clusters/WaterHeaterManagement.xml", + "${chip_root}/data_model/1.4.1/clusters/WiFiNetworkManagement.xml", + "${chip_root}/data_model/1.4.1/clusters/WindowCovering.xml", + "${chip_root}/data_model/1.4.1/clusters/bridge-clusters-ActionsCluster.xml", + "${chip_root}/data_model/1.4.1/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml", + "${chip_root}/data_model/1.4.1/device_types/Aggregator.xml", + "${chip_root}/data_model/1.4.1/device_types/AirPurifier.xml", + "${chip_root}/data_model/1.4.1/device_types/AirQualitySensor.xml", + "${chip_root}/data_model/1.4.1/device_types/BaseDeviceType.xml", + "${chip_root}/data_model/1.4.1/device_types/BasicVideoPlayer.xml", + "${chip_root}/data_model/1.4.1/device_types/BatteryStorage.xml", + "${chip_root}/data_model/1.4.1/device_types/BridgedNode.xml", + "${chip_root}/data_model/1.4.1/device_types/CastingVideoClient.xml", + "${chip_root}/data_model/1.4.1/device_types/CastingVideoPlayer.xml", + "${chip_root}/data_model/1.4.1/device_types/ColorDimmerSwitch.xml", + "${chip_root}/data_model/1.4.1/device_types/ColorTemperatureLight.xml", + "${chip_root}/data_model/1.4.1/device_types/ContactSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/ContentApp.xml", + "${chip_root}/data_model/1.4.1/device_types/ControlBridge.xml", + "${chip_root}/data_model/1.4.1/device_types/CookSurface.xml", + "${chip_root}/data_model/1.4.1/device_types/Cooktop.xml", + "${chip_root}/data_model/1.4.1/device_types/DeviceEnergyManagement.xml", + "${chip_root}/data_model/1.4.1/device_types/DimmableLight.xml", + "${chip_root}/data_model/1.4.1/device_types/DimmablePlug-InUnit.xml", + "${chip_root}/data_model/1.4.1/device_types/DimmerSwitch.xml", + "${chip_root}/data_model/1.4.1/device_types/Dishwasher.xml", + "${chip_root}/data_model/1.4.1/device_types/DoorLock.xml", + "${chip_root}/data_model/1.4.1/device_types/DoorLockController.xml", + "${chip_root}/data_model/1.4.1/device_types/EVSE.xml", + "${chip_root}/data_model/1.4.1/device_types/ElectricalSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/ExtendedColorLight.xml", + "${chip_root}/data_model/1.4.1/device_types/ExtractorHood.xml", + "${chip_root}/data_model/1.4.1/device_types/Fan.xml", + "${chip_root}/data_model/1.4.1/device_types/FlowSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/GenericSwitch.xml", + "${chip_root}/data_model/1.4.1/device_types/HeatPump.xml", + "${chip_root}/data_model/1.4.1/device_types/HumiditySensor.xml", + "${chip_root}/data_model/1.4.1/device_types/JointFabricAdmin.xml", + "${chip_root}/data_model/1.4.1/device_types/LaundryDryer.xml", + "${chip_root}/data_model/1.4.1/device_types/LaundryWasher.xml", + "${chip_root}/data_model/1.4.1/device_types/LightSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/MicrowaveOven.xml", + "${chip_root}/data_model/1.4.1/device_types/ModeSelectDeviceType.xml", + "${chip_root}/data_model/1.4.1/device_types/MountedDimmableLoadControl.xml", + "${chip_root}/data_model/1.4.1/device_types/MountedOnOffControl.xml", + "${chip_root}/data_model/1.4.1/device_types/NetworkInfraManager.xml", + "${chip_root}/data_model/1.4.1/device_types/OccupancySensor.xml", + "${chip_root}/data_model/1.4.1/device_types/OnOffLight.xml", + "${chip_root}/data_model/1.4.1/device_types/OnOffLightSwitch.xml", + "${chip_root}/data_model/1.4.1/device_types/OnOffPlug-inUnit.xml", + "${chip_root}/data_model/1.4.1/device_types/OnOffSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/OtaProvider.xml", + "${chip_root}/data_model/1.4.1/device_types/OtaRequestor.xml", + "${chip_root}/data_model/1.4.1/device_types/Oven.xml", + "${chip_root}/data_model/1.4.1/device_types/PowerSource.xml", + "${chip_root}/data_model/1.4.1/device_types/PressureSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/Pump.xml", + "${chip_root}/data_model/1.4.1/device_types/PumpController.xml", + "${chip_root}/data_model/1.4.1/device_types/RainSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/Refrigerator.xml", + "${chip_root}/data_model/1.4.1/device_types/RoboticVacuumCleaner.xml", + "${chip_root}/data_model/1.4.1/device_types/RoomAirConditioner.xml", + "${chip_root}/data_model/1.4.1/device_types/RootNodeDeviceType.xml", + "${chip_root}/data_model/1.4.1/device_types/SecondaryNetworkInterface.xml", + "${chip_root}/data_model/1.4.1/device_types/SmokeCOAlarm.xml", + "${chip_root}/data_model/1.4.1/device_types/SolarPower.xml", + "${chip_root}/data_model/1.4.1/device_types/Speaker.xml", + "${chip_root}/data_model/1.4.1/device_types/TemperatureControlledCabinet.xml", + "${chip_root}/data_model/1.4.1/device_types/TemperatureSensor.xml", + "${chip_root}/data_model/1.4.1/device_types/Thermostat.xml", + "${chip_root}/data_model/1.4.1/device_types/ThreadBorderRouter.xml", + "${chip_root}/data_model/1.4.1/device_types/VideoRemoteControl.xml", + "${chip_root}/data_model/1.4.1/device_types/WaterFreezeDetector.xml", + "${chip_root}/data_model/1.4.1/device_types/WaterHeater.xml", + "${chip_root}/data_model/1.4.1/device_types/WaterLeakDetector.xml", + "${chip_root}/data_model/1.4.1/device_types/WaterValve.xml", + "${chip_root}/data_model/1.4.1/device_types/WindowCovering.xml", + "${chip_root}/data_model/1.4.1/device_types/WindowCoveringController.xml", +] + +data_model_XMLS_master = [ "${chip_root}/data_model/master/clusters/ACL-Cluster.xml", "${chip_root}/data_model/master/clusters/AccountLogin.xml", "${chip_root}/data_model/master/clusters/AdminCommissioningCluster.xml", @@ -489,7 +685,6 @@ data_model_XMLS = [ "${chip_root}/data_model/master/clusters/ZoneManagement.xml", "${chip_root}/data_model/master/clusters/bridge-clusters-ActionsCluster.xml", "${chip_root}/data_model/master/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml", - "${chip_root}/data_model/master/clusters/cluster_ids.json", "${chip_root}/data_model/master/device_types/Aggregator.xml", "${chip_root}/data_model/master/device_types/AirPurifier.xml", "${chip_root}/data_model/master/device_types/AirQualitySensor.xml", diff --git a/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py b/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py index 76179797f5fe8c..470913b33afc15 100644 --- a/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py +++ b/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py @@ -13,8 +13,8 @@ # limitations under the License. """ -Generates a gni file containing all data_model files (generally XML and JSON files) -that are typically used by matter_testing_infrastructure. +Generates a gni file containing all data_model files (XML) +that are used by matter_testing_infrastructure. These files are to be bundled with whl packages of the matter_testing_infrastructure so that methods requiring data model files work just by installing the python @@ -26,19 +26,10 @@ # Set chip_root to be dynamically based on the script's location chip_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) - -# Directories to search for .xml and .json files relative to chip_root -directories = [ - os.path.join(chip_root, "data_model/1.3/clusters/"), - os.path.join(chip_root, "data_model/1.3/device_types/"), - os.path.join(chip_root, "data_model/1.4/clusters/"), - os.path.join(chip_root, "data_model/1.4/device_types/"), - os.path.join(chip_root, "data_model/master/clusters/"), - os.path.join(chip_root, "data_model/master/device_types/"), -] +data_model_dir = os.path.join(chip_root, "data_model") # Template for generating the GNI file content with proper indentation -GNI_TEMPLATE = """\ +GNI_HEADER = """\ # Copyright (c) 2024 Project CHIP Authors # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -52,43 +43,54 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +# +# This file is generated by +# src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py +# +# Manually re-generate this file on any changes to the data_model directory. import("//build_overrides/chip.gni") +""" + +GNI_TEMPLATE = """\ -data_model_XMLS = [ +data_model_XMLS_{{ dir }} = [ {% for name in file_list %} - "{{ name }}", + "{{ name }}", {% endfor %} ] -""" -# Function to find and collect all .xml and .json files +""" -def get_data_model_file_names(): +def get_data_model_file_names(directory: str): + ''' Function to find and collect all .xml files''' file_list = [] - for directory in directories: - for root, _, files in os.walk(directory): - for file in files: - if file.endswith(".xml") or file.endswith(".json"): - # Replace absolute path with `${chip_root}` for GNI compatibility - relative_path = os.path.join("${chip_root}", os.path.relpath(root, chip_root), file) - file_list.append(relative_path) + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(".xml"): + # Replace absolute path with `${chip_root}` for GNI compatibility + relative_path = os.path.join("${chip_root}", os.path.relpath(root, chip_root), file) + file_list.append(relative_path) # Sort files alphabetically file_list.sort() return file_list -# Main function to generate the data_model_xmls.gni file - def generate_gni_file(): - # Step 1: Find all files and create the sorted file list - file_list = get_data_model_file_names() - - # Step 2: Render the template with the file list + '''Main function to generate the data_model_xmls.gni file''' environment = jinja2.Environment(trim_blocks=True, lstrip_blocks=True) template = environment.from_string(GNI_TEMPLATE) - output_content = template.render(file_list=file_list) + output_content_per_dir = [] + + # Step 1: Find all files and create the sorted file list + dirs = sorted([d for d in os.listdir(data_model_dir) if os.path.isdir(os.path.join(data_model_dir, d))]) + for directory in dirs: + file_list = get_data_model_file_names(os.path.join(data_model_dir, directory)) + # Step 2: Render the template with the file list + output_content_per_dir.append(template.render(dir=directory.replace('.', '_'), file_list=file_list)) + + output_content = GNI_HEADER + "".join(output_content_per_dir) # Step 3: Dynamically generate the output file path # Get the script's directory (where this script is located) diff --git a/src/python_testing/mdns_discovery/mdns_discovery.py b/src/python_testing/mdns_discovery/mdns_discovery.py index 2d7337b622a536..1261ab3a578059 100644 --- a/src/python_testing/mdns_discovery/mdns_discovery.py +++ b/src/python_testing/mdns_discovery/mdns_discovery.py @@ -439,8 +439,8 @@ async def _query_service_info(self, zeroconf: Zeroconf, service_type: str, servi """ # Get service info service_info = AsyncServiceInfo(service_type, service_name) - is_service_discovered = await service_info.async_request(zeroconf, 3000) service_info.async_clear_cache() + is_service_discovered = await service_info.async_request(zeroconf, 3000) if is_service_discovered: if self._verbose_logging: diff --git a/src/system/tests/TestEventLoopHandler.cpp b/src/system/tests/TestEventLoopHandler.cpp index d1de96ac94c6b2..85d0b55511adb9 100644 --- a/src/system/tests/TestEventLoopHandler.cpp +++ b/src/system/tests/TestEventLoopHandler.cpp @@ -109,7 +109,12 @@ TEST_F(TestEventLoopHandler, EventLoopHandlerSequence) }); chip::DeviceLayer::PlatformMgr().RunEventLoop(); + +#if CHIP_SYSTEM_CONFIG_POSIX_LOCKING EXPECT_EQ(loopHandler.trace, std::string("1AP2HP3R4")); +#else + EXPECT_EQ(loopHandler.trace, std::string("1APHP2HPHP3R4")); +#endif } TEST_F(TestEventLoopHandler, EventLoopHandlerWake) diff --git a/src/system/tests/TestSystemErrorStr.cpp b/src/system/tests/TestSystemErrorStr.cpp index 32d4870c9b40da..ed78a7b1caf533 100644 --- a/src/system/tests/TestSystemErrorStr.cpp +++ b/src/system/tests/TestSystemErrorStr.cpp @@ -69,4 +69,7 @@ TEST(TestSystemErrorStr, CheckSystemErrorStr) EXPECT_NE(strchr(errStr, ':'), nullptr); #endif // !CHIP_CONFIG_SHORT_ERROR_STR } + + // Deregister the layer error formatter + DeregisterCHIPLayerErrorFormatter(); } diff --git a/src/system/tests/TestSystemPacketBuffer.cpp b/src/system/tests/TestSystemPacketBuffer.cpp index bdfa771888bd92..b1f939d03f11c8 100644 --- a/src/system/tests/TestSystemPacketBuffer.cpp +++ b/src/system/tests/TestSystemPacketBuffer.cpp @@ -100,6 +100,9 @@ class TestSystemPacketBuffer : public ::testing::Test { chip::DeviceLayer::PlatformMgr().Shutdown(); chip::Platform::MemoryShutdown(); + + // Deregister the layer error formatter + DeregisterCHIPLayerErrorFormatter(); } void SetUp() diff --git a/src/test_driver/efr32/BUILD.gn b/src/test_driver/efr32/BUILD.gn index 1ff7a3a505c465..736e990ac9697a 100644 --- a/src/test_driver/efr32/BUILD.gn +++ b/src/test_driver/efr32/BUILD.gn @@ -18,9 +18,10 @@ import("//build_overrides/efr32_sdk.gni") import("//build_overrides/pigweed.gni") import("${build_root}/config/defaults.gni") -import("${chip_root}/src/platform/silabs/provision/args.gni") import("${silabs_sdk_build_root}/efr32_sdk.gni") +import("${matter_support_root}/provision/args.gni") + import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni") import("${chip_root}/src/platform/device.gni") @@ -96,7 +97,7 @@ source_set("efr32_test_main") { "${chip_root}/src/lib", "${chip_root}/src/lib/support:pw_tests_wrapper", "${examples_common_plat_dir}/pw_sys_io:pw_sys_io_silabs", - "${sl_provision_root}:provision-headers", + "${sl_provision_root}:headers", ] # OpenThread Settings @@ -111,7 +112,7 @@ source_set("efr32_test_main") { deps += pw_build_LINK_DEPS libs = [ - "${sdk_support_root}/matter/provision/lib/libProvision_${silabs_family}.a", + "${matter_support_root}/provision/libs/libProvision_${silabs_family}.a", ] include_dirs = [ "${chip_root}/examples/common/pigweed/efr32" ] diff --git a/src/test_driver/efr32/src/main.cpp b/src/test_driver/efr32/src/main.cpp index a2a078c4692271..cadb68d4f0d0b7 100644 --- a/src/test_driver/efr32/src/main.cpp +++ b/src/test_driver/efr32/src/main.cpp @@ -21,10 +21,10 @@ #include #include #include -#include #include #include #include +#include #include #include #include diff --git a/src/test_driver/nrfconnect/main/include/app_mbedtls_config.h b/src/test_driver/nrfconnect/main/include/app_mbedtls_config.h index b28420c41828e8..27a019808323fa 100644 --- a/src/test_driver/nrfconnect/main/include/app_mbedtls_config.h +++ b/src/test_driver/nrfconnect/main/include/app_mbedtls_config.h @@ -17,7 +17,6 @@ */ // Enable cryptographic functions needed by CHIP which can't be enabled via Kconfig -#define MBEDTLS_HKDF_C #define MBEDTLS_X509_CREATE_C #define MBEDTLS_X509_CSR_PARSE_C #define MBEDTLS_X509_CSR_WRITE_C diff --git a/src/test_driver/nrfconnect/prj.conf b/src/test_driver/nrfconnect/prj.conf index 4cbd592950d18c..a3afbbcd896849 100644 --- a/src/test_driver/nrfconnect/prj.conf +++ b/src/test_driver/nrfconnect/prj.conf @@ -44,25 +44,23 @@ CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=768 CONFIG_MBEDTLS_USER_CONFIG_ENABLE=y CONFIG_MBEDTLS_USER_CONFIG_FILE="app_mbedtls_config.h" CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR=y -CONFIG_MBEDTLS_ENTROPY_C=y -CONFIG_MBEDTLS_CTR_DRBG_ENABLED=y -CONFIG_MBEDTLS_CIPHER_CCM_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED=y -CONFIG_MBEDTLS_ECDH_C=y -CONFIG_MBEDTLS_ECDSA_C=y -CONFIG_MBEDTLS_ECP_C=y -CONFIG_MBEDTLS_PK_WRITE_C=y -CONFIG_MBEDTLS_PKCS5_C=y CONFIG_MBEDTLS_PSA_CRYPTO_C=y CONFIG_MBEDTLS_MEMORY_DEBUG=y CONFIG_MBEDTLS_DEBUG=y # PSA Crypto configuration CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y - -# Enable entropy -CONFIG_ENTROPY_GENERATOR=y +CONFIG_PSA_WANT_ALG_HMAC=y +CONFIG_PSA_WANT_ALG_HKDF=y +CONFIG_PSA_WANT_ALG_ECDSA=y +CONFIG_PSA_WANT_ALG_ECDH=y +CONFIG_PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE=y +CONFIG_PSA_WANT_KEY_TYPE_AES=y +CONFIG_PSA_WANT_ALG_CCM=y +CONFIG_PSA_WANT_ALG_ECB_NO_PADDING=y +CONFIG_PSA_WANT_ALG_SHA_1=y +CONFIG_PSA_WANT_ECC_SECP_R1_256=y # Disable OpenThread CONFIG_NET_L2_OPENTHREAD=n diff --git a/third_party/android_deps/gradle/wrapper/gradle-wrapper.properties b/third_party/android_deps/gradle/wrapper/gradle-wrapper.properties index ffed3a254e91df..2e6e5897b5285c 100644 --- a/third_party/android_deps/gradle/wrapper/gradle-wrapper.properties +++ b/third_party/android_deps/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/third_party/openthread/platforms/efr32/BUILD.gn b/third_party/openthread/platforms/efr32/BUILD.gn index 88f8f44c107e1b..9ef8422cbc188b 100644 --- a/third_party/openthread/platforms/efr32/BUILD.gn +++ b/third_party/openthread/platforms/efr32/BUILD.gn @@ -31,8 +31,8 @@ config("openthread_efr32_config") { include_dirs = [ "${sl_ot_efr32_root}", "${chip_root}/examples/platform/efr32", - "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}", - "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/config", + "${matter_support_root}/board-support/efr32/${silabs_family}/${silabs_board}", + "${matter_support_root}/board-support/efr32/${silabs_family}/${silabs_board}/config", "${sl_ot_platform_abstraction}/include", "${sl_ot_platform_abstraction}/rtos", ] @@ -74,7 +74,7 @@ source_set("libopenthread-efr32") { "${sl_ot_efr32_root}/system.c", # Temporary file until the files in the SI SDK is fixed - "${sdk_support_root}/protocol/openthread/platform-abstraction/efr32/radio.c", + "${matter_support_root}/sdk-copies/protocol/openthread/platform-abstraction/efr32/radio.c", ] include_dirs = [ "${openthread_root}/examples/platforms/utils" ] diff --git a/third_party/silabs/BUILD.gn b/third_party/silabs/BUILD.gn index b1f7b6bd5e2b78..45f81cf18c1af6 100644 --- a/third_party/silabs/BUILD.gn +++ b/third_party/silabs/BUILD.gn @@ -103,7 +103,7 @@ if (wifi_soc != true) { # CCP board include_dirs = [ "${chip_root}/examples/platform/silabs/efr32", "${chip_root}/examples/platform/silabs", - "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}", + "${matter_support_root}/board-support/efr32/${silabs_family}/${silabs_board}", "${sl_ot_efr32_root}", "${openthread_root}/src/", "${openthread_root}/third_party/tcplp", @@ -149,7 +149,7 @@ if (wifi_soc != true) { # CCP board "${sl_ot_libs_path}/src/stubs/tcp/tcp_stubs.c", # Temporary file until the files in the SI SDK is fixed - "${sdk_support_root}/protocol/openthread/platform-abstraction/efr32/radio.c", + "${matter_support_root}/sdk-copies/protocol/openthread/platform-abstraction/efr32/radio.c", ] include_dirs = [ diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni index 04baeb1a007258..7dcece0748a610 100644 --- a/third_party/silabs/SiWx917_sdk.gni +++ b/third_party/silabs/SiWx917_sdk.gni @@ -60,8 +60,8 @@ template("siwx917_sdk") { "${efr32_sdk_root}/platform/emdrv/nvm3/inc", "${efr32_sdk_root}/platform/emdrv/common/inc", "${efr32_sdk_root}/platform/service/device_init/inc", - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen", - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/config", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/config", "${chip_root}/src/platform/silabs/rs911x", "${chip_root}/src/platform/silabs/wifi", @@ -132,7 +132,7 @@ template("siwx917_sdk") { "${efr32_sdk_root}/platform/service/sleeptimer/inc", "${efr32_sdk_root}/platform/service/sleeptimer/config", "${efr32_sdk_root}/platform/service/sleeptimer/src", - "${sdk_support_root}/matter/si91x/support/inc", + "${matter_support_root}/board-support/si91x/support/inc", "${efr32_sdk_root}/platform/service/iostream/inc", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/inc", @@ -560,7 +560,7 @@ template("siwx917_sdk") { "${efr32_sdk_root}/platform/security/sl_component/sli_psec_osal/inc", # tinycrypt specific headers - "${sdk_support_root}/matter/mbedtls/tinycrypt/inc", + "${matter_support_root}/tinycrypt/inc", ] } @@ -613,10 +613,10 @@ template("siwx917_sdk") { "${_mbedtls_root}/library/x509write_csr.c", # tinycrypt - "${sdk_support_root}/matter/mbedtls/tinycrypt/src/ecc.c", - "${sdk_support_root}/matter/mbedtls/tinycrypt/src/ecc_dh.c", - "${sdk_support_root}/matter/mbedtls/tinycrypt/src/ecc_dsa.c", - "${sdk_support_root}/matter/mbedtls/tinycrypt/src/tinycrypt_util.c", + "${matter_support_root}/tinycrypt/src/ecc.c", + "${matter_support_root}/tinycrypt/src/ecc_dh.c", + "${matter_support_root}/tinycrypt/src/ecc_dsa.c", + "${matter_support_root}/tinycrypt/src/tinycrypt_util.c", # GECKO SDK "${efr32_sdk_root}/platform/security/sl_component/sli_psec_osal/src/sli_psec_osal_cmsis_rtos2.c", @@ -744,11 +744,11 @@ template("siwx917_sdk") { "${efr32_sdk_root}/util/third_party/freertos/kernel/stream_buffer.c", "${efr32_sdk_root}/util/third_party/freertos/kernel/tasks.c", "${efr32_sdk_root}/util/third_party/freertos/kernel/timers.c", - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_event_handler.c", - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_iostream_handles.c", - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_si91x_button_instances.c", - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_ulp_timer_init.c", - "${sdk_support_root}/matter/si91x/support/hal/rsi_hal_mcu_m4.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_event_handler.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_iostream_handles.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_si91x_button_instances.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_ulp_timer_init.c", + "${matter_support_root}/board-support/si91x/support/hal/rsi_hal_mcu_m4.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/hardware_drivers/button/src/sl_si91x_button.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/service/clock_manager/src/sl_si91x_clock_manager.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/service/clock_manager/src/sli_si91x_clock_manager.c", @@ -768,7 +768,7 @@ template("siwx917_sdk") { # STARTUP FILES "${efr32_sdk_root}/platform/service/iostream/src/sl_iostream.c", "${efr32_sdk_root}/platform/service/iostream/src/sl_iostream_rtt.c", - "${sdk_support_root}/matter/si91x/support/src/startup_common_RS1xxxx.c", + "${matter_support_root}/board-support/si91x/support/src/startup_common_RS1xxxx.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/service/nvm3/src/sl_si91x_common_flash_intf.c", # OTA @@ -779,12 +779,12 @@ template("siwx917_sdk") { if (sl_enable_rgb_led) { sources += [ - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_si91x_rgb_led_instances.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_si91x_rgb_led_instances.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/hardware_drivers/rgb_led/src/sl_si91x_rgb_led.c", ] } else { sources += [ - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_si91x_led_instances.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_si91x_led_instances.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/hardware_drivers/led/src/sl_si91x_led.c", ] } @@ -832,8 +832,8 @@ template("siwx917_sdk") { if (chip_enable_icd_server) { sources += [ - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_si91x_power_manager_handler.c", - "${sdk_support_root}/matter/si91x/siwx917/${silabs_board}/autogen/sl_si91x_power_manager_wakeup_handler.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_si91x_power_manager_handler.c", + "${matter_support_root}/board-support/si91x/siwx917/${silabs_board}/autogen/sl_si91x_power_manager_wakeup_handler.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/peripheral_drivers/src/sl_si91x_m4_ps.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sl_si91x_power_manager.c", "${wifi_sdk_root}/components/device/silabs/si91x/mcu/drivers/service/power_manager/src/sli_si91x_power_manager.c", diff --git a/third_party/silabs/efr32_sdk.gni b/third_party/silabs/efr32_sdk.gni index 73a55503879a46..742da0a3b3dda4 100644 --- a/third_party/silabs/efr32_sdk.gni +++ b/third_party/silabs/efr32_sdk.gni @@ -24,7 +24,7 @@ import("silabs_board.gni") declare_args() { # Location of the efr32 SDK. efr32_sdk_root = "${chip_root}/third_party/silabs/simplicity_sdk" - sdk_support_root = "${chip_root}/third_party/silabs/matter_support" + matter_support_root = "${chip_root}/third_party/silabs/matter_support" wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk" wifi_sdk_root = "${chip_root}/third_party/silabs/wifi_sdk" @@ -117,8 +117,7 @@ declare_args() { "${efr32_sdk_root}/protocol/openthread/platform-abstraction" # board related pre-generated files path (default) - sl_pre_gen_path = - "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/" + sl_pre_gen_path = "${matter_support_root}/board-support/efr32/${silabs_family}/${silabs_board}/" # board related generated files path (used if slc_generate or slc_reuse_files is set) slc_gen_path = "${chip_root}/third_party/silabs/slc_gen/${silabs_board}/" @@ -246,7 +245,7 @@ template("efr32_sdk") { "${efr32_sdk_root}/util/third_party/openthread/include", "${efr32_sdk_root}/util/third_party/openthread/src/core", "${efr32_sdk_root}/util/third_party/openthread/examples/platforms/", - "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/config", + "${matter_support_root}/board-support/efr32/${silabs_family}/${silabs_board}/config", # Headers needed for Init no function will be called if OT is not used "${sl_ot_efr32_root}", @@ -263,22 +262,22 @@ template("efr32_sdk") { "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure", ] - libs += [ "${sdk_support_root}/protocol/openthread/libs/libsl_openthread_cm33_gcc.a" ] + libs += [ "${matter_support_root}/sdk-copies/protocol/openthread/libs/libsl_openthread_cm33_gcc.a" ] if (!chip_enable_ble_rs911x) { libs += [ - "${sdk_support_root}/protocol/bluetooth/bgcommon/lib/build/gcc/cortex-m33/bgcommon/release/libbgcommon.a", - "${sdk_support_root}/protocol/bluetooth/bgstack/ll/build/gcc/xg24/release/liblinklayer.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/ble_bgapi/release/libble_bgapi_gatt_server.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/bgapi_protocol/api3/release/libbgapi_core.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/accept_list/release/libble_host_accept_list_stub.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/bgstack/release/libble_host.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/bgstack/release/libbondingdb_stub.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/ble_bgapi/release/libble_bgapi.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/ble_bgapi/release/libble_bgapi_stub_gatt_client.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/hal/release/libble_host_hal_series2.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/hci/release/libble_host_hci.a", - "${sdk_support_root}/protocol/bluetooth/build/gcc/cortex-m33/ble_host/system/release/libble_system.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/bgcommon/lib/build/gcc/cortex-m33/bgcommon/release/libbgcommon.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/bgstack/ll/build/gcc/xg24/release/liblinklayer.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/ble_bgapi/release/libble_bgapi_gatt_server.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/bgapi_protocol/api3/release/libbgapi_core.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/accept_list/release/libble_host_accept_list_stub.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/bgstack/release/libble_host.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/bgstack/release/libbondingdb_stub.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/ble_bgapi/release/libble_bgapi.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/ble_bgapi/release/libble_bgapi_stub_gatt_client.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/hal/release/libble_host_hal_series2.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/hci/release/libble_host_hci.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/build/gcc/cortex-m33/ble_host/system/release/libble_system.a", ] } } @@ -292,10 +291,10 @@ template("efr32_sdk") { "${efr32_sdk_root}/platform/emdrv/spidrv/config", ] - libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg24_gcc_release.a" ] + libs += [ "${matter_support_root}/sdk-copies/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg24_gcc_release.a" ] if (!chip_enable_ble_rs911x) { - libs += [ "${sdk_support_root}/protocol/bluetooth/bgstack/ll/build/gcc/xg24/release/liblinklayer.a" ] + libs += [ "${matter_support_root}/sdk-copies/protocol/bluetooth/bgstack/ll/build/gcc/xg24/release/liblinklayer.a" ] } defines += [ "EFR32MG24" ] @@ -307,18 +306,18 @@ template("efr32_sdk") { ] libs += [ - "${sdk_support_root}/protocol/bluetooth/bgstack/ll/build/gcc/xg24/release/liblinklayer.a", - "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_module_efr32xg24_gcc_release.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/bgstack/ll/build/gcc/xg24/release/liblinklayer.a", + "${matter_support_root}/sdk-copies/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_module_efr32xg24_gcc_release.a", ] if (silabs_mcu == "MGM240PB32VNA") { - libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb32vna_gcc.a" ] + libs += [ "${matter_support_root}/sdk-copies/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb32vna_gcc.a" ] } else if (silabs_mcu == "MGM240PB22VNA") { - libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb22vna_gcc.a" ] + libs += [ "${matter_support_root}/sdk-copies/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb22vna_gcc.a" ] } else if (silabs_mcu == "MGM240L022RNF") { - libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240l022rnf_gcc.a" ] + libs += [ "${matter_support_root}/sdk-copies/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240l022rnf_gcc.a" ] } else if (silabs_mcu == "MGM240SD22VNA") { - libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240sd22vna_gcc.a" ] + libs += [ "${matter_support_root}/sdk-copies/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240sd22vna_gcc.a" ] defines += [ "SLI_RADIOAES_REQUIRES_MASKING=1" ] } @@ -331,8 +330,8 @@ template("efr32_sdk") { ] libs += [ - "${sdk_support_root}/protocol/bluetooth/bgstack/ll/build/gcc/xg26/release/liblinklayer.a", - "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg26_gcc_release.a", + "${matter_support_root}/sdk-copies/protocol/bluetooth/bgstack/ll/build/gcc/xg26/release/liblinklayer.a", + "${matter_support_root}/sdk-copies/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg26_gcc_release.a", ] defines += [ "EFR32MG26" ] @@ -1110,7 +1109,7 @@ template("efr32_sdk") { "${efr32_sdk_root}/platform/common/src/sl_status.c", "${efr32_sdk_root}/platform/driver/i2cspm/src/sl_i2cspm.c", "${efr32_sdk_root}/platform/emlib/src/em_i2c.c", - "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_i2cspm_init.c", + "${matter_support_root}/board-support/efr32/${silabs_family}/${silabs_board}/autogen/sl_i2cspm_init.c", ] } diff --git a/third_party/silabs/matter_support b/third_party/silabs/matter_support index 7ad2bdc6c2c100..2db499924fd24a 160000 --- a/third_party/silabs/matter_support +++ b/third_party/silabs/matter_support @@ -1 +1 @@ -Subproject commit 7ad2bdc6c2c100ee6775b76b6cd055c40d29e117 +Subproject commit 2db499924fd24a9ff045ad5831438ee79e46a8ac diff --git a/zzz_generated/app-common/app-common/zap-generated/callback.h b/zzz_generated/app-common/app-common/zap-generated/callback.h index 480a2c3434c028..8987cb4aec9c08 100644 --- a/zzz_generated/app-common/app-common/zap-generated/callback.h +++ b/zzz_generated/app-common/app-common/zap-generated/callback.h @@ -6006,24 +6006,6 @@ bool emberAfTimeSynchronizationClusterSetDefaultNTPCallback( bool emberAfBridgedDeviceBasicInformationClusterKeepActiveCallback( chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, const chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::DecodableType & commandData); -/** - * @brief Administrator Commissioning Cluster OpenCommissioningWindow Command callback (from client) - */ -bool emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback( - chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, - const chip::app::Clusters::AdministratorCommissioning::Commands::OpenCommissioningWindow::DecodableType & commandData); -/** - * @brief Administrator Commissioning Cluster OpenBasicCommissioningWindow Command callback (from client) - */ -bool emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallback( - chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, - const chip::app::Clusters::AdministratorCommissioning::Commands::OpenBasicCommissioningWindow::DecodableType & commandData); -/** - * @brief Administrator Commissioning Cluster RevokeCommissioning Command callback (from client) - */ -bool emberAfAdministratorCommissioningClusterRevokeCommissioningCallback( - chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath, - const chip::app::Clusters::AdministratorCommissioning::Commands::RevokeCommissioning::DecodableType & commandData); /** * @brief Operational Credentials Cluster AttestationRequest Command callback (from client) */