diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt index a6d2183cfd5ea1..c2820eee66d529 100644 --- a/.github/.wordlist.txt +++ b/.github/.wordlist.txt @@ -95,6 +95,7 @@ ASR AssertionError AST ASYNC +ATLs atomics att attId @@ -160,6 +161,7 @@ blockquote bluetoothd bluez BOOL +booleans BooleanState bootable Bootloader @@ -380,6 +382,7 @@ DefaultOTARequestor DefaultOTARequestorDriver DefaultOTARequestorStorage DefaultSuccess +defaultValue definedValue DehumidificationControl DelayedActionTime @@ -503,6 +506,7 @@ emberAfExternalAttributeReadCallback emberAfExternalAttributeWriteCallback EmberAfInitializeAttributes emberAfSetDynamicEndpoint +emsp EnableNetwork EnableWiFiNetwork endian @@ -604,6 +608,7 @@ GenericWiFiConfigurationManagerImpl GetDeviceId GetDeviceInfo GetDns +GetInDevelopmentTests GetIP getManualTests GetSafeAttributePersistenceProvider @@ -673,6 +678,7 @@ IasWd iaszone ibb ICA +ICAC ICD ICDs iCloud @@ -724,6 +730,7 @@ IoT ipaddr iPadOS ipadr +IPK ipp iptables iputils @@ -935,6 +942,7 @@ namespacing nano natively navpad +nbsp NCP ncs nding @@ -1076,6 +1084,7 @@ Pigweed PinCode pinrequest PIXIT +PIXITs pkgconfig PKI plaintext @@ -1155,6 +1164,7 @@ RADVD raspberryPi RasPi rAv +RCAC RCP ReadAttribute ReadConfigValue @@ -1219,6 +1229,7 @@ RTOS RTT RTX runArgs +runIf RUNAS RunMain runtime @@ -1227,6 +1238,7 @@ rw RXD sandboxed saveAs +saveDataVersschemaionAs sbin scalability scalable @@ -1377,6 +1389,7 @@ TestArray TestCluster TestConstraints TestEmptyString +TestEqualities TestGenExample TestGroupDemoConfig TestMultiRead diff --git a/.github/workflows/examples-esp32.yaml b/.github/workflows/examples-esp32.yaml index 47908d654006e9..2e5432dd4ec03f 100644 --- a/.github/workflows/examples-esp32.yaml +++ b/.github/workflows/examples-esp32.yaml @@ -165,3 +165,6 @@ jobs: - name: Build example Lighting App (external platform) run: scripts/examples/esp_example.sh lighting-app sdkconfig.ext_plat.defaults + + - name: Build example Energy Management App + run: scripts/examples/esp_example.sh energy-management-app sdkconfig.defaults diff --git a/.github/workflows/examples-nrfconnect.yaml b/.github/workflows/examples-nrfconnect.yaml index 18bfc8d25896c3..88c84d72e28080 100644 --- a/.github/workflows/examples-nrfconnect.yaml +++ b/.github/workflows/examples-nrfconnect.yaml @@ -49,7 +49,7 @@ jobs: with: platform: nrfconnect - name: Detect changed paths - uses: dorny/paths-filter@v2 + uses: dorny/paths-filter@v3 id: changed_paths with: filters: | diff --git a/.github/workflows/examples-stm32.yaml b/.github/workflows/examples-stm32.yaml index 5541e0e64927ab..2e261c6f1c9735 100644 --- a/.github/workflows/examples-stm32.yaml +++ b/.github/workflows/examples-stm32.yaml @@ -62,7 +62,14 @@ jobs: "./scripts/build/build_examples.py \ --target stm32-STM32WB5MM-DK-light build \ " - + + - name: Gather size reports + run: | + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + stm32 STM32WB5MM-DK light \ + out/stm32-stm32wb5mm-dk-light/chip-stm32-lighting-example.elf \ + /tmp/bloat_reports/ + - name: Uploading Size Reports uses: ./.github/actions/upload-size-reports if: ${{ !env.ACT }} diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index c21f75770ce255..1b367688b41653 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -114,6 +114,7 @@ jobs: src/app/zap-templates/zcl/data-model/chip/content-control-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/descriptor-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/device-energy-management-cluster.xml \ + src/app/zap-templates/zcl/data-model/chip/device-energy-management-mode-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/diagnostic-logs-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/dishwasher-alarm-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/dishwasher-mode-cluster.xml \ @@ -121,6 +122,7 @@ jobs: src/app/zap-templates/zcl/data-model/chip/microwave-oven-control-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/door-lock-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/energy-evse-cluster.xml \ + src/app/zap-templates/zcl/data-model/chip/energy-evse-mode-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/ethernet-network-diagnostics-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/fan-control-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/fault-injection-cluster.xml \ @@ -141,6 +143,7 @@ jobs: src/app/zap-templates/zcl/data-model/chip/low-power-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/media-input-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/media-playback-cluster.xml \ + src/app/zap-templates/zcl/data-model/chip/messages-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/mode-base-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/mode-select-cluster.xml \ src/app/zap-templates/zcl/data-model/chip/network-commissioning-cluster.xml \ @@ -461,9 +464,11 @@ jobs: scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_ACE_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_ACE_1_4.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --int-arg PIXIT.ACE.APPENDPOINT:1 PIXIT.ACE.APPDEVTYPEID:0x0100 --string-arg PIXIT.ACE.APPCLUSTER:OnOff PIXIT.ACE.APPATTRIBUTE:OnOff --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_ACE_1_3.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' + scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_ACE_1_5.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_CGEN_2_4.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_DA_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TestGroupTableReports.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' + scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TestBatchInvoke.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TC_TIMESYNC_2_1.py" --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TC_TIMESYNC_2_2.py" --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TC_TIMESYNC_2_4.py" --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' @@ -481,6 +486,10 @@ jobs: scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-lit-icd-ipv6only-no-ble-no-wifi-tsan-clang-test/lit-icd-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_ICDM_2_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_DA_1_5.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_IDM_1_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' +<<<<<<< HEAD +======= + scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_IDM_1_4.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' +>>>>>>> origin/master scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_IDM_4_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_FAN_3_1.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --app out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app --factoryreset --app-args "--discriminator 1234 --KVS kvs1 --trace-to json:out/trace_data/app-{SCRIPT_BASE_NAME}.json" --script "src/python_testing/TC_FAN_3_2.py" --script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"' diff --git a/.gitignore b/.gitignore index 4c17bb63a84a8c..d6aefb1d928c1b 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,7 @@ examples/thermostat/ameba/build # https://github.com/espressif/idf-component-manager#using-with-a-project examples/*/esp32/managed_components examples/*/esp32/dependencies.lock + +# jupyter temporary files +.ipynb_checkpoints + diff --git a/.restyled.yaml b/.restyled.yaml index ddea89227f3727..56ed3061e6e1fa 100644 --- a/.restyled.yaml +++ b/.restyled.yaml @@ -86,6 +86,8 @@ exclude: - "scripts/setup/pigweed.json" # TODO(#29547). This file is temporary copy from pigweed repo that has minor edits. No restyle help in diff. - "docs/ERROR_CODES.md" # generated by scripts, not easy to align tables - "docs/clusters.md" # generated by scripts, not easy to align tables + - "docs/testing/yaml_pseudocluster.md" # generated by scripts, restyler makes the tables render improperly + - "docs/testing/yaml_schema.md" # generated by scripts, restyler makes the tables render improperly changed_paths: maximum: 100000 diff --git a/.spellcheck.yml b/.spellcheck.yml index e3e470a696bbeb..c04880827addba 100644 --- a/.spellcheck.yml +++ b/.spellcheck.yml @@ -20,7 +20,7 @@ # # Actual run: # -# pyspelling pyspelling --config .spellcheck.yml +# pyspelling --config .spellcheck.yml matrix: - name: markdown @@ -65,6 +65,6 @@ matrix: # converts markdown to HTML - pyspelling.filters.markdown: sources: - - '**/*.md|!third_party/**|!examples/common/**/repo/**|!docs/ERROR_CODES.md|!docs/clusters.md' + - '**/*.md|!third_party/**|!examples/common/**/repo/**|!docs/ERROR_CODES.md|!docs/clusters.md|!docs/testing/yaml_schema.md|!docs/testing/yaml_pseudocluster.md' aspell: ignore-case: true diff --git a/admin_storage.json b/admin_storage.json new file mode 100644 index 00000000000000..6794e29d20df9c --- /dev/null +++ b/admin_storage.json @@ -0,0 +1,40 @@ +{ + "sdk-config": { + "g/lkgt": "FSYAgKi8LBg=", + "g/gcc": "1I2QDA==", + "g/gdc": "zKIbBw==", + "ExampleOpCredsCAKey1": "BNKCUdl4+/bUYeN74XgYyKqShzel1BkAmxSdBind+sbTKSQtxxBtImCw5GAOxm3m3OL7UiqlFziEqOxBEgGTeXYonmiOwU0qLB7Z7Uf05eTwl2z21TNbORgUEZniUL5BPw==", + "ExampleOpCredsICAKey1": "BKoqgONDMhfmWVzOPFfHafpMF8rzW/xPz6l1Ba6FTfXUg4GqMCNpU0hrLHX8g9eqn54rVVycasjwPGdl1sFupx4FqWydDv8rjPZ70sh058v1y8E4HCA0XXsX3wpmNOxEhA==", + "ExampleCARootCert1": "MIIBlzCCATygAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMTAeFw0yMTAxMDEwMDAwMDBaFw0zMDEyMzAwMDAwMDBaMCIxIDAeBgorBgEEAYKifAEEDBAwMDAwMDAwMDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0oJR2Xj79tRh43vheBjIqpKHN6XUGQCbFJ0GKd36xtMpJC3HEG0iYLDkYA7Gbebc4vtSKqUXOISo7EESAZN5dqNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFA076iBnkeRhG8oF2tcG9jn3nezJMB8GA1UdIwQYMBaAFA076iBnkeRhG8oF2tcG9jn3nezJMAoGCCqGSM49BAMCA0kAMEYCIQDszQdM7LuOJNiJlvZ4aG4YZy+0xHmD6WhYd/gRAsu/3AIhAP6eelMzcGzhVvzlNMtYwT2UGduDf1dkLkBbkabcKH25", + "ExampleCAIntermediateCert1": "MIIBlTCCATygAwIBAgIBATAKBggqhkjOPQQDAjAiMSAwHgYKKwYBBAGConwBBAwQMDAwMDAwMDAwMDAwMDAwMTAeFw0yMTAxMDEwMDAwMDBaFw0zMDEyMzAwMDAwMDBaMCIxIDAeBgorBgEEAYKifAEDDBAwMDAwMDAwMDAwMDAwMDAyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqiqA40MyF+ZZXM48V8dp+kwXyvNb/E/PqXUFroVN9dSDgaowI2lTSGssdfyD16qfnitVXJxqyPA8Z2XWwW6nHqNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBvNEjilwBWw1P50fCivphuY1iH0MB8GA1UdIwQYMBaAFA076iBnkeRhG8oF2tcG9jn3nezJMAoGCCqGSM49BAMCA0cAMEQCIDS5ar5c9gMd/FddheZlrAdOhqSKvLxGo2OdpAcDGG/5AiBM8LDr0ERoar1QAm8fzpf0QPaBf7VZ+jyKy9vaoGaARA==", + "f/1/m": "FSUA8f8sAQAY", + "f/1/n": "FTABAQEkAgE3AyQTAhgmBIAigScmBYAlTTo3BiQVASYRabYBABgkBwEkCAEwCUEECnDtSj20voQGGEfb6EVwBQQnfXNX55cyWu8D/PpS3219Ju0Bea4qOA1QHD7qTORWbUcWS7YRy2i/tq8cXwzaqTcKNQEoARgkAgE2AwQCBAEYMAQU36MfTW+jv09TSOTaeOn9TMLCe8cwBRQbzRI4pcAVsNT+dHwor6YbmNYh9BgwC0CiBWw9bZOChdIQBU72yw1cOo613ubNE+sElwOH/iQEDCVYFqpesE+4T40AezfvtS5WUWcBOaQ/ssF6Qdm0WsIUGA==", + "f/1/i": "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQTAhgkBwEkCAEwCUEEqiqA40MyF+ZZXM48V8dp+kwXyvNb/E/PqXUFroVN9dSDgaowI2lTSGssdfyD16qfnitVXJxqyPA8Z2XWwW6nHjcKNQEpARgkAmAwBBQbzRI4pcAVsNT+dHwor6YbmNYh9DAFFA076iBnkeRhG8oF2tcG9jn3nezJGDALQDS5ar5c9gMd/FddheZlrAdOhqSKvLxGo2OdpAcDGG/5TPCw69BEaGq9UAJvH86X9ED2gX+1Wfo8isvb2qBmgEQY", + "f/1/r": "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQUARgkBwEkCAEwCUEE0oJR2Xj79tRh43vheBjIqpKHN6XUGQCbFJ0GKd36xtMpJC3HEG0iYLDkYA7Gbebc4vtSKqUXOISo7EESAZN5djcKNQEpARgkAmAwBBQNO+ogZ5HkYRvKBdrXBvY5953syTAFFA076iBnkeRhG8oF2tcG9jn3nezJGDALQOzNB0zsu44k2ImW9nhobhhnL7TEeYPpaFh3+BECy7/c/p56UzNwbOFW/OU0y1jBPZQZ24N/V2QuQFuRptwofbkY", + "g/fidx": "FSQAAzYBBAEEAhgY", + "f/1/k/0": "FSQBACQCATYDFSQEACUFCE8wBhC7B8skK5lNY0EMG1S24IZhGBUkBAAkBQAwBhAAAAAAAAAAAAAAAAAAAAAAGBUkBAAkBQAwBhAAAAAAAAAAAAAAAAAAAAAAGBglB///GA==", + "g/gfl": "FSQBAiQCAhg=", + "f/1/g": "FSQBACQCACQDACQEACQFACQGASQHABg=", + "f/1/s/0000000012344321": "FTADEMUpQBWFWKyJO988CDCi1qYwBCD4xeYvTM4JX11fWFpMXOXX8b8hjpZdQDx2qddplFb1cjAFDAAAAAAAAAAAAAAAABg=", + "g/s/xSlAFYVYrIk73zwIMKLWpg==": "FSQBASYCIUM0Ehg=", + "g/sri": "FhUkAQEmAiFDNBIYFSQBAiYCIUM0EhgY", + "f/2/m": "FSUA8f8sAQAY", + "f/2/n": "FTABAQEkAgE3AyQTAhgmBIAigScmBYAlTTo3BiQVASYRarYBABgkBwEkCAEwCUEE5MSe4YJA6/8fiHZdhqJfUIOKY4Hce74tU75LcNFPkjkA5ywuWz6/jzADtWTFaXlLUdX0Cv50XCmrrcrQpVItCzcKNQEoARgkAgE2AwQCBAEYMAQU5cVj0gQNlYwIS4Wpv4+jqbtv/kMwBRQbzRI4pcAVsNT+dHwor6YbmNYh9BgwC0BnJT6L/8zp/YO4QdDtP15MyFAeThImSivNfyaDeAv3i1RCkcuAqejIGKzEn/Hh2EF9kjYyWIkhZvkMDn/jOqDBGA==", + "f/2/i": "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQTAhgkBwEkCAEwCUEEqiqA40MyF+ZZXM48V8dp+kwXyvNb/E/PqXUFroVN9dSDgaowI2lTSGssdfyD16qfnitVXJxqyPA8Z2XWwW6nHjcKNQEpARgkAmAwBBQbzRI4pcAVsNT+dHwor6YbmNYh9DAFFA076iBnkeRhG8oF2tcG9jn3nezJGDALQDS5ar5c9gMd/FddheZlrAdOhqSKvLxGo2OdpAcDGG/5TPCw69BEaGq9UAJvH86X9ED2gX+1Wfo8isvb2qBmgEQY", + "f/2/r": "FTABAQEkAgE3AyQUARgmBIAigScmBYAlTTo3BiQUARgkBwEkCAEwCUEE0oJR2Xj79tRh43vheBjIqpKHN6XUGQCbFJ0GKd36xtMpJC3HEG0iYLDkYA7Gbebc4vtSKqUXOISo7EESAZN5djcKNQEpARgkAmAwBBQNO+ogZ5HkYRvKBdrXBvY5953syTAFFA076iBnkeRhG8oF2tcG9jn3nezJGDALQOzNB0zsu44k2ImW9nhobhhnL7TEeYPpaFh3+BECy7/c/p56UzNwbOFW/OU0y1jBPZQZ24N/V2QuQFuRptwofbkY", + "f/2/k/0": "FSQBACQCATYDFSQEACUFCE8wBhC7B8skK5lNY0EMG1S24IZhGBUkBAAkBQAwBhAAAAAAAAAAAAAAAAAAAAAAGBUkBAAkBQAwBhAAAAAAAAAAAAAAAAAAAAAAGBglB///GA==", + "f/2/g": "FSQBACQCACQDACQEACQFACQGASQHARg=", + "f/2/s/0000000012344321": "FTADEN2SiGzy7pc0hiq6QumYheswBCBb3LuwzXC0yLO8svfB/v8LBUoyAlenR4qm34P+We0y7jAFDAAAAAAAAAAAAAAAABg=", + "g/s/3ZKIbPLulzSGKrpC6ZiF6w==": "FSQBAiYCIUM0Ehg=" + }, + "repl-config": { + "caList": { + "1": [ + { + "fabricId": 1, + "vendorId": 65521 + } + ] + } + } +} \ No newline at end of file diff --git a/build/chip/chip_test_group.gni b/build/chip/chip_test_group.gni index bc092c46ab6bcd..9e26b19235e29c 100644 --- a/build/chip/chip_test_group.gni +++ b/build/chip/chip_test_group.gni @@ -39,10 +39,14 @@ template("chip_test_group") { [ "build_monolithic_library", "deps", + "tests", ]) deps = [] - foreach(_test, invoker.deps) { + if (defined(invoker.deps)) { + deps = invoker.deps + } + foreach(_test, invoker.tests) { deps += [ get_label_info(_test, "label_no_toolchain") + ".lib" ] } @@ -53,7 +57,7 @@ template("chip_test_group") { group("${_test_group_name}") { deps = [] - data_deps = invoker.deps + data_deps = invoker.tests if (_build_monolithic_library) { deps += [ ":${_lib_target_name}" ] @@ -64,7 +68,10 @@ template("chip_test_group") { group("${_test_group_name}_run") { if (chip_link_tests) { deps = [] - foreach(_test, invoker.deps) { + if (defined(invoker.deps)) { + deps = invoker.deps + } + foreach(_test, invoker.tests) { deps += [ get_label_info(_test, "label_no_toolchain") + "_run" ] } } diff --git a/config/ameba/lib/pw_rpc/BUILD.gn b/config/ameba/lib/pw_rpc/BUILD.gn index 4b47ab1d61a16a..0b125c8a98aada 100644 --- a/config/ameba/lib/pw_rpc/BUILD.gn +++ b/config/ameba/lib/pw_rpc/BUILD.gn @@ -24,7 +24,6 @@ static_library("pw_rpc") { "$dir_pw_rpc:server", "$dir_pw_rpc/nanopb:echo_service", "${chip_root}/examples/platform/ameba/pw_sys_io:pw_sys_io_ameba", - "${dir_pigweed}/pw_hdlc:pw_rpc", dir_pw_assert, dir_pw_hdlc, dir_pw_log, diff --git a/config/bouffalolab/common/lib/pw_rpc/BUILD.gn b/config/bouffalolab/common/lib/pw_rpc/BUILD.gn index b1c9e1a596209e..999ffe37618ec7 100644 --- a/config/bouffalolab/common/lib/pw_rpc/BUILD.gn +++ b/config/bouffalolab/common/lib/pw_rpc/BUILD.gn @@ -36,7 +36,6 @@ static_library("pw_rpc") { "$dir_pw_rpc:server", "$dir_pw_rpc/nanopb:echo_service", "${chip_root}/examples/platform/bouffalolab/common/rpc/pw_sys_io:pw_sys_io", - "${dir_pigweed}/pw_hdlc:pw_rpc", dir_pw_assert, dir_pw_checksum, dir_pw_hdlc, diff --git a/config/efr32/lib/pw_rpc/BUILD.gn b/config/efr32/lib/pw_rpc/BUILD.gn index ed2e3a47bc1305..f858f6c1321999 100644 --- a/config/efr32/lib/pw_rpc/BUILD.gn +++ b/config/efr32/lib/pw_rpc/BUILD.gn @@ -25,7 +25,6 @@ static_library("pw_rpc") { "$dir_pw_rpc:server", "$dir_pw_rpc/nanopb:echo_service", "${chip_root}/examples/platform/silabs/pw_sys_io:pw_sys_io_silabs", - "${dir_pigweed}/pw_hdlc:pw_rpc", dir_pw_assert, dir_pw_checksum, dir_pw_hdlc, diff --git a/config/esp32/lib/pw_rpc/BUILD.gn b/config/esp32/lib/pw_rpc/BUILD.gn index 383e4b25f21d56..2ced13e5c5574d 100644 --- a/config/esp32/lib/pw_rpc/BUILD.gn +++ b/config/esp32/lib/pw_rpc/BUILD.gn @@ -24,7 +24,6 @@ static_library("pw_rpc") { "$dir_pw_rpc:server", "$dir_pw_rpc/nanopb:echo_service", "${chip_root}/examples/platform/esp32/pw_sys_io:pw_sys_io_esp32", - "${dir_pigweed}/pw_hdlc:pw_rpc", dir_pw_assert, dir_pw_hdlc, dir_pw_log, diff --git a/config/linux/lib/pw_rpc/BUILD.gn b/config/linux/lib/pw_rpc/BUILD.gn index e79af448d13e57..a01627c32541d1 100644 --- a/config/linux/lib/pw_rpc/BUILD.gn +++ b/config/linux/lib/pw_rpc/BUILD.gn @@ -22,7 +22,6 @@ static_library("pw_rpc") { public_configs = [ "${dir_pigweed}/pw_hdlc:default_config" ] deps = [ "$dir_pw_hdlc:encoder", - "$dir_pw_hdlc:pw_rpc", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_rpc/system_server:facade", "$dir_pw_stream:socket_stream", diff --git a/config/mbed/chip-gn/lib/pw_rpc/BUILD.gn b/config/mbed/chip-gn/lib/pw_rpc/BUILD.gn index f1a5e071e9c619..c84adde4fb1e46 100644 --- a/config/mbed/chip-gn/lib/pw_rpc/BUILD.gn +++ b/config/mbed/chip-gn/lib/pw_rpc/BUILD.gn @@ -30,7 +30,6 @@ static_library("pw_rpc") { deps = [ "$dir_pw_rpc:server", "${chip_root}/examples/platform/mbed/pw_sys_io:pw_sys_io_mbed", - "${dir_pigweed}/pw_hdlc:pw_rpc", dir_pw_assert, dir_pw_hdlc, dir_pw_log, diff --git a/config/nxp/README.md b/config/nxp/README.md new file mode 100644 index 00000000000000..e15ad309dc9d1a --- /dev/null +++ b/config/nxp/README.md @@ -0,0 +1,10 @@ +# NXP Zephyr build and configuration files + +This directory contains build scripts and common configuration files used by +CHIP NXP Zephyr applications. It is structured as follows: + +| File/Folder | Contents | +| ----------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| chip-gn | GN project used to build selected CHIP libraries with the _nxp_zephyr_ platform integration layer | +| chip-module | CMake wrapper for the GN project defined in `chip-gn` directory, and other components that allow one to use CHIP as a Zephyr module | +| app | Common and optional Kconfig configuration files that can be used in NXP Zephyr applications | diff --git a/config/nxp/app/bootloader.conf b/config/nxp/app/bootloader.conf new file mode 100644 index 00000000000000..281e1145a89aa0 --- /dev/null +++ b/config/nxp/app/bootloader.conf @@ -0,0 +1,25 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Options to be used for MCUBOOT build are located on this file. + +# The default signature key used by MCUBOOT is located on their repository, +# change this to the appropriate one. +# NOTE: This option needs to contain a path to the same file used by +# MCUBOOT_SIGNATURE_KEY_FILE. +#CONFIG_BOOT_SIGNATURE_KEY_FILE="root-rsa-2048.pem" + +CONFIG_BOOT_MAX_IMG_SECTORS=2048 diff --git a/config/nxp/app/enable-gnu-std.cmake b/config/nxp/app/enable-gnu-std.cmake new file mode 100644 index 00000000000000..a5a5c6c6aca10f --- /dev/null +++ b/config/nxp/app/enable-gnu-std.cmake @@ -0,0 +1,22 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +add_library(gnu17 INTERFACE) +target_compile_options(gnu17 + INTERFACE + $<$:-std=gnu++17> + -D_SYS__PTHREADTYPES_H_) +target_link_libraries(app PRIVATE gnu17) diff --git a/config/nxp/app/pre-zephyr.cmake b/config/nxp/app/pre-zephyr.cmake new file mode 100644 index 00000000000000..9dd1b2ae32c5bf --- /dev/null +++ b/config/nxp/app/pre-zephyr.cmake @@ -0,0 +1,21 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Automatically find overlays defined at platform level +# Those are usually used to change FLASH and RAM layouts +if (EXISTS ${CHIP_ROOT}/src/platform/nxp/zephyr/boards/${BOARD}/${BOARD}.overlay) + list(APPEND EXTRA_DTC_OVERLAY_FILE ${CHIP_ROOT}/src/platform/nxp/zephyr/boards/${BOARD}/${BOARD}.overlay) +endif() diff --git a/config/nxp/chip-gn/.gn b/config/nxp/chip-gn/.gn new file mode 100644 index 00000000000000..0cc783dee91703 --- /dev/null +++ b/config/nxp/chip-gn/.gn @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build_overrides/build.gni") +import("//build_overrides/chip.gni") + +# The location of the build configuration file. +buildconfig = "${build_root}/config/BUILDCONFIG.gn" + +# CHIP uses angle bracket includes. +check_system_includes = true + +default_args = { + target_cpu = "arm" + target_os = "zephyr" + + import("${chip_root}/config/nxp/chip-gn/args.gni") +} diff --git a/config/nxp/chip-gn/BUILD.gn b/config/nxp/chip-gn/BUILD.gn new file mode 100644 index 00000000000000..1fc09ec27d611a --- /dev/null +++ b/config/nxp/chip-gn/BUILD.gn @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build_overrides/build.gni") +import("//build_overrides/chip.gni") + +import("${chip_root}/build/chip/tests.gni") + +assert(current_os == "zephyr") + +declare_args() { + chip_build_example_providers = false +} + +group("nxp_zephyr") { + deps = [ "${chip_root}/src/lib" ] + + if (chip_build_tests) { + deps += [ "${chip_root}/src:tests" ] + } + + if (chip_build_example_providers) { + deps += [ "${chip_root}/examples/providers:device_info_provider" ] + } +} + +group("default") { + deps = [ ":nxp_zephyr" ] +} diff --git a/config/nxp/chip-gn/args.gni b/config/nxp/chip-gn/args.gni new file mode 100644 index 00000000000000..702e9537b4b74d --- /dev/null +++ b/config/nxp/chip-gn/args.gni @@ -0,0 +1,32 @@ +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build_overrides/chip.gni") + +import("${chip_root}/src/crypto/crypto.gni") + +chip_device_platform = "nxp_zephyr" + +chip_build_tests = false + +chip_project_config_include = "" +chip_system_project_config_include = "" +chip_ble_project_config_include = "" + +chip_crypto = "mbedtls" +chip_external_mbedtls = true + +custom_toolchain = "${chip_root}/config/nxp/chip-gn/toolchain:zephyr" + +pw_build_PIP_CONSTRAINTS = [ "${chip_root}/scripts/setup/constraints.txt" ] diff --git a/config/nxp/chip-gn/toolchain/BUILD.gn b/config/nxp/chip-gn/toolchain/BUILD.gn new file mode 100644 index 00000000000000..0bee7f170cbd89 --- /dev/null +++ b/config/nxp/chip-gn/toolchain/BUILD.gn @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import("//build_overrides/build.gni") + +import("${build_root}/toolchain/arm_gcc/arm_toolchain.gni") + +declare_args() { + zephyr_ar = "" + zephyr_cc = "" + zephyr_cxx = "" +} + +gcc_toolchain("zephyr") { + ar = zephyr_ar + cc = zephyr_cc + cxx = zephyr_cxx + + toolchain_args = { + current_os = "zephyr" + is_clang = false + } +} diff --git a/config/nxp/chip-module/CMakeLists.txt b/config/nxp/chip-module/CMakeLists.txt new file mode 100644 index 00000000000000..0e35f27a44d153 --- /dev/null +++ b/config/nxp/chip-module/CMakeLists.txt @@ -0,0 +1,270 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# @file +# CMake sub-project defining 'chip' target which represents CHIP library +# and other optional libraries like unit tests, built with 'nxp_zephyr' +# platform. +# Since CHIP doesn't provide native CMake support, ExternalProject +# module is used to build the required artifacts with GN meta-build +# system. It is assumed that find_package(Zephyr) has been called before +# including this file. +# + +if (CONFIG_CHIP) + +include(ExternalProject) +include(../../zephyr/ota-image.cmake) +include(../../zephyr/zephyr-util.cmake) +include(generate_factory_data.cmake) + +# ============================================================================== +# Prepare CHIP configuration based on the project Kconfig configuration +# ============================================================================== + +# Set paths + +if (NOT CHIP_ROOT) + get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../.. REALPATH) +endif() +get_filename_component(GN_ROOT_TARGET ${CHIP_ROOT}/config/nxp/chip-gn REALPATH) +get_filename_component(COMMON_CMAKE_SOURCE_DIR ${CHIP_ROOT}/config/common/cmake REALPATH) + +# Get common Cmake sources + +include(${COMMON_CMAKE_SOURCE_DIR}/chip_gn_args.cmake) +include(${COMMON_CMAKE_SOURCE_DIR}/chip_gn.cmake) + +# Prepare compiler flags +if (CHIP_CFLAGS) + matter_add_flags("${CHIP_CFLAGS}") +endif() + +matter_add_cxxflags(-D_POSIX_C_SOURCE=200809) + +if (CONFIG_ARM) + matter_add_cflags(--specs=nosys.specs) +endif() + +if(CONFIG_MBEDTLS) + zephyr_include_directories($) + zephyr_compile_definitions($) +endif() + +zephyr_include_directories(${CHIP_ROOT}/src/platform/nxp/zephyr) + +zephyr_get_compile_flags(ZEPHYR_CFLAGS_C C) +matter_add_cflags("${ZEPHYR_CFLAGS_C}") +zephyr_get_compile_flags(ZEPHYR_CFLAGS_CC CXX) +matter_add_cxxflags("${ZEPHYR_CFLAGS_CC}") +zephyr_get_gnu_cpp_standard(ZEPHYR_GNU_CPP_STD) +matter_add_cxxflags(${ZEPHYR_GNU_CPP_STD}) + +# Set up custom OpenThread configuration + +if (CONFIG_CHIP_OPENTHREAD_CONFIG) + get_filename_component(CHIP_OPENTHREAD_CONFIG + ${CONFIG_CHIP_OPENTHREAD_CONFIG} + REALPATH + BASE_DIR ${CMAKE_SOURCE_DIR} + ) + zephyr_set_openthread_config(${CHIP_OPENTHREAD_CONFIG}) +endif() + +# Set up Zephyr symbol level + +if (NOT CONFIG_CHIP_DEBUG_SYMBOLS) + set_compiler_property(PROPERTY debug -g0) +endif() + +# Determine if ccache should be used + +get_property(CHIP_COMPILER_LAUNCHER GLOBAL PROPERTY RULE_LAUNCH_COMPILE) + +# ============================================================================== +# Generate configuration for CHIP GN build system +# ============================================================================== + +matter_common_gn_args( + DEBUG CONFIG_DEBUG + LIB_SHELL CONFIG_CHIP_LIB_SHELL + LIB_TESTS CONFIG_CHIP_BUILD_TESTS + PROJECT_CONFIG ${CONFIG_CHIP_PROJECT_CONFIG} + DEVICE_INFO_EXAMPLE_PROVIDER CONFIG_CHIP_EXAMPLE_DEVICE_INFO_PROVIDER +) +matter_add_gn_arg_string("zephyr_ar" ${CMAKE_AR}) +matter_add_gn_arg_string("zephyr_cc" ${CMAKE_C_COMPILER}) +matter_add_gn_arg_string("zephyr_cxx" ${CMAKE_CXX_COMPILER}) +matter_add_gn_arg_bool ("chip_logging" CONFIG_LOG) +matter_add_gn_arg_bool ("chip_enable_openthread" CONFIG_NET_L2_OPENTHREAD) +matter_add_gn_arg_bool ("chip_openthread_ftd" CONFIG_OPENTHREAD_FTD) +matter_add_gn_arg_bool ("chip_config_network_layer_ble" CONFIG_BT) +matter_add_gn_arg_bool ("chip_inet_config_enable_ipv4" CONFIG_CHIP_IPV4) +matter_add_gn_arg_bool ("chip_persist_subscriptions" CONFIG_CHIP_PERSISTENT_SUBSCRIPTIONS) +matter_add_gn_arg_bool ("chip_monolithic_tests" CONFIG_CHIP_BUILD_TESTS) +matter_add_gn_arg_bool ("chip_inet_config_enable_tcp_endpoint" CONFIG_CHIP_BUILD_TESTS) +matter_add_gn_arg_bool ("chip_error_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 1) +matter_add_gn_arg_bool ("chip_progress_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 3) +matter_add_gn_arg_bool ("chip_detail_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 4) +matter_add_gn_arg_bool ("chip_automation_logging" FALSE) +matter_add_gn_arg_bool ("chip_malloc_sys_heap" CONFIG_CHIP_MALLOC_SYS_HEAP) +matter_add_gn_arg_bool ("chip_enable_wifi" CONFIG_CHIP_WIFI) +matter_add_gn_arg_bool ("chip_system_config_provide_statistics" CONFIG_CHIP_STATISTICS) +matter_add_gn_arg_bool ("chip_enable_icd_server" CONFIG_CHIP_ENABLE_ICD_SUPPORT) +matter_add_gn_arg_bool ("enable_eventlist_attribute" TRUE) +matter_add_gn_arg_bool ("chip_enable_ota_requestor" CONFIG_CHIP_OTA_REQUESTOR) + +if(CONFIG_DEBUG) + matter_add_gn_arg_bool("optimize_debug" true) + matter_add_gn_arg_string("optimize_debug_level" "0") + matter_add_gn_arg_string("symbol_level" "2") +endif() + +if (CONFIG_CHIP_FACTORY_DATA) + matter_add_gn_arg_bool("chip_use_transitional_commissionable_data_provider" FALSE) + matter_add_gn_arg_bool("chip_enable_factory_data" TRUE) +elseif (CONFIG_CHIP_FACTORY_DATA_CUSTOM_BACKEND) + matter_add_gn_arg_bool("chip_use_transitional_commissionable_data_provider" FALSE) +endif() + +if (CONFIG_CHIP_ROTATING_DEVICE_ID) + matter_add_gn_arg_bool("chip_enable_rotating_device_id" TRUE) + matter_add_gn_arg_bool("chip_enable_additional_data_advertising" TRUE) +endif() + +if (CONFIG_NET_L2_OPENTHREAD) + matter_add_gn_arg_string("chip_mdns" "platform") +elseif(CONFIG_WIFI_NXP) + matter_add_gn_arg_string("chip_mdns" "minimal") +else() + matter_add_gn_arg_string("chip_mdns" "none") +endif() + +if (CONFIG_CHIP_CRYPTO_PSA) + matter_add_gn_arg_string("chip_crypto" "psa") +endif() + +# if (BOARD STREQUAL "native_posix") +# matter_add_gn_arg_string("target_cpu" "x86") +# elseif (BOARD STREQUAL "native_posix_64") +# matter_add_gn_arg_string("target_cpu" "x64") +# endif() + +if (NOT CONFIG_CHIP_DEBUG_SYMBOLS) + matter_add_gn_arg_string("symbol_level" "0") +endif() + +# if (CHIP_COMPILER_LAUNCHER) +# matter_add_gn_arg_string("pw_command_launcher" ${CHIP_COMPILER_LAUNCHER}) +# endif() + +# if (CONFIG_CHIP_PW_RPC) +# set(PIGWEED_DIR "//third_party/pigweed/repo") +# matter_add_gn_arg_string("pw_assert_BACKEND" ${PIGWEED_DIR}/pw_assert_log:check_backend) +# matter_add_gn_arg_string("pw_log_BACKEND" ${PIGWEED_DIR}/pw_log_basic) +# matter_add_gn_arg("pw_build_LINK_DEPS" [\"${PIGWEED_DIR}/pw_assert:impl\",\ \"${PIGWEED_DIR}/pw_log:impl\"]) +# endif() + +matter_generate_args_tmp_file() + +# ============================================================================== +# Build chip library +# ============================================================================== + +matter_build(chip + LIB_SHELL ${CONFIG_CHIP_LIB_SHELL} + LIB_TESTS ${CONFIG_CHIP_BUILD_TESTS} + DEVICE_INFO_EXAMPLE_PROVIDER ${CONFIG_CHIP_EXAMPLE_DEVICE_INFO_PROVIDER} + GN_DEPENDENCIES kernel +) + +set_property(GLOBAL APPEND PROPERTY ZEPHYR_INTERFACE_LIBS chip) +# Enable visibility of POSIX.1-2008 functions, such as strnlen +target_compile_definitions(chip INTERFACE _POSIX_C_SOURCE=200809) +# Make sure that kernel symbols that are only referenced by the Matter libraries are resolved. +target_link_libraries(chip INTERFACE $) + +if (CONFIG_CHIP_MALLOC_SYS_HEAP_OVERRIDE) + target_link_options(chip INTERFACE + -Wl,--wrap=malloc + -Wl,--wrap=calloc + -Wl,--wrap=realloc + -Wl,--wrap=free + -Wl,--wrap=_malloc_r + -Wl,--wrap=_calloc_r + -Wl,--wrap=_realloc_r + -Wl,--wrap=_free_r + ) +endif() + +# ============================================================================== +# Define 'chip-ota-image' target for building CHIP OTA image +# ============================================================================== +if(EXISTS "${CHIP_ROOT}/src/platform/nxp/zephyr/boards/${BOARD}/${BOARD}.overlay") + set(DTC_BOARD_OVERLAY "${CHIP_ROOT}/src/platform/nxp/zephyr/boards/${BOARD}/${BOARD}.overlay") +else() + set(DTC_BOARD_OVERLAY "") + message(STATUS "No board overlay found") +endif() + +if (CONFIG_CHIP_OTA_REQUESTOR) + if(CONFIG_MCUBOOT_SIGNATURE_KEY_FILE STREQUAL "") + set(ZEPHYR_OUTPUT_NAME "zephyr") + else() + set(ZEPHYR_OUTPUT_NAME "zephyr.signed") + endif() + + set(GLOBAL_BOOTLOADER_CONF_OVERLAY_FILE "${CHIP_ROOT}/config/nxp/app/bootloader.conf") + + add_custom_target(build_mcuboot ALL + COMMAND + west build -b ${BOARD} -d build_mcuboot ${ZEPHYR_BASE}/../bootloader/mcuboot/boot/zephyr + -- -DOVERLAY_CONFIG=${GLOBAL_BOOTLOADER_CONF_OVERLAY_FILE} -DEXTRA_DTC_OVERLAY_FILE=${DTC_BOARD_OVERLAY} + COMMAND + cp ${PROJECT_BINARY_DIR}/../modules/connectedhomeip/build_mcuboot/zephyr/zephyr.bin ${PROJECT_BINARY_DIR}/zephyr.mcuboot.bin + ) + + set(BLOCK_SIZE "1024") + dt_nodelabel(dts_partition_path NODELABEL "boot_partition") + dt_reg_size(mcuboot_size PATH ${dts_partition_path}) + math(EXPR boot_blocks "${mcuboot_size} / ${BLOCK_SIZE}" OUTPUT_FORMAT DECIMAL) + + add_custom_target(merge_mcuboot ALL + COMMAND + dd if=${PROJECT_BINARY_DIR}/zephyr.mcuboot.bin of=${PROJECT_BINARY_DIR}/zephyr_full.bin + COMMAND + dd if=${PROJECT_BINARY_DIR}/${ZEPHYR_OUTPUT_NAME}.bin of=${PROJECT_BINARY_DIR}/zephyr_full.bin bs=${BLOCK_SIZE} seek=${boot_blocks} + ) + add_dependencies(merge_mcuboot ${ZEPHYR_FINAL_EXECUTABLE}) + + if (CONFIG_CHIP_OTA_IMAGE_BUILD) + chip_ota_image(chip-ota-image + INPUT_FILES ${PROJECT_BINARY_DIR}/${ZEPHYR_OUTPUT_NAME}.bin + OUTPUT_FILE ${PROJECT_BINARY_DIR}/${CONFIG_CHIP_OTA_IMAGE_FILE_NAME} + ) + endif() +endif() + +# ============================================================================== +# Define 'factory_data' target for generating a factory data partition +# ============================================================================== + +if (CONFIG_CHIP_FACTORY_DATA_BUILD) + nxp_generate_factory_data() +endif() + +endif() # CONFIG_CHIP diff --git a/config/nxp/chip-module/Kconfig b/config/nxp/chip-module/Kconfig new file mode 100644 index 00000000000000..88918a67450ad3 --- /dev/null +++ b/config/nxp/chip-module/Kconfig @@ -0,0 +1,258 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +rsource "../../zephyr/Kconfig" + +if CHIP + +config CHIP_NXP_PLATFORM + bool + default y + help + States that the configuration uses Matter NXP platform, + what can be used to conditionally deviate from Zephyr generic configuration + for NXP platform related purposes. + +# See config/zephyr/Kconfig for full definition +config CHIP_DEVICE_VENDOR_NAME + default "NXP Semiconductors" + +config CHIP_APP_LOG_LEVEL + int "Logging level in application" + default LOG_DEFAULT_LEVEL + depends on LOG + help + Sets the logging level in the Matter application. Use this configuration + option only within the application. To set the logging level for the + Matter stack, use the MATTER_LOG_LEVEL configuration option. + +config CHIP_EXAMPLE_DEVICE_INFO_PROVIDER + bool "Include default device information provider build" + default y + +config CHIP_DEBUG_SYMBOLS + bool "Generate debug symbols" + default y + help + Enables building the application with debug symbols. + +config CHIP_MALLOC_SYS_HEAP + default y if !ARCH_POSIX + +config CHIP_FACTORY_DATA + bool "Factory data provider" + help + Enables the default NXP factory data provider implementation that + supports reading the factory data encoded in the KLV format from the + flash memory partition. This option requires a fixed partition named + "factory_partition" declared on the device tree. Factory data partition + can be generated during build process, see CHIP_FACTORY_DATA_BUILD Kconfig. + +config CHIP_FACTORY_DATA_CUSTOM_BACKEND + bool "Custom factory data provider" + depends on !CHIP_FACTORY_DATA + help + Enables user's custom factory data provider implementation. This option + cannot be used with the CHIP_FACTORY_DATA, which enables the default NXP + factory data provider implementation. + +config CHIP_FACTORY_DATA_BUILD + bool "Generate factory data contents" + default n + imply CHIP_FACTORY_DATA + help + Enables generation of the factory data contents during the building. This + option requires a fixed partition named "factory_partition" declared on the + device tree. + +config CHIP_FACTORY_DATA_VERSION + int + default 1 + help + Provides the version of the generated factory data parameter set. This is + a hidden configuration option that the user cannot change. You can use + this value in the factory data provider implementation to verify that the + factory data saved in the flash memory has the expected version. + +config CHIP_FACTORY_DATA_ROTATING_DEVICE_UID_MAX_LEN + int "Maximum length of rotating device ID unique ID in bytes" + default 16 + depends on CHIP_FACTORY_DATA + help + Maximum acceptable length of rotating device ID unique ID in bytes. + +if CHIP_FACTORY_DATA + +config CHIP_ENCRYPTED_FACTORY_DATA_AES128_KEY + string "AES128 key used to encrypt factory data." + default "2B7E151628AED2A6ABF7158809CF4F3C" + help + AES128 key used to encrypt factory data. + +config CHIP_ENCRYPTED_FACTORY_DATA + bool "Encrypt factory data with AES128 ECB." + default y + help + If enabled, the factory data partition will be encrypted with AES128 ECB. + +config CHIP_DEVICE_PRODUCT_URL + string "Product URL" + help + Provides the URL to the product page. The URL is exposed as an attribute + of the Basic Information cluster. + +config CHIP_DEVICE_PRODUCT_LABEL + string "Product label" + help + Provides the product label. The label is exposed as an attribute + of the Basic Information cluster. + +config CHIP_DEVICE_PART_NUMBER + string "Part number" + help + Provides the part number. The part number is exposed as an attribute + of the Basic Information cluster. + +endif + +if CHIP_FACTORY_DATA_BUILD + +# Factory data definitions +config CHIP_FACTORY_DATA_GENERATE_ONBOARDING_CODES + bool "Generate onboarding codes during the generation of a factory data set" + help + Enables generation of onboarding codes (manual pairing code and QR code) + during the generation of a factory data set. You can provide the + onboarding codes a Matter controller to commission a device to a Matter + network. + +# Select source of the certificates +choice CHIP_FACTORY_DATA_CERT_SOURCE + prompt "Attestation certificate file source" + default CHIP_FACTORY_DATA_USE_DEFAULT_CERTS + + config CHIP_FACTORY_DATA_USE_DEFAULT_CERTS + bool "Use pre-generated development certificates" + help + Uses pre-generated certificate files from the + credentials/development/attestation/ directory that match the + configured Product ID. This can be used for development purpose. + + config CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED + bool "Auto-generate certificates" + help + Generates new certificates instead of using pre-generated ones. The + certificates are generated on every build. + + config CHIP_FACTORY_DATA_CERT_SOURCE_USER + bool "Use user-provided certificate files" + help + Uses user-provided certificate files. The user needs to specify the + absolute paths to all necessary files. + +endchoice + +if CHIP_FACTORY_DATA_CERT_SOURCE_USER + +config CHIP_FACTORY_DATA_USER_CERTS_CD_CERT + string "Path to the CD certificate (DER format)" + help + Provides the absolute path to the CD certificate file in the DER format. + +config CHIP_FACTORY_DATA_USER_CERTS_DAC_CERT + string "Path to the DAC certificate (DER format)" + help + Provides the absolute path to the DAC certificate file in the DER format. + +config CHIP_FACTORY_DATA_USER_CERTS_DAC_KEY + string "Path to the DAC private key (DER format)" + help + Provides the absolute path to the DAC keypair file in the DER format. Both + public and private keys must be present (the private key will be extracted + automatically). + +config CHIP_FACTORY_DATA_USER_CERTS_PAI_CERT + string "Path to the PAI certificate (DER format)" + help + Provides the absolute path to the PAI certificate in the DER format. +endif + +# Configs for SPAKE2+ generation +config CHIP_FACTORY_DATA_GENERATE_SPAKE2_VERIFIER + bool "Generate SPAKE2+ verifier" + help + Enables the generation of the SPAKE2+ verifier for the configured SPAKE2+ + passcode, iteration count and salt. + +config CHIP_DEVICE_GENERATE_ROTATING_DEVICE_UID + bool "Generate Rotating device ID unique ID" + default y + help + Enables the generation of a random Rotating device ID unique ID. + +endif #CHIP_FACTORY_DATA_BUILD + +# See config/zephyr/Kconfig for full definition +config CHIP_FACTORY_RESET_ERASE_NVS + bool + default y if CHIP_FACTORY_DATA || CHIP_FACTORY_DATA_CUSTOM_BACKEND + +endif + +config CHIP_LOG_SIZE_OPTIMIZATION + bool "Disable some detailed logs to decrease flash usage" + help + Disables some log levels for specific Matter log modules that provide + information that is too detailed to be used in most cases. You can find + full configuration enabled by this option in the + platform/nxp/CHIPPlatformConfig.h file. + +config CHIP_IPV4 + bool "IPv4 support for Matter" + default n + depends on NET_IPV4 + help + If disabled, it allows to build NXP SDK application + with IPv4 support independently of the Matter stack still + running over IPv6. + +config CHIP_OTA_REQUESTOR + bool + select BOOTLOADER_MCUBOOT + +config BOOTLOADER_MCUBOOT + bool + select IMG_MANAGER + select STREAM_FLASH + select STREAM_FLASH_ERASE + +config CHIP_OTA_REQUESTOR_BUFFER_SIZE + int "OTA Requestor image buffer size" + default 256 + depends on CHIP_OTA_REQUESTOR + help + Configures the size of the buffer used by OTA Requestor when downloading + and writing a new firmware image to flash. + +config CHIP_OTA_REQUESTOR_REBOOT_ON_APPLY + bool "Auto-reboot when firmware update is applied" + default y + depends on CHIP_OTA_REQUESTOR + imply REBOOT + help + Reboots the device automatically after downloading a new firmware update + to swap the old and the new firmware images. The reboot happens only when + a user consents to apply the firmware update. diff --git a/config/nxp/chip-module/Kconfig.defaults b/config/nxp/chip-module/Kconfig.defaults new file mode 100644 index 00000000000000..56c82e3752900c --- /dev/null +++ b/config/nxp/chip-module/Kconfig.defaults @@ -0,0 +1,381 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# The purpose of this file is to define new default values of settings used when building Matter samples. +# This file only changes defaults and thus all symbols here must be promptless +# and safeguarded so that they only are applied when building Matter. + +if CHIP + +config CHIP_OPERATIONAL_TIME_SAVE_INTERVAL + default 1 + +if CHIP_FACTORY_DATA + +config CHIP_DEVICE_VENDOR_ID + default 4151 # 0x1037 + +config CHIP_DEVICE_MANUFACTURING_DATE + default "2023-01-01" + +config CHIP_DEVICE_PRODUCT_ID + default 41510 if SOC_SERIES_RW6XX + +endif # CHIP_FACTORY_DATA + +config LOG + default y + +if LOG + +choice LOG_MODE + default LOG_MODE_MINIMAL +endchoice + +choice MATTER_LOG_LEVEL_CHOICE + default MATTER_LOG_LEVEL_DBG +endchoice + +config CHIP_APP_LOG_LEVEL + default 4 # debug + +config LOG_DEFAULT_LEVEL + default 1 # error + +config CHIP_LOG_SIZE_OPTIMIZATION + default y + +endif + +config PRINTK_SYNC + default y + +config ASSERT + default y + +config ASSERT_NO_COND_INFO + default y + +config ASSERT_NO_MSG_INFO + default y + +config HW_STACK_PROTECTION + default y + +config FPU + default y + +config SHELL + default y + +config PTHREAD_IPC + bool + default n + +config POSIX_MAX_FDS + int + default 16 + +# Application stack size +config MAIN_STACK_SIZE + default 8192 + +config INIT_STACKS + default y + +config NET_MGMT_EVENT_STACK_SIZE + default 2048 + +config NET_IPV6_MLD + default y + +config NET_IF_MCAST_IPV6_ADDR_COUNT + default 14 + +config NET_TC_TX_COUNT + default 1 + +config NET_TC_RX_COUNT + default 1 + +config NET_TC_THREAD_PRIO_CUSTOM + default y + +choice NET_TC_THREAD_TYPE + default NET_TC_THREAD_PREEMPTIVE +endchoice + +config NET_TCP_WORK_QUEUE_THREAD_PRIO + default -16 + +config NET_TC_TX_THREAD_BASE_PRIO + default 3 + +config NET_TC_RX_THREAD_BASE_PRIO + default 3 + +# Network buffers +config NET_PKT_RX_COUNT + default 16 + +config NET_PKT_TX_COUNT + default 16 + +config NET_BUF_RX_COUNT + default 60 + +config NET_BUF_TX_COUNT + default 80 + +config NET_BUF_DATA_SIZE + default 1700 + +# Bluetooth Low Energy configs + +config BT + default y + +config BT_PERIPHERAL + default y + +config BT_CENTRAL + default n + +config BT_PERIPHERAL_PREF_MIN_INT + default 36 + +config BT_PERIPHERAL_PREF_MAX_INT + default 36 + +# Increase BT timeout to 5 s to improve connection reliability and avoid fast drop outs. +config BT_PERIPHERAL_PREF_TIMEOUT + default 500 + +config BT_GAP_AUTO_UPDATE_CONN_PARAMS + default y + +# Decrease connection parameters update time, as some Matter controllers request +# enabling IP networking faster than BT connection parameters are updated, what may result +# in commissioning instabilities. +config BT_CONN_PARAM_UPDATE_TIMEOUT + default 1000 + +config BT_GATT_DYNAMIC_DB + default y + +config BT_DEVICE_NAME_DYNAMIC + default y + +config BT_DEVICE_NAME_MAX + default 15 + +config BT_MAX_CONN + default 1 + +config BT_L2CAP_TX_MTU + default 247 + +config BT_BUF_ACL_RX_SIZE + default 251 + +config BT_BUF_ACL_TX_SIZE + default 251 + +config BT_RX_STACK_SIZE + default 2048 if NO_OPTIMIZATIONS && DEBUG + default 1536 + +config BT_DEVICE_NAME_GATT_WRITABLE + bool + default n + +config HCI_NXP_ENABLE_AUTO_SLEEP + default n + +config CHIP_OTA_REQUESTOR + default n + +# Enable extended discovery +config CHIP_EXTENDED_DISCOVERY + default y + +config NVS_LOOKUP_CACHE + default y + +config NVS_LOOKUP_CACHE_SIZE + default 512 + +if CHIP_WIFI + +choice SCHED_ALGORITHM + default SCHED_MULTIQ +endchoice + +choice LIBC_IMPLEMENTATION + default NEWLIB_LIBC +endchoice + +choice WPA_SUPP_LOG_LEVEL_CHOICE + default WPA_SUPP_LOG_LEVEL_ERR +endchoice + +config WPA_SUPP_THREAD_STACK_SIZE + default 6144 + +config SYSTEM_WORKQUEUE_STACK_SIZE + default 2048 + +# align these numbers to match the OpenThread config +config NET_IF_UNICAST_IPV6_ADDR_COUNT + default 6 + +config NET_IF_MCAST_IPV6_ADDR_COUNT + default 8 + +config NET_SOCKETS_POLL_MAX + default 4 + +# options managed by IP4/IP6 simultaneous support +# aligned here to match OpenThread config +config NET_MAX_ROUTERS + default 1 + +config NET_MAX_CONN + default 4 + +config SHELL_STACK_SIZE + default 2616 + +config HEAP_MEM_POOL_SIZE + default 65536 + +config CHIP_MALLOC_SYS_HEAP_SIZE + default 28672 # 28 kB + +endif + +# Configure MBEDTLS lib +config MBEDTLS + default y + +config MBEDTLS_CFG_FILE + default "config-tls-generic.h" + +config MBEDTLS_USER_CONFIG_ENABLE + default y + +config MBEDTLS_USER_CONFIG_FILE + default "nxp-zephyr-mbedtls-config.h" + +config MBEDTLS_ENTROPY_ENABLED + default y + +config MBEDTLS_ZEPHYR_ENTROPY + default y + +config MBEDTLS_ENABLE_HEAP + default y + +config MBEDTLS_HEAP_SIZE + default 15360 + +config MBEDTLS_CIPHER_AES_ENABLED + default y + +config MBEDTLS_CIPHER_CCM_ENABLED + default y + +config MBEDTLS_CTR_DRBG_ENABLED + default y + +config MBEDTLS_CIPHER_MODE_CBC_ENABLED + default y + +config MBEDTLS_ECP_C + default y + +config MBEDTLS_ECP_DP_SECP256R1_ENABLED + default y + +if CHIP_CRYPTO_PSA + +config MBEDTLS_PSA_CRYPTO_C + default y + +config WPA_SUPP_CRYPTO_MBEDTLS_PSA + default y if WPA_SUPP_CRYPTO + +endif + +config MCUX_ELS_PKC + default y if SOC_SERIES_RW6XX + +if MCUX_ELS_PKC + +config KSDK_MBEDTLS + default n + +config MCUX_PSA_CRYPTO_DRIVER_ELS_PKC + default y if MBEDTLS_PSA_CRYPTO_C + +config ENTROPY_GENERATOR + default y + +endif # MCUX_ELS_PKC + + +if SHELL + +config KERNEL_SHELL + default y + +config DEVICE_SHELL + default y + +config REBOOT + default y + +# Disable not used shell modules +config SHELL_WILDCARD + default n + +config SHELL_VT100_COLORS + default n + +config SHELL_STATS + default n + +config SENSOR_SHELL + default n + +config DATE_SHELL + default n + +config DEVMEM_SHELL + default n + +config MCUBOOT_SHELL + default n + +config FLASH_SHELL + default n + +endif # SHELL + +endif + +config NXP_FW_LOADER_MONOLITHIC + default y if NXP_FW_LOADER diff --git a/config/nxp/chip-module/Kconfig.features b/config/nxp/chip-module/Kconfig.features new file mode 100644 index 00000000000000..d8d194ccef2b41 --- /dev/null +++ b/config/nxp/chip-module/Kconfig.features @@ -0,0 +1,74 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# The purpose of this file is to define Kconfig options enabling specific features. +# Feature options will define defaults for settings that are related to the specific feature. + +if CHIP + +config CHIP_WIFI + bool "Enable NXP Wi-Fi support" + default y + select WIFI + select WIFI_NXP + select WPA_SUPP + select WPA_SUPP_AP + select WPA_SUPP_WPS + select WPA_SUPP_WPA3 + select WPA_SUPP_CRYPTO_ENTERPRISE + imply MBEDTLS_ENTROPY_C + imply NET_STATISTICS + imply NET_PKT_TXTIME + imply NET_PKT_TIMESTAMP + imply NET_IPV6_ND # enable Neighbor Discovery to handle Router Advertisements + imply NET_IPV6_NBR_CACHE + imply NET_STATISTICS_IPV6 + imply NET_STATISTICS_USER_API + +config CHIP_WIFI_CONNECTION_RECOVERY_MINIMUM_INTERVAL + int "Define the minimum connection recovery time interval in milliseconds" + depends on CHIP_WIFI + default 500 + help + Specifies the minimum connection recovery interval (in milliseconds). + +config CHIP_WIFI_CONNECTION_RECOVERY_MAXIMUM_INTERVAL + int "Define the maximum connection recovery time interval in milliseconds" + depends on CHIP_WIFI + default 3600000 # 1 hour + help + Specifies the maximum connection recovery interval (in milliseconds). + +config CHIP_WIFI_CONNECTION_RECOVERY_MAX_RETRIES_NUMBER + int "Define the maximum amount of connection recovery occurrences" + depends on CHIP_WIFI + default 0 + help + Specifies the maximum number of connection recovery attempts. + If set to 0, no limitation is applied and attempts + to recover the connection are performed indefinitely. + +config CHIP_WIFI_CONNECTION_RECOVERY_JITTER + int "Define the connection recovery jitter in milliseconds" + depends on CHIP_WIFI + default 2000 + help + Specifies the maximum connection recovery jitter interval (in milliseconds). + Once the wait time reaches the current maximum value (defined by CHIP_WIFI_CONNECTION_RECOVERY_MAXIMUM_INTERVAL), + a random jitter interval is added to it to avoid periodicity. The random jitter is selected + within range [-JITTER; +JITTER]. + +endif # CHIP diff --git a/config/nxp/chip-module/generate_factory_data.cmake b/config/nxp/chip-module/generate_factory_data.cmake new file mode 100644 index 00000000000000..ea1e35a797ab78 --- /dev/null +++ b/config/nxp/chip-module/generate_factory_data.cmake @@ -0,0 +1,229 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Generate certificates based on factory data given via Kconfigs. +# +# This function creates a list of arguments for external script and then run it to generate certificates. +# +# During generation process a some file will be created in zephyr's build directory: +# - Chip-PAI-NXP---Cert.der +# - Chip-PAI-NXP---Key.der +# - Chip-DAC-NXP---Cert.der +# - Chip-DAC-NXP---Key.der +# +# [Args]: +# script_path - a path to script that generates the certificates. +# output_path - a path to output directory, where generated certificates will be stored. +function(nxp_generate_certs script_path output_path) + if(NOT EXISTS ${CHIP_ROOT}/out/chip-cert) + message(FATAL_ERROR "Couldn't find chip-cert in ${CHIP_ROOT}/out folder. + Run following command from ${CHIP_ROOT} to build it: + gn gen out + ninja -C out chip-cert") + endif() + + # generate all script arguments + set(script_args) + string(APPEND script_args "--gen_cd\n") + string(APPEND script_args "--cd_type \"1\"\n") + string(APPEND script_args "--chip_cert_path ${CHIP_ROOT}/out/chip-cert\n") + string(APPEND script_args "--vendor_id ${CONFIG_CHIP_DEVICE_VENDOR_ID}\n") + string(APPEND script_args "--product_id ${CONFIG_CHIP_DEVICE_PRODUCT_ID}\n") + string(APPEND script_args "--vendor_name \"${CONFIG_CHIP_DEVICE_VENDOR_NAME}\"\n") + string(APPEND script_args "--product_name \"${CONFIG_CHIP_DEVICE_PRODUCT_NAME}\"\n") + string(APPEND script_args "--device_type \"${CONFIG_CHIP_DEVICE_TYPE}\"\n") + string(APPEND script_args "--output \"${output_path}\"\n") + + # convert decimal VID to its hexadecimal representation to find out certification files in repository + math(EXPR LOCAL_VID "${CONFIG_CHIP_DEVICE_VENDOR_ID}" OUTPUT_FORMAT HEXADECIMAL) + string(SUBSTRING ${LOCAL_VID} 2 -1 raw_vid) + string(TOUPPER ${raw_vid} raw_vid_upper) + + # convert decimal PID to its hexadecimal representation to find out certification files in repository + math(EXPR LOCAL_PID "${CONFIG_CHIP_DEVICE_PRODUCT_ID}" OUTPUT_FORMAT HEXADECIMAL) + string(SUBSTRING ${LOCAL_PID} 2 -1 raw_pid) + string(TOUPPER ${raw_pid} raw_pid_upper) + + # execute the script which can generate the certificates + separate_arguments(separated_script_args NATIVE_COMMAND ${script_args}) + add_custom_command( + OUTPUT + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.pem + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.pem + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.pem + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.pem + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.der + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.der + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.der + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.der + DEPENDS ${script_path} + COMMAND ${Python3_EXECUTABLE} ${script_path} ${separated_script_args} + COMMENT "Generating new certificates..." + ) + add_custom_target(chip-certificates ALL + DEPENDS + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.pem + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.pem + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.pem + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.pem + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.der + ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.der + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.der + ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.der + ) +endfunction() + +# Create a .bin file with factory data in KLV format. +# +# This function creates a .bin file from given Kconfig. +# +# During generation process, following files will be created in zephyr's build directory: +# - .bin a binary file containing all raw factory data in KLV format. +# +# [Args]: +# script_path - a path to script that makes a factory data .bin file from given arguments. +# output_path - a path to output directory, where created bin file will be stored. +function(nxp_generate_factory_data_bin script_path output_path) + if(NOT EXISTS ${CHIP_ROOT}/out/spake2p) + message(FATAL_ERROR "Couldn't find spake2p in ${CHIP_ROOT}/out folder. + Run following command from ${CHIP_ROOT} to build it: + gn gen out + ninja -C out spake2p") + endif() + + # convert decimal VID to its hexadecimal representation to find out certification files in repository + math(EXPR LOCAL_VID "${CONFIG_CHIP_DEVICE_VENDOR_ID}" OUTPUT_FORMAT HEXADECIMAL) + string(SUBSTRING ${LOCAL_VID} 2 -1 raw_vid) + string(TOUPPER ${raw_vid} raw_vid_upper) + + # convert decimal PID to its hexadecimal representation to find out certification files in repository + math(EXPR LOCAL_PID "${CONFIG_CHIP_DEVICE_PRODUCT_ID}" OUTPUT_FORMAT HEXADECIMAL) + string(SUBSTRING ${LOCAL_PID} 2 -1 raw_pid) + string(TOUPPER ${raw_pid} raw_pid_upper) + + # generate all script arguments + set(script_args) + string(APPEND script_args "--it \"${CONFIG_CHIP_DEVICE_SPAKE2_IT}\"\n") + string(APPEND script_args "--salt \"${CONFIG_CHIP_DEVICE_SPAKE2_SALT}\"\n") + string(APPEND script_args "--discriminator ${CONFIG_CHIP_DEVICE_DISCRIMINATOR}\n") + string(APPEND script_args "--passcode ${CONFIG_CHIP_DEVICE_SPAKE2_PASSCODE}\n") + string(APPEND script_args "--vid ${CONFIG_CHIP_DEVICE_VENDOR_ID}\n") + string(APPEND script_args "--pid ${CONFIG_CHIP_DEVICE_PRODUCT_ID}\n") + string(APPEND script_args "--vendor_name \"${CONFIG_CHIP_DEVICE_VENDOR_NAME}\"\n") + string(APPEND script_args "--product_name \"${CONFIG_CHIP_DEVICE_PRODUCT_NAME}\"\n") + string(APPEND script_args "--hw_version ${CONFIG_CHIP_DEVICE_HARDWARE_VERSION}\n") + string(APPEND script_args "--hw_version_str \"${CONFIG_CHIP_DEVICE_HARDWARE_VERSION_STRING}\"\n") + string(APPEND script_args "--spake2p_path \"${CHIP_ROOT}/out/spake2p\"\n") + string(APPEND script_args "--serial_num \"${CONFIG_CHIP_DEVICE_SERIAL_NUMBER}\"\n") + string(APPEND script_args "--date \"${CONFIG_CHIP_DEVICE_MANUFACTURING_DATE}\"\n") + string(APPEND script_args "--unique_id \"${CONFIG_CHIP_DEVICE_ROTATING_DEVICE_UID}\"\n") + string(APPEND script_args "--product_finish ${CONFIG_CHIP_DEVICE_PRODUCT_FINISH}\n") + string(APPEND script_args "--product_url ${CONFIG_CHIP_DEVICE_PRODUCT_URL}\n") + string(APPEND script_args "--product_label ${CONFIG_CHIP_DEVICE_PRODUCT_LABEL}\n") + string(APPEND script_args "--part_number ${CONFIG_CHIP_DEVICE_PART_NUMBER}\n") + string(APPEND script_args "--out \"${output_path}/factory_data.bin\"\n") + + # for development purpose user can use default certs instead of generating or providing them + if(CONFIG_CHIP_FACTORY_DATA_USE_DEFAULT_CERTS) + # all certs are located in ${CHIP_ROOT}/credentials/development/attestation + # it can be used during development without need to generate new certifications + set(cd_cert ${CHIP_ROOT}/credentials/development/cd-certs/Chip-Test-CD-Cert.der) + set(dac_cert ${CHIP_ROOT}/credentials/development/attestation/Matter-Development-DAC-${raw_vid_upper}-${raw_pid_upper}-Cert.der) + set(dac_key ${CHIP_ROOT}/credentials/development/attestation/Matter-Development-DAC-${raw_vid_upper}-${raw_pid_upper}-Key.der) + set(pai_cert ${CHIP_ROOT}/credentials/development/attestation/Matter-Development-PAI-${raw_vid_upper}-noPID-Cert.der) + elseif(CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_USER) + set(cd_cert ${CONFIG_CHIP_FACTORY_DATA_USER_CERTS_CD_CERT}) + set(dac_cert ${CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_CERT}) + set(dac_key ${CONFIG_CHIP_FACTORY_DATA_USER_CERTS_DAC_KEY}) + set(pai_cert ${CONFIG_CHIP_FACTORY_DATA_USER_CERTS_PAI_CERT}) + elseif(CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED) + set(cd_cert ${output_path}/Chip-Test-CD-${raw_vid_upper}-${raw_pid_upper}.der) + set(dac_cert ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.der) + set(dac_key ${output_path}/Chip-DAC-NXP-${raw_vid_upper}-${raw_pid_upper}-Key.der) + set(pai_cert ${output_path}/Chip-PAI-NXP-${raw_vid_upper}-${raw_pid_upper}-Cert.der) + else() + message(FATAL_ERROR "Either CONFIG_CHIP_FACTORY_DATA_USE_DEFAULT_CERTS or CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_USER + or CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED must be defined. + See ${CHIP_ROOT}/config/nxp/chip-module/Kconfig for details.") + endif() + + string(APPEND script_args "--cert_declaration \"${cd_cert}\"\n") + string(APPEND script_args "--dac_cert \"${dac_cert}\"\n") + string(APPEND script_args "--dac_key \"${dac_key}\"\n") + string(APPEND script_args "--pai_cert \"${pai_cert}\"\n") + + # check if spake2 verifier should be generated using script + if(NOT CONFIG_CHIP_FACTORY_DATA_GENERATE_SPAKE2_VERIFIER) + # Spake2 verifier should be provided using Kconfig + string(APPEND script_args "--spake2p_verifier \"${CONFIG_CHIP_DEVICE_SPAKE2_TEST_VERIFIER}\"\n") + endif() + + if(CONFIG_CHIP_ENCRYPTED_FACTORY_DATA) + if(NOT CONFIG_CHIP_ENCRYPTED_FACTORY_DATA_AES128_KEY) + message(FATAL_ERROR "CONFIG_CHIP_ENCRYPTED_FACTORY_DATA_AES128_KEY is required when using CONFIG_CHIP_ENCRYPTED_FACTORY_DATA !") + endif() + + string(APPEND script_args "--aes128_key \"${CONFIG_CHIP_ENCRYPTED_FACTORY_DATA_AES128_KEY}\"\n") + endif() + + if(CONFIG_CHIP_DEVICE_PRODUCT_COLOR) + string(APPEND script_args "--product_primary_color ${CONFIG_CHIP_DEVICE_PRODUCT_COLOR}\n") + endif() + + # execute the script which can generate the factory_data.bin file + separate_arguments(separated_script_args NATIVE_COMMAND ${script_args}) + add_custom_command( + OUTPUT ${output_path}/factory_data.bin + DEPENDS ${script_path} + COMMAND ${Python3_EXECUTABLE} ${script_path} ${separated_script_args} + COMMENT "Generating new Factory Data..." + ) + add_custom_target(factory_data ALL + DEPENDS ${output_path}/factory_data.bin + ) + + if(CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED) + # Make sure certificates are generated before trying to generate factory data + add_dependencies(factory_data chip-certificates) + endif() +endfunction() + +# Generate factory data partition using given args +# +# During generation process a some file will be created in zephyr's build directory: +# - factory_data.bin: a raw binary file containing the factory data partition +# - CD, PAI, DEC certificates if CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED is set +# +function(nxp_generate_factory_data) + find_package(Python REQUIRED) + + # CHIP_ROOT must be provided as a reference set all localization of scripts + if(NOT CHIP_ROOT) + message(FATAL_ERROR "CHIP_ROOT variable is not set, please add it to CMakeLists.txt file") + endif() + + # Localize all scripts needed to generate factory data partition + set(GENERATE_CERTS_SCRIPT_PATH ${CHIP_ROOT}/scripts/tools/nxp/generate_certs.py) + set(GENERATE_FDATA_SCRIPT_PATH ${CHIP_ROOT}/scripts/tools/nxp/factory_data_generator/generate.py) + set(OUTPUT_FILE_PATH ${APPLICATION_BINARY_DIR}/zephyr) + + if(CONFIG_CHIP_FACTORY_DATA_CERT_SOURCE_GENERATED) + # Generate certificates + nxp_generate_certs(${GENERATE_CERTS_SCRIPT_PATH} ${OUTPUT_FILE_PATH}) + endif() + + nxp_generate_factory_data_bin(${GENERATE_FDATA_SCRIPT_PATH} ${OUTPUT_FILE_PATH}) +endfunction() diff --git a/config/nxp/chip-module/zephyr/module.yml b/config/nxp/chip-module/zephyr/module.yml new file mode 100644 index 00000000000000..870b1a37e35231 --- /dev/null +++ b/config/nxp/chip-module/zephyr/module.yml @@ -0,0 +1,22 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +name: connectedhomeip +build: + cmake: . + kconfig: Kconfig + depends: + - openthread diff --git a/config/qpg/lib/pw_rpc/BUILD.gn b/config/qpg/lib/pw_rpc/BUILD.gn index bd633d591b3577..99c64201f5df19 100644 --- a/config/qpg/lib/pw_rpc/BUILD.gn +++ b/config/qpg/lib/pw_rpc/BUILD.gn @@ -36,7 +36,6 @@ static_library("pw_rpc") { "$dir_pw_rpc:server", "$dir_pw_rpc/nanopb:echo_service", "${chip_root}/examples/platform/qpg/pw_sys_io:pw_sys_io_qpg", - "${dir_pigweed}/pw_hdlc:pw_rpc", dir_pw_assert, dir_pw_checksum, dir_pw_hdlc, diff --git a/config/zephyr/Kconfig b/config/zephyr/Kconfig index bd4b52ecb7a193..8df6c418aa42e3 100644 --- a/config/zephyr/Kconfig +++ b/config/zephyr/Kconfig @@ -17,12 +17,12 @@ menuconfig CHIP bool "Matter protocol stack" default n - select CPLUSPLUS - imply LIB_CPLUSPLUS + select CPP + imply REQUIRES_FULL_LIBCPP imply REQUIRES_FULL_LIBC imply NEWLIB_LIBC_NANO imply CBPRINTF_LIBC_SUBSTS - imply POSIX_API if !ARCH_POSIX && !CHIP_NRF_PLATFORM + imply POSIX_API if !ARCH_POSIX && !CHIP_NRF_PLATFORM && !CHIP_NXP_PLATFORM imply EVENTFD if !ARCH_POSIX imply REBOOT imply ENTROPY_GENERATOR @@ -30,7 +30,7 @@ menuconfig CHIP imply NET_IPV6 imply NET_CONFIG_NEED_IPV6 imply NET_SOCKETS - imply NET_SOCKETS_POSIX_NAMES if !ARCH_POSIX && CHIP_NRF_PLATFORM + imply NET_SOCKETS_POSIX_NAMES if !ARCH_POSIX && (CHIP_NRF_PLATFORM || CHIP_NXP_PLATFORM) imply NETWORKING imply HWINFO imply FLASH diff --git a/data_model/ValveConfigurationControl.xml b/data_model/ValveConfigurationControl.xml deleted file mode 100644 index 2d1554df10df59..00000000000000 --- a/data_model/ValveConfigurationControl.xml +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/data_model/clusters/BooleanStateConfiguration.xml b/data_model/clusters/BooleanStateConfiguration.xml index 0b60a3e6b9f557..160cb7fadb7a93 100644 --- a/data_model/clusters/BooleanStateConfiguration.xml +++ b/data_model/clusters/BooleanStateConfiguration.xml @@ -68,7 +68,12 @@ Davis, CA 95616, USA - + + + + + + @@ -130,13 +135,7 @@ Davis, CA 95616, USA - - - - - - - + diff --git a/data_model/clusters/ConcentrationMeasurement.xml b/data_model/clusters/ConcentrationMeasurement.xml index 7351a0951e003f..c5e2971406f676 100644 --- a/data_model/clusters/ConcentrationMeasurement.xml +++ b/data_model/clusters/ConcentrationMeasurement.xml @@ -1,59 +1,59 @@ - @@ -62,6 +62,7 @@ Davis, CA 95616, USA + @@ -260,4 +261,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/clusters/ContentAppObserver.xml b/data_model/clusters/ContentAppObserver.xml index 4d292cc3e6b2d7..b426daa5ec3379 100644 --- a/data_model/clusters/ContentAppObserver.xml +++ b/data_model/clusters/ContentAppObserver.xml @@ -76,9 +76,11 @@ Davis, CA 95616, USA + + @@ -89,9 +91,11 @@ Davis, CA 95616, USA + + diff --git a/data_model/clusters/DeviceEnergyManagement.xml b/data_model/clusters/DeviceEnergyManagement.xml index fe2358e36854cb..6d6477cc72fb7c 100644 --- a/data_model/clusters/DeviceEnergyManagement.xml +++ b/data_model/clusters/DeviceEnergyManagement.xml @@ -55,41 +55,88 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + + - + + adjustment (within the limits offered by the ESA)."> + future power consumption vs time."> - + + + + + + + + + + + + future state vs time."> - + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + @@ -103,6 +150,9 @@ Davis, CA 95616, USA + + + @@ -128,15 +178,12 @@ Davis, CA 95616, USA - - - - + - + @@ -189,6 +236,31 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + + + + + + + + @@ -261,13 +333,13 @@ Davis, CA 95616, USA - + - + @@ -280,6 +352,10 @@ Davis, CA 95616, USA + + + + @@ -339,15 +415,21 @@ Davis, CA 95616, USA - + + + - + + + - + + + @@ -429,6 +511,109 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -453,15 +638,18 @@ Davis, CA 95616, USA - - - + + + - - - + + + + + + \ No newline at end of file diff --git a/data_model/clusters/EnergyEVSE.xml b/data_model/clusters/EnergyEVSE.xml index 52cf89fecee8a7..c788edc054ede0 100644 --- a/data_model/clusters/EnergyEVSE.xml +++ b/data_model/clusters/EnergyEVSE.xml @@ -60,7 +60,7 @@ Davis, CA 95616, USA - + @@ -79,6 +79,8 @@ Davis, CA 95616, USA + + @@ -212,6 +214,17 @@ Davis, CA 95616, USA + + + + + + + + + + + @@ -220,7 +233,12 @@ Davis, CA 95616, USA - + + + + + + @@ -293,20 +311,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - @@ -398,14 +402,10 @@ Davis, CA 95616, USA - + + - - - - - - + @@ -451,14 +451,10 @@ Davis, CA 95616, USA - + + - - - - - - + @@ -466,10 +462,6 @@ Davis, CA 95616, USA - - - - diff --git a/data_model/clusters/FanControl.xml b/data_model/clusters/FanControl.xml index e3ac9f85cc4c16..acf1d59e54d91e 100644 --- a/data_model/clusters/FanControl.xml +++ b/data_model/clusters/FanControl.xml @@ -59,12 +59,12 @@ Davis, CA 95616, USA - + - + @@ -79,7 +79,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/ICDManagement.xml b/data_model/clusters/ICDManagement.xml index efd974dece9fe4..f138e7037687b6 100644 --- a/data_model/clusters/ICDManagement.xml +++ b/data_model/clusters/ICDManagement.xml @@ -1,59 +1,59 @@ - @@ -69,6 +69,14 @@ Davis, CA 95616, USA + + + + + + + + @@ -83,14 +91,6 @@ Davis, CA 95616, USA - - - - - - - - @@ -133,13 +133,6 @@ Davis, CA 95616, USA - - - - - - - @@ -210,4 +203,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/clusters/MediaPlayback.xml b/data_model/clusters/MediaPlayback.xml index b01562cadf055a..f2cdf5c4a7c851 100644 --- a/data_model/clusters/MediaPlayback.xml +++ b/data_model/clusters/MediaPlayback.xml @@ -203,22 +203,12 @@ Davis, CA 95616, USA - - - - - - - - - - diff --git a/data_model/clusters/MicrowaveOvenControl.xml b/data_model/clusters/MicrowaveOvenControl.xml index dd60600c792beb..c95d713714854f 100644 --- a/data_model/clusters/MicrowaveOvenControl.xml +++ b/data_model/clusters/MicrowaveOvenControl.xml @@ -61,12 +61,17 @@ Davis, CA 95616, USA - + - + + + + + + @@ -90,26 +95,26 @@ Davis, CA 95616, USA - - - - + + + + - - - - + + + + - - - - + + + + @@ -137,7 +142,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/ModeBase.xml b/data_model/clusters/ModeBase.xml index 179a6ade6ab7fc..1e6a81807e29a2 100644 --- a/data_model/clusters/ModeBase.xml +++ b/data_model/clusters/ModeBase.xml @@ -63,12 +63,6 @@ Require at least one standard mode tag. Define reserved ranges for base/derived - - - - - - @@ -104,12 +98,6 @@ Require at least one standard mode tag. Define reserved ranges for base/derived - - - - - - @@ -139,12 +127,6 @@ Require at least one standard mode tag. Define reserved ranges for base/derived - - - - - - diff --git a/data_model/clusters/Mode_DeviceEnergyManagement.xml b/data_model/clusters/Mode_DeviceEnergyManagement.xml new file mode 100644 index 00000000000000..dc28204cecb511 --- /dev/null +++ b/data_model/clusters/Mode_DeviceEnergyManagement.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data_model/clusters/Mode_EVSE.xml b/data_model/clusters/Mode_EVSE.xml index d52139252d014d..2a600e3e381325 100644 --- a/data_model/clusters/Mode_EVSE.xml +++ b/data_model/clusters/Mode_EVSE.xml @@ -55,9 +55,9 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + - + \ No newline at end of file diff --git a/data_model/clusters/Mode_RVCClean.xml b/data_model/clusters/Mode_RVCClean.xml index b82c26501f1196..64118517a03c1b 100644 --- a/data_model/clusters/Mode_RVCClean.xml +++ b/data_model/clusters/Mode_RVCClean.xml @@ -58,9 +58,23 @@ Davis, CA 95616, USA - + + + + + + + + + + + + + + + diff --git a/data_model/clusters/Mode_RVCRun.xml b/data_model/clusters/Mode_RVCRun.xml index 7ea4183603482c..8f49741f7cfeb8 100644 --- a/data_model/clusters/Mode_RVCRun.xml +++ b/data_model/clusters/Mode_RVCRun.xml @@ -58,9 +58,23 @@ Davis, CA 95616, USA - + + + + + + + + + + + + + + + diff --git a/data_model/clusters/Mode_WaterHeater.xml b/data_model/clusters/Mode_WaterHeater.xml index 535eb4d22dd7c7..69fba08b940293 100644 --- a/data_model/clusters/Mode_WaterHeater.xml +++ b/data_model/clusters/Mode_WaterHeater.xml @@ -55,7 +55,7 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + diff --git a/data_model/clusters/NetworkIdentityManagement.xml b/data_model/clusters/NetworkIdentityManagement.xml index e43eeaa615ba9a..08bee6af5871ff 100644 --- a/data_model/clusters/NetworkIdentityManagement.xml +++ b/data_model/clusters/NetworkIdentityManagement.xml @@ -120,7 +120,7 @@ Davis, CA 95616, USA - + @@ -131,7 +131,7 @@ Davis, CA 95616, USA - + @@ -142,7 +142,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/OperationalState.xml b/data_model/clusters/OperationalState.xml index 97fae41a3aa2ad..dcb5753b2c1998 100644 --- a/data_model/clusters/OperationalState.xml +++ b/data_model/clusters/OperationalState.xml @@ -58,7 +58,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/clusters/OperationalState_RVC.xml b/data_model/clusters/OperationalState_RVC.xml index 24166eb9fcd8dd..bc4e5505e45d6d 100644 --- a/data_model/clusters/OperationalState_RVC.xml +++ b/data_model/clusters/OperationalState_RVC.xml @@ -58,9 +58,32 @@ Davis, CA 95616, USA - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/clusters/ResourceMonitoring.xml b/data_model/clusters/ResourceMonitoring.xml index 8ac1186f7b3a99..9772efbd429982 100644 --- a/data_model/clusters/ResourceMonitoring.xml +++ b/data_model/clusters/ResourceMonitoring.xml @@ -1,65 +1,66 @@ - + @@ -170,4 +171,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/clusters/Scenes.xml b/data_model/clusters/Scenes.xml index daa9e5da564a41..2168c164a02460 100644 --- a/data_model/clusters/Scenes.xml +++ b/data_model/clusters/Scenes.xml @@ -55,28 +55,15 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + - - - - - + - - - - - - - - - @@ -84,20 +71,10 @@ Davis, CA 95616, USA - - - - - - - - - - - + @@ -150,6 +127,7 @@ Davis, CA 95616, USA + @@ -157,26 +135,24 @@ Davis, CA 95616, USA - + + - - - - - + + @@ -188,87 +164,45 @@ Davis, CA 95616, USA - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + - + - - - + - + + - + - + @@ -292,16 +226,18 @@ Davis, CA 95616, USA + - + + @@ -316,9 +252,10 @@ Davis, CA 95616, USA + - - + + @@ -328,13 +265,14 @@ Davis, CA 95616, USA - + + @@ -349,10 +287,11 @@ Davis, CA 95616, USA + - + @@ -370,13 +309,14 @@ Davis, CA 95616, USA - + + @@ -391,25 +331,27 @@ Davis, CA 95616, USA + - + + - + - + - + @@ -433,66 +375,8 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -501,17 +385,17 @@ Davis, CA 95616, USA - + - + - + @@ -525,7 +409,8 @@ Davis, CA 95616, USA + - + \ No newline at end of file diff --git a/data_model/clusters/Thermostat.xml b/data_model/clusters/Thermostat.xml index 8a09ea37e8948c..b7e811bb8738ae 100644 --- a/data_model/clusters/Thermostat.xml +++ b/data_model/clusters/Thermostat.xml @@ -85,21 +85,21 @@ Davis, CA 95616, USA - + - - + - + + - + - + @@ -225,6 +225,26 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + + + @@ -295,6 +315,21 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + @@ -416,26 +451,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - @@ -452,10 +467,12 @@ Davis, CA 95616, USA + + @@ -640,10 +657,12 @@ Davis, CA 95616, USA - + + + - + @@ -820,7 +839,7 @@ Davis, CA 95616, USA - + @@ -833,6 +852,22 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + @@ -842,7 +877,7 @@ Davis, CA 95616, USA - + @@ -899,7 +934,7 @@ Davis, CA 95616, USA - + @@ -907,7 +942,9 @@ Davis, CA 95616, USA - + + + \ No newline at end of file diff --git a/data_model/clusters/ValveConfigurationControl.xml b/data_model/clusters/ValveConfigurationControl.xml index 2d1554df10df59..32620ad9cce97d 100644 --- a/data_model/clusters/ValveConfigurationControl.xml +++ b/data_model/clusters/ValveConfigurationControl.xml @@ -161,6 +161,14 @@ Davis, CA 95616, USA + + + + + + + + diff --git a/data_model/clusters/WaterContentMeasurement.xml b/data_model/clusters/WaterContentMeasurement.xml index 15b613015444cb..bca3f6de8e4101 100644 --- a/data_model/clusters/WaterContentMeasurement.xml +++ b/data_model/clusters/WaterContentMeasurement.xml @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +--> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data_model/device_types/BaseDeviceType.xml b/data_model/device_types/BaseDeviceType.xml index 22cec956aa6061..a92816ac49d6e1 100644 --- a/data_model/device_types/BaseDeviceType.xml +++ b/data_model/device_types/BaseDeviceType.xml @@ -62,4 +62,23 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data_model/device_types/ColorDimmerSwitch.xml b/data_model/device_types/ColorDimmerSwitch.xml index 4de98619c1f9fb..0adcfcedcdc92a 100644 --- a/data_model/device_types/ColorDimmerSwitch.xml +++ b/data_model/device_types/ColorDimmerSwitch.xml @@ -1,59 +1,59 @@ - @@ -73,20 +73,17 @@ Davis, CA 95616, USA - - - - - - + + + - + \ No newline at end of file diff --git a/data_model/device_types/ColorTemperatureLight.xml b/data_model/device_types/ColorTemperatureLight.xml index 2e6db00535d3e3..210ce03b2da41c 100644 --- a/data_model/device_types/ColorTemperatureLight.xml +++ b/data_model/device_types/ColorTemperatureLight.xml @@ -1,59 +1,59 @@ - @@ -76,32 +76,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -132,6 +106,14 @@ Davis, CA 95616, USA + + + + + + + + @@ -155,4 +137,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/ContactSensor.xml b/data_model/device_types/ContactSensor.xml index e8a7c3f343a9f4..6fa5620a77bebb 100644 --- a/data_model/device_types/ContactSensor.xml +++ b/data_model/device_types/ContactSensor.xml @@ -55,9 +55,10 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + + @@ -68,5 +69,8 @@ Davis, CA 95616, USA + + + \ No newline at end of file diff --git a/data_model/device_types/ControlBridge.xml b/data_model/device_types/ControlBridge.xml index 6c73377045b533..f97439b77f8c3b 100644 --- a/data_model/device_types/ControlBridge.xml +++ b/data_model/device_types/ControlBridge.xml @@ -1,59 +1,59 @@ - @@ -74,18 +74,15 @@ required."/> - - - - - - + + + @@ -96,4 +93,4 @@ required."/> - + \ No newline at end of file diff --git a/data_model/device_types/CookSurface.xml b/data_model/device_types/CookSurface.xml index 34f5556234a6e5..a9548d3ac6e3dd 100644 --- a/data_model/device_types/CookSurface.xml +++ b/data_model/device_types/CookSurface.xml @@ -63,10 +63,10 @@ Davis, CA 95616, USA - + - + \ No newline at end of file diff --git a/data_model/device_types/Cooktop.xml b/data_model/device_types/Cooktop.xml index ea94653008d25a..233c72ed37590a 100644 --- a/data_model/device_types/Cooktop.xml +++ b/data_model/device_types/Cooktop.xml @@ -71,6 +71,9 @@ Davis, CA 95616, USA + + + diff --git a/data_model/device_types/DimmableLight.xml b/data_model/device_types/DimmableLight.xml index 777cf64847884b..ce5dce7c8bf192 100644 --- a/data_model/device_types/DimmableLight.xml +++ b/data_model/device_types/DimmableLight.xml @@ -1,59 +1,59 @@ - @@ -76,32 +76,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -113,10 +87,10 @@ Davis, CA 95616, USA - + - + @@ -132,6 +106,14 @@ Davis, CA 95616, USA + + + + + + + + @@ -142,4 +124,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/DimmablePlug-InUnit.xml b/data_model/device_types/DimmablePlug-InUnit.xml index 9a304fe9d18460..0756ed62baf9c0 100644 --- a/data_model/device_types/DimmablePlug-InUnit.xml +++ b/data_model/device_types/DimmablePlug-InUnit.xml @@ -1,59 +1,59 @@ - @@ -76,32 +76,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -132,6 +106,14 @@ Davis, CA 95616, USA + + + + + + + + @@ -142,4 +124,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/DimmerSwitch.xml b/data_model/device_types/DimmerSwitch.xml index 9922d6fb96dbcf..8be246f3a16056 100644 --- a/data_model/device_types/DimmerSwitch.xml +++ b/data_model/device_types/DimmerSwitch.xml @@ -1,59 +1,59 @@ - @@ -73,17 +73,14 @@ Davis, CA 95616, USA - - - - - - + + + - + \ No newline at end of file diff --git a/data_model/device_types/DoorLock.xml b/data_model/device_types/DoorLock.xml index c5eaf911f8f537..b7a0beaa3946e6 100644 --- a/data_model/device_types/DoorLock.xml +++ b/data_model/device_types/DoorLock.xml @@ -1,59 +1,59 @@ - @@ -68,17 +68,7 @@ Davis, CA 95616, USA - - - - - - - - - - - + @@ -95,6 +85,9 @@ Davis, CA 95616, USA + + + @@ -187,4 +180,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/DoorLockController.xml b/data_model/device_types/DoorLockController.xml index 6e515bc206e04a..a41cdad0e1bf5a 100644 --- a/data_model/device_types/DoorLockController.xml +++ b/data_model/device_types/DoorLockController.xml @@ -1,59 +1,59 @@ - @@ -74,17 +74,7 @@ Davis, CA 95616, USA - - - - - - - - - - - + @@ -92,8 +82,11 @@ Davis, CA 95616, USA + + + - + \ No newline at end of file diff --git a/data_model/device_types/EVSE.xml b/data_model/device_types/EVSE.xml index b5e57c83aa3ac1..42636733090c9c 100644 --- a/data_model/device_types/EVSE.xml +++ b/data_model/device_types/EVSE.xml @@ -55,16 +55,13 @@ Connectivity Standards Alliance + 508 Second Street, Suite 206 + Davis, CA 95616, USA --> - + - - - @@ -99,6 +96,9 @@ Davis, CA 95616, USA + + + diff --git a/data_model/device_types/ExtendedColorLight.xml b/data_model/device_types/ExtendedColorLight.xml index 839a9c1db7a75b..a0337009f660eb 100644 --- a/data_model/device_types/ExtendedColorLight.xml +++ b/data_model/device_types/ExtendedColorLight.xml @@ -1,59 +1,59 @@ - @@ -76,32 +76,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -132,6 +106,14 @@ Davis, CA 95616, USA + + + + + + + + @@ -167,4 +149,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/ExtractorHood.xml b/data_model/device_types/ExtractorHood.xml index 9f86280510fedc..6606b377f47a39 100644 --- a/data_model/device_types/ExtractorHood.xml +++ b/data_model/device_types/ExtractorHood.xml @@ -80,7 +80,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/device_types/HeatingCoolingUnit.xml b/data_model/device_types/HeatingCoolingUnit.xml index 3bcf0b8e2db0d1..39fbb766111b31 100644 --- a/data_model/device_types/HeatingCoolingUnit.xml +++ b/data_model/device_types/HeatingCoolingUnit.xml @@ -1,59 +1,59 @@ - @@ -70,18 +70,15 @@ Davis, CA 95616, USA - - - - - - + + + @@ -92,4 +89,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/MicrowaveOven.xml b/data_model/device_types/MicrowaveOven.xml index 933e1f896da484..3ae1fd8d5bf22d 100644 --- a/data_model/device_types/MicrowaveOven.xml +++ b/data_model/device_types/MicrowaveOven.xml @@ -85,7 +85,7 @@ Davis, CA 95616, USA - + diff --git a/data_model/device_types/NetworkInfraIntro-CommonRequirements.xml b/data_model/device_types/NetworkInfraIntro-CommonRequirements.xml new file mode 100644 index 00000000000000..454dc857f0b8db --- /dev/null +++ b/data_model/device_types/NetworkInfraIntro-CommonRequirements.xml @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/data_model/device_types/NetworkInfraIntro-Introduction.xml b/data_model/device_types/NetworkInfraIntro-Introduction.xml new file mode 100644 index 00000000000000..e5bc56b1f095ac --- /dev/null +++ b/data_model/device_types/NetworkInfraIntro-Introduction.xml @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/data_model/device_types/OccupancySensor.xml b/data_model/device_types/OccupancySensor.xml index bef470cc1c9ec6..1ac4e0ab937830 100644 --- a/data_model/device_types/OccupancySensor.xml +++ b/data_model/device_types/OccupancySensor.xml @@ -55,12 +55,13 @@ Connectivity Standards Alliance 508 Second Street, Suite 206 Davis, CA 95616, USA --> - + + @@ -68,10 +69,8 @@ Davis, CA 95616, USA - - - - + + diff --git a/data_model/device_types/OnOffLight.xml b/data_model/device_types/OnOffLight.xml index 6b12217ff10d6f..ea520612b9dc42 100644 --- a/data_model/device_types/OnOffLight.xml +++ b/data_model/device_types/OnOffLight.xml @@ -1,59 +1,59 @@ - @@ -76,32 +76,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -132,6 +106,14 @@ Davis, CA 95616, USA + + + + + + + + @@ -142,4 +124,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/OnOffLightSwitch.xml b/data_model/device_types/OnOffLightSwitch.xml index df64178ade52ad..eb2c3ff938060a 100644 --- a/data_model/device_types/OnOffLightSwitch.xml +++ b/data_model/device_types/OnOffLightSwitch.xml @@ -1,59 +1,59 @@ - @@ -73,14 +73,11 @@ Davis, CA 95616, USA - - - - - - + + + - + \ No newline at end of file diff --git a/data_model/device_types/OnOffPlug-inUnit.xml b/data_model/device_types/OnOffPlug-inUnit.xml index 83f1c9d0ec15ec..d63e3b22e81aae 100644 --- a/data_model/device_types/OnOffPlug-inUnit.xml +++ b/data_model/device_types/OnOffPlug-inUnit.xml @@ -1,59 +1,59 @@ - @@ -76,32 +76,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -132,6 +106,14 @@ Davis, CA 95616, USA + + + + + + + + @@ -142,4 +124,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/OnOffSensor.xml b/data_model/device_types/OnOffSensor.xml index d28f76f6130964..904b5f6da74c7c 100644 --- a/data_model/device_types/OnOffSensor.xml +++ b/data_model/device_types/OnOffSensor.xml @@ -1,59 +1,59 @@ - @@ -74,20 +74,17 @@ required."/> - - - - - - + + + - + \ No newline at end of file diff --git a/data_model/device_types/Pump.xml b/data_model/device_types/Pump.xml index 298bb43cbb02c6..4662ce0945b06d 100644 --- a/data_model/device_types/Pump.xml +++ b/data_model/device_types/Pump.xml @@ -1,59 +1,59 @@ - @@ -70,18 +70,15 @@ Davis, CA 95616, USA - - - - - - + + + @@ -107,4 +104,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/PumpController.xml b/data_model/device_types/PumpController.xml index 223915f4525b40..274eefb764de41 100644 --- a/data_model/device_types/PumpController.xml +++ b/data_model/device_types/PumpController.xml @@ -1,59 +1,59 @@ - @@ -72,12 +72,6 @@ Davis, CA 95616, USA - - - - - - @@ -87,6 +81,9 @@ Davis, CA 95616, USA + + + @@ -100,4 +97,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/RoboticVacuumCleaner.xml b/data_model/device_types/RoboticVacuumCleaner.xml index 4e02b17d772606..2657a560109829 100644 --- a/data_model/device_types/RoboticVacuumCleaner.xml +++ b/data_model/device_types/RoboticVacuumCleaner.xml @@ -58,7 +58,7 @@ Davis, CA 95616, USA - + @@ -68,40 +68,12 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/data_model/device_types/RoomAirConditioner.xml b/data_model/device_types/RoomAirConditioner.xml index 8e6a833406637c..888ec8a448a501 100644 --- a/data_model/device_types/RoomAirConditioner.xml +++ b/data_model/device_types/RoomAirConditioner.xml @@ -1,59 +1,59 @@ - @@ -68,12 +68,6 @@ Davis, CA 95616, USA - - - - - - @@ -82,6 +76,9 @@ Davis, CA 95616, USA + + + @@ -95,4 +92,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/RootNodeDeviceType.xml b/data_model/device_types/RootNodeDeviceType.xml index e1a9276a97fbd8..1696791ab8a2b3 100644 --- a/data_model/device_types/RootNodeDeviceType.xml +++ b/data_model/device_types/RootNodeDeviceType.xml @@ -137,13 +137,6 @@ Davis, CA 95616, USA - - - - - - - diff --git a/data_model/device_types/Thermostat.xml b/data_model/device_types/Thermostat.xml index dac8172278b4ad..8676fe965ef280 100644 --- a/data_model/device_types/Thermostat.xml +++ b/data_model/device_types/Thermostat.xml @@ -1,59 +1,59 @@ - @@ -72,12 +72,6 @@ Davis, CA 95616, USA - - - - - - @@ -100,40 +94,14 @@ Davis, CA 95616, USA + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -154,4 +122,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/WaterHeater.xml b/data_model/device_types/WaterHeater.xml index 2f2f7fae235e1b..7b06da2add9de3 100644 --- a/data_model/device_types/WaterHeater.xml +++ b/data_model/device_types/WaterHeater.xml @@ -55,16 +55,13 @@ Connectivity Standards Alliance + 508 Second Street, Suite 206 + Davis, CA 95616, USA --> - + - - - @@ -82,6 +79,9 @@ Davis, CA 95616, USA + + + diff --git a/data_model/device_types/WaterValve.xml b/data_model/device_types/WaterValve.xml index 59a065243923f2..5c65f4565f6746 100644 --- a/data_model/device_types/WaterValve.xml +++ b/data_model/device_types/WaterValve.xml @@ -68,5 +68,11 @@ Davis, CA 95616, USA + + + + + + \ No newline at end of file diff --git a/data_model/device_types/WindowCovering.xml b/data_model/device_types/WindowCovering.xml index 1f9e4a3a8ec319..1a56bbd753f63a 100644 --- a/data_model/device_types/WindowCovering.xml +++ b/data_model/device_types/WindowCovering.xml @@ -1,59 +1,59 @@ - @@ -77,7 +77,6 @@ Davis, CA 95616, USA - @@ -121,4 +120,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/device_types/WindowCoveringController.xml b/data_model/device_types/WindowCoveringController.xml index 8e31eed548e90e..5bae9d81103247 100644 --- a/data_model/device_types/WindowCoveringController.xml +++ b/data_model/device_types/WindowCoveringController.xml @@ -1,59 +1,59 @@ - @@ -80,7 +80,6 @@ Davis, CA 95616, USA - @@ -98,4 +97,4 @@ Davis, CA 95616, USA - + \ No newline at end of file diff --git a/data_model/spec_sha b/data_model/spec_sha index 6ef2b40b40b6be..9c275037d5b895 100644 --- a/data_model/spec_sha +++ b/data_model/spec_sha @@ -1 +1 @@ -1736656c4cb1b4f752dcd5b4c8b924b142ff29d4 +7e16e82e5264105bdc61d6bc8fe18095959b8292 diff --git a/docs/clusters.md b/docs/clusters.md index 70f657fd8779ad..28a817e0a044a9 100644 --- a/docs/clusters.md +++ b/docs/clusters.md @@ -79,9 +79,12 @@ Generally regenerate using one of: | 129 | 0x81 | ValveConfigurationAndControl | | 145 | 0x91 | ElectricalEnergyMeasurement | | 150 | 0x96 | DemandResponseLoadControl | +| 151 | 0x97 | Messages | | 152 | 0x98 | DeviceEnergyManagement | | 153 | 0x99 | EnergyEvse | | 155 | 0x9B | EnergyPreference | +| 157 | 0x9D | EnergyEvseMode | +| 159 | 0x9F | DeviceEnergyManagementMode | | 257 | 0x101 | DoorLock | | 258 | 0x102 | WindowCovering | | 259 | 0x103 | BarrierControl | diff --git a/docs/guides/esp32/setup_idf_chip.md b/docs/guides/esp32/setup_idf_chip.md index 900bfc170b5dea..5a6728c44d8417 100644 --- a/docs/guides/esp32/setup_idf_chip.md +++ b/docs/guides/esp32/setup_idf_chip.md @@ -13,25 +13,25 @@ step. ### Install Prerequisites -- [Linux](https://docs.espressif.com/projects/esp-idf/en/v5.1/esp32/get-started/linux-macos-setup.html#for-linux-users) -- [macOS](https://docs.espressif.com/projects/esp-idf/en/v5.1/esp32/get-started/linux-macos-setup.html#for-macos-users) +- [Linux](https://docs.espressif.com/projects/esp-idf/en/v5.1.2/esp32/get-started/linux-macos-setup.html#for-linux-users) +- [macOS](https://docs.espressif.com/projects/esp-idf/en/v5.1.2/esp32/get-started/linux-macos-setup.html#for-macos-users) -### Get IDF v5.1.1 +### Get IDF v5.1.2 -- Clone ESP-IDF [v5.1.1 - release](https://github.com/espressif/esp-idf/releases/tag/v5.1.1 +- Clone ESP-IDF [v5.1.2 + release](https://github.com/espressif/esp-idf/releases/tag/v5.1.2 ``` - git clone -b v5.1.1 --recursive --depth 1 --shallow-submodule https://github.com/espressif/esp-idf.git + git clone -b v5.1.2 --recursive --depth 1 --shallow-submodule https://github.com/espressif/esp-idf.git cd esp-idf ./install.sh ``` -- To update an existing esp-idf toolchain to v5.1.1: +- To update an existing esp-idf toolchain to v5.1.2: ``` cd path/to/esp-idf - git fetch --depth 1 origin v5.1.1 + git fetch --depth 1 origin v5.1.2 git reset --hard FETCH_HEAD git submodule update --depth 1 --recursive --init diff --git a/docs/guides/nxp_zephyr_ota_software_update.md b/docs/guides/nxp_zephyr_ota_software_update.md new file mode 100644 index 00000000000000..430e0bfd81e694 --- /dev/null +++ b/docs/guides/nxp_zephyr_ota_software_update.md @@ -0,0 +1,205 @@ +# Matter Over-The-Air Software Update with NXP using Zephyr example applications + +## Overview + +The OTA Requestor feature enables the device to be informed of, download and +apply a software update from an OTA Provider. + +This section explains how to perform an OTA Software Update with NXP platform +using NXP/Zephyr SDK. Throughout this guide, the all-clusters application is +used as an example. + +In general, the Over-The-Air Software Update process consists of the following +steps : + +- The OTA Requestor queries an update image from the OTA Provider which + responds according to its availability. +- The update image is received in blocks and stored in the external flash of + the device. +- Once the update image is fully downloaded, the bootloader is notified and + the device resets applying the update in test-mode. +- If the test is successful, the update is applied permanently. Otherwise, the + bootloader reverts back to the primary application, preventing any + downgrade. + +### Flash Memory Layout + +The Flash is divided into different regions as follow : + +- Bootloader : MCUBoot resides at the base of the flash. +- Primary application partition : The example application which would be run + by the bootloader (active application). +- Secondary application partition : Update image received with the OTA + (candidate application). + +The size reserved for each partition can be found in +`src/platform/nxp/zephyr/boards/board.overlay`. + +Notes : + +- When applicable, BLE/15.4/Wi-Fi firmware are embedded in the application + binary, ensuring compatibility between the application and the controllers. +- The sizes of the primary and secondary applications are provided as an + example. The size can be changed by overriding the partitions located at + `board.overlay`.(example: + `src/platform/nxp/zephyr/boards/rd_rw612_bga.overlay`) + +### MCUBoot Bootloader + +Current OTA solution is using MCUBoot Bootloader. MCUBoot is an open-source +secure bootloader used to apply the self-upgrade. For more details, please refer +to the +[MCUBoot documentation](https://github.com/mcu-tools/mcuboot/blob/main/docs/design.md). + +In our use case, the bootloader runs the application residing in the primary +partition. In order to run the OTA update image, the bootloader will swap the +content of the primary and the secondary partitions. This type of upgrade is +called swap-move and is the default upgrade configured by MCUBoot. + +## OTA Software Update process + +### Generating and flashing application image + +The all cluster app is able to demonstrate the usage of OTA. To have this OTA +support, prj_ota.conf configurations needs to be used. This can be done by +adding `-DEXTRA_CONF_FILE=prj_ota.conf` to the west build command. + +Current OTA implementation automates the following procedures: + +- Generation of MCUBOOT image (File generated: + `modules/connectedhomeip/build_mcuboot/zephyr/zephyr.bin`)\* +- Generation of Matter application image (File generated: + `zephyr/zephyr.bin`)\* +- Signature of the application image (File generated: + `zephyr/zephyr.signed.bin`)\* +- Generation of a single binary merging the signed application with the + MCUBoot Image (File generated: `zephyr/zephyr_full.bin`)\* + +> **Note**: \*All paths are relative to the output folder. + +The final binary to be used is `zephyr_full.bin`. + +The application image have the following format : + +- Header : contains general information about the image (version, size, + magic...) +- Code of the application : generated binary +- Trailer : contains metadata needed by the bootloader such as the image + signature, the upgrade type, the swap status... + +In the all-cluster-app example, the image is signed with the default private key +provided by MCUBoot(`/zephyrproject/bootloader/mcuboot/root-rsa-2048.pem`). +MCUBoot is built with its corresponding public key which would be used to verify +the integrity of the image. It is possible to generate a new pair of keys using +the following commands. This procedure should be done prior to building the +mcuboot application. + +- To generate the private key : + +``` +user@ubuntu: python3 imgtool.py keygen -k priv_key.pem -t rsa-2048 +``` + +- To extract the public key : + +``` +user@ubuntu: python3 imgtool.py getpub -k priv_key.pem +``` + +To use a different key than the default one, `CONFIG_BOOT_SIGNATURE_KEY_FILE` +and `CONFIG_MCUBOOT_SIGNATURE_KEY_FILE` needs to point to that same key. + +- `CONFIG_BOOT_SIGNATURE_KEY_FILE`: This is used for the MCUboot bootloader + image. The path to the key can be either absolute or relative. Relative + paths starts from the MCUBoot repository root. This option can be changed + in: `config/nxp/app/bootloader.conf` + +- `CONFIG_BOOT_SIGNATURE_KEY_FILE`: This is used for the application to be + loaded by the bootloader. The path can be either absolute or relative. + Relative paths starts from the west workspace location. This option can be + changed in the application .conf files. + +Refer to those two files for more information: + +- [MCUBoot Config used for the MCUBoot Image](https://github.com/zephyrproject-rtos/mcuboot/blob/main/boot/zephyr/Kconfig) +- [MCUBoot Config used for the application](https://github.com/zephyrproject-rtos/zephyr/blob/main/modules/Kconfig.mcuboot) + +JLink can be used to flash the mixed binary at the base address 0x8000000, using +the command : + +``` +J-Link > loadbin zephyr_full.bin 0x8000000 +``` + +The bootloader should then be able to jump directly to the start of the +application and run it. + +### Generating the OTA Update Image + +The same procedure can be followed from the +[Generating and flashing application image](#generating-and-flashing-application-image) +sub-section, replacing `CONFIG_CHIP_DEVICE_SOFTWARE_VERSION` with a number +greater than the initial one used on the active application (Candidate +application version number should be greater than the one used on the active +application). By default the value is set to 0, try resetting this option to 1 +to generate the OTA update Image. You can do this by adding +`-DCONFIG_CHIP_DEVICE_SOFTWARE_VERSION=1` to the west build command. + +The current implementation automates the following procedures: + +- Generation of the Image to be used for update (File generated: + `zephyr/zephyr.bin`)\* +- Signature of the Image (File generated: `zephyr/zephyr.signed.bin`)\* +- Conversion of the signed Image into the OTA format (.ota file) (File + generated: `zephyr/matter.ota`)\* + +> **Note**: \*All paths are relative to the output folder. + +The generated OTA file `matter.ota` can be used to perform the OTA Software +Update. The instructions below describes the procedure step-by-step. + +### Performing the OTA Software Update + +Setup example : + +- [Chip-tool](../../examples/chip-tool/README.md) application running on the + RPi. +- OTA Provider application built on the same RPi (as explained below). +- Board programmed with the example application (with the instructions above). + +Before starting the OTA process, the Linux OTA Provider application can be built +on the RPi (if not already present in the pre-installed apps) : + +``` +user@ubuntu:~/connectedhomeip$ : ./scripts/examples/gn_build_example.sh examples/ota-provider-app/linux out/ota-provider-app chip_config_network_layer_ble=false + +user@ubuntu:~/connectedhomeip$ : rm -rf /tmp/chip_* +user@ubuntu:~/connectedhomeip$ : ./out/ota-provider-app/chip-ota-provider-app -f matter.ota +``` + +The OTA Provider should first be provisioned with chip-tool by assigning it the +node id 1, and then granted the ACL entries : + +``` +user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool pairing onnetwork 1 20202021 +user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": null, "targets": null}]' 1 0 +``` + +The second step is to provision the device with the node id 2 using ble-wifi or +ble-thread commissioning. For example : + +``` +user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool pairing ble-wifi 2 WIFI_SSID WIFI_PASSWORD 20202021 3840 +``` + +Once commissioned, the OTA process can be initiated with the +"announce-ota-provider" command using chip-tool (the given numbers refer +respectively to [ProviderNodeId][vendorid] [AnnouncementReason][endpoint] +[node-id][endpoint-id]) : + +``` +user@ubuntu:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool otasoftwareupdaterequestor announce-otaprovider 1 0 0 0 2 0 +``` + +When the full update image is downloaded and stored, the bootloader will be +notified and the device will reboot with the update image. diff --git a/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb b/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb deleted file mode 100644 index 1aea4a55b48e4e..00000000000000 --- a/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb +++ /dev/null @@ -1,4218 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "e8b2f5eb", - "metadata": { - "tags": [] - }, - "source": [ - "# Interaction Model Examples\n", - "\n", - "\n", - "\"drawing\"\n", - "\n", - "

\n", - "\n", - "This walks through the various interactions that can be initiated from the REPL towards a target using the Matter Interaction Model (IM) and Data Model (DM)." - ] - }, - { - "cell_type": "markdown", - "id": "d2ed9fe9-e4a7-4540-a434-8f4ee1362bc6", - "metadata": {}, - "source": [ - "## Clear Persisted Storage\n", - "\n", - "Let's clear out our persisted storage (if one exists) to start from a clean slate." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "06c609a5-1d5c-4ae2-85f0-39a280d1bf2c", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import os, subprocess\n", - "\n", - "if os.path.isfile('/tmp/repl-storage.json'):\n", - " os.remove('/tmp/repl-storage.json')\n", - "\n", - "# So that the all-clusters-app won't boot with stale prior state.\n", - "os.system('rm -rf /tmp/chip_*')" - ] - }, - { - "cell_type": "markdown", - "id": "99ce2877", - "metadata": { - "tags": [] - }, - "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", - "\n", - "`ChipReplStartup.py` is run within the global namespace. This results in all of its imports being made available here.\n", - "\n", - "> **NOTE**: _This is not needed if you launch the REPL from the command-line._" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bad327b7-c78a-4c46-b224-077fe7539ee1", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path}" - ] - }, - { - "cell_type": "markdown", - "id": "047c4785-bb5f-41bd-9fce-5e8a7442f227", - "metadata": {}, - "source": [ - "## Cluster Elements\n", - "\n", - "The Interaction Model uses data model types that refer not just to the various base types defines in the spec, but types that correspond to structs/commands/events/attributes defined in each cluster specification. The cluster-specific types are referred to as 'cluster objects'. These are represented as Python dataclasses, with each field in the respective object equivalently named as a member within the dataclass.\n", - "\n", - "### Namespaces\n", - "\n", - "Objects in clusters are organized into namespaces. All clusters can be found under the `Clusters` namespace, with the appropriate cluster in upper camel case within that. (e.g `Clusters.TestCluster`).\n", - "\n", - "Within that, `Commands`, `Structs` and `Attributes` delimit the respective types in the cluster.\n", - "\n", - "_Example Struct:_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "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" - ], - "text/plain": [ - "\n", - "\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m20\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kValueA:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'1234'\u001b[0m,\n", - "\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "v = Clusters.TestCluster.Structs.SimpleStruct()\n", - "v.a = 20\n", - "v.b = True\n", - "v.c = Clusters.TestCluster.Enums.SimpleEnum.kValueA\n", - "v.d = b'1234'\n", - "v.e = 30\n", - "v.g = 23.234\n", - "\n", - "v" - ] - }, - { - "cell_type": "markdown", - "id": "62b3ca42-c2d2-4252-8683-47b0c1a1319d", - "metadata": {}, - "source": [ - "_Example Command:_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d52b1adc-7723-4be8-80c0-f7f262398d39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "TestAddArguments(\n",
-       "arg1=0,\n",
-       "arg2=0\n",
-       ")\n",
-       "
\n" - ], - "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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Clusters.TestCluster.Commands.TestAddArguments()" - ] - }, - { - "cell_type": "markdown", - "id": "ae69ad3b-7dd5-4ef2-9ba3-5944c0c2c2bf", - "metadata": {}, - "source": [ - "To get more information about the fields in these objects and their types, run:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c55de6c7-da4e-488e-bafb-32781ee088a8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
╭──────── <class 'chip.clusters.Objects.TestCluster.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",
-       "
\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.TestCluster.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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "matterhelp(Clusters.TestCluster.Commands.TestAddArguments)" - ] - }, - { - "cell_type": "markdown", - "id": "c7724d12-2a35-49f1-bb9f-ee010200b1aa", - "metadata": {}, - "source": [ - "### Nullable Fields\n", - "\n", - "For fields that are nullable, they are represented as a `Typing.Union[Nullable, ...]`. This means that it can either be a `Nullable` type or the underlying type of the field.\n", - "\n", - "When nullable, a field can either take on the value of the native type, or a value of `NullValue`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "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" - ], - "text/plain": [ - "\n", - "\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[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a = Clusters.TestCluster.Structs.NullablesAndOptionalsStruct()\n", - "a.nullableInt = Clusters.Types.NullValue\n", - "a" - ] - }, - { - "cell_type": "markdown", - "id": "0786dd6b-df15-4cf4-b0a9-0578f040bd27", - "metadata": {}, - "source": [ - "### Optional Fields\n", - "\n", - "If a field is optional, it is represented in the typing hints as a `Typing.Union[NoneType, ...]`. An optional field that isn't present has a value of `None`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "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" - } - ], - "source": [ - "print(a.nullableOptionalInt)" - ] - }, - { - "cell_type": "markdown", - "id": "ee702b80-6f93-4627-8f9e-c97ebaa41de6", - "metadata": {}, - "source": [ - "### Defaults\n", - "\n", - "Upon construction of a cluster object, the fields within that object are automatically initialized to type specific defaults as specified in the data model specification:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "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" - ], - "text/plain": [ - "\n", - "\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[1;36m0\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[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Clusters.TestCluster.Structs.SimpleStruct()" - ] - }, - { - "cell_type": "markdown", - "id": "322ebc15-ae5d-4e84-bb66-a5d77d1e04c6", - "metadata": { - "tags": [] - }, - "source": [ - "## IM Interactions\n", - "\n", - "This section will walk through the various types of IM Interactions that are possible in the REPL." - ] - }, - { - "cell_type": "markdown", - "id": "7a082d33-bebd-4b34-b8e3-df59ed429c54", - "metadata": { - "tags": [] - }, - "source": [ - "### Commission and Setup Server" - ] - }, - { - "cell_type": "markdown", - "id": "4f458209-bfd4-4682-acac-5faadeecd97a", - "metadata": { - "tags": [] - }, - "source": [ - "#### Launch Server\n", - "\n", - "Let's launch an instance of the `chip-all-clusters-app`.\n", - "\n", - "> NOTE: If you're interacting with real devices, this step can be skipped." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "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", - "\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", - "else:\n", - " appPath = '../../../../out/debug/chip-all-clusters-app'\n", - " \n", - "process = subprocess.Popen(appPath, stdout=subprocess.DEVNULL)\n", - "time.sleep(1)" - ] - }, - { - "cell_type": "markdown", - "id": "b33dec2e", - "metadata": {}, - "source": [ - "#### Discover and commission commissionable node" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "67fa53b3", - "metadata": { - "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='DCA632A54C510000',\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:fea5:4c51',\n",
-       "│   │   │   │   'fe80::dea6:32ff:fea5:4c51',\n",
-       "│   │   │   │   '172.16.243.198'\n",
-       "│   │   │   ]\n",
-       "│   │   )\n",
-       ")\n",
-       "]\n",
-       "
\n" - ], - "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'DCA632A54C510000'\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:fea5:4c51'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'fe80::dea6:32ff:fea5:4c51'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'172.16.243.198'\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-08-19 14:57:45 songguo.sha.corp.google.com chip.DIS[3192750] ERROR Timeout waiting for mDNS resolution.\n" - ] - } - ], - "source": [ - "devices = devCtrl.DiscoverCommissionableNodes(filterType=chip.discovery.FilterType.LONG_DISCRIMINATOR, filter=3840, stopOnFirst=True, timeoutSecond=2)\n", - "devices" - ] - }, - { - "cell_type": "markdown", - "id": "ed6f08a9", - "metadata": {}, - "source": [ - "You can find a list of discovered device\n", - "\n", - "You can call `Commission(nodeId, setupPinCode)` on one of the returned object:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2a7a7c40", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "devices[0].Commission(233, 20202021)" - ] - }, - { - "cell_type": "markdown", - "id": "78ef00f9", - "metadata": {}, - "source": [ - "The device will be commissioned by the DeviceController instance that discovered it (`caIndex(1)/fabricId(0x0000000000000001)/nodeId(0x000000000001B669)` in this case)." - ] - }, - { - "cell_type": "markdown", - "id": "aa9c6906", - "metadata": {}, - "source": [ - "#### Commission Target (Locally Launched App)\n", - "\n", - "Commission the target with a NodeId of 1." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "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" - } - ], - "source": [ - "devCtrl.CommissionIP(b'127.0.0.1', 20202021, 2)" - ] - }, - { - "cell_type": "markdown", - "id": "46c82aa0-d99b-4073-ad22-0ce260ba025a", - "metadata": { - "tags": [] - }, - "source": [ - "#### Commission Target (BLE + Thread)\n", - "\n", - "To commission a Thread-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 Thread credentials to join the Thread network.\n", - "\n", - "> NOTE: MacOS Monterey is currently not supported due to issues with its BLE stack." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a1e762ad-b272-4a9c-959c-6fc1543d9631", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "devCtrl.CommissionThread(3840, 20202021, 2, b'\\x01\\x03\\xff')" - ] - }, - { - "cell_type": "markdown", - "id": "bd93c3f0-651a-4e66-9d35-613b009e98cb", - "metadata": { - "tags": [] - }, - "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", - "\n", - "> NOTE: MacOS Monterey is currently not supported due to issues with its BLE stack." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b552280-8586-4b5d-acde-c7806e882f23", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "devCtrl.CommissionWiFi(3840, 20202021, 2, 'MyWifiSsid', 'MyWifiPassword')" - ] - }, - { - "cell_type": "markdown", - "id": "c22ea8ee", - "metadata": { - "tags": [] - }, - "source": [ - "### Invoke Interaction" - ] - }, - { - "cell_type": "markdown", - "id": "4c94d599-e243-43de-8abe-bb4d9b1f52d4", - "metadata": {}, - "source": [ - "#### Basic Command (Success Response)" - ] - }, - { - "cell_type": "markdown", - "id": "52e6e92e-0bc6-45f2-9b6b-74d43ba3048c", - "metadata": {}, - "source": [ - "Let's send a basic command to turn on/off the light on Endpoint 1." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "bed38512-91f8-4d4e-b6e1-b30749137bbd", - "metadata": {}, - "outputs": [], - "source": [ - "await devCtrl.SendCommand(2, 1, Clusters.OnOff.Commands.On())" - ] - }, - { - "cell_type": "markdown", - "id": "b1c0fe3c-95da-4980-9b9b-2a5ab602af44", - "metadata": {}, - "source": [ - "The receipt of a successful status response will result in the command just returning successfully. Otherwise, an exception will be thrown." - ] - }, - { - "cell_type": "markdown", - "id": "80c604b9-f6dc-4ec5-91e8-a6e806c821a6", - "metadata": {}, - "source": [ - "#### Basic Command (Failure Response)" - ] - }, - { - "cell_type": "markdown", - "id": "753f5a54-4a75-41ed-a7c0-99c8cca8b6de", - "metadata": { - "tags": [] - }, - "source": [ - "If we send the same command to an invalid endpoint, an exception is thrown. If an IM status code was received from the server, a `InteractionModelError` is thrown containing the IM status code:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "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" - } - ], - "source": [ - "try:\n", - " await devCtrl.SendCommand(2, 100, Clusters.OnOff.Commands.On())\n", - "except Exception as e:\n", - " pprint(e)" - ] - }, - { - "cell_type": "markdown", - "id": "5296f2bc-5e9d-4b06-a7c1-f247ebe5eac2", - "metadata": {}, - "source": [ - "#### Basic Command (Data Response)" - ] - }, - { - "cell_type": "markdown", - "id": "bb196da4-5162-4c4b-ae64-ef1d23a04eb9", - "metadata": { - "tags": [] - }, - "source": [ - "Here's an example of a command that sends back a data response, and how that is presented:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "33f34d12-79f4-4230-836b-2e66ea839440", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "TestListInt8UReverseResponse(\n",
-       "arg1=[\n",
-       "│   │   7,\n",
-       "│   │   5,\n",
-       "│   │   3,\n",
-       "│   │   1\n",
-       "]\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1;35mTestListInt8UReverseResponse\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1;36m7\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1;36m5\u001b[0m,\n", - "\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.SendCommand(2, 1, Clusters.TestCluster.Commands.TestListInt8UReverseRequest([1, 3, 5, 7]))" - ] - }, - { - "cell_type": "markdown", - "id": "a513295e-c44f-4deb-aa36-8b404c91e95e", - "metadata": {}, - "source": [ - "### Read Interaction\n", - "\n", - "The `ReadAttribute` method on the `DeviceController` class can be used to read attributes from a target. The NodeId of the target is the first argument, followed by a list of paths that are expressed as cluster object namespaces to the respective slices of the data that is requested.\n", - "\n", - "By default, the data is returned as a dictionary, with the top-level item representing the endpoint, then the cluster and the attribute. The latter two keys are expressed using cluster object namespaces." - ] - }, - { - "cell_type": "markdown", - "id": "493dae62-f9fe-40b6-9c3d-0584e9c1893f", - "metadata": {}, - "source": [ - "#### Read 1 attribute:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "7167af96-43b1-4524-8712-592e3ede6114", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "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.TestCluster'\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.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a = await devCtrl.ReadAttribute(2, [Clusters.TestCluster.Attributes.Int16u])\n", - "a" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "b6c3bf1f-3247-4f8d-ac42-1b5ebc59cb44", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "<class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0\n",
-       "}\n",
-       "
\n" - ], - "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.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a[1][Clusters.TestCluster]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "a2cafa5e-6c0e-42b9-bac0-8a1770306718", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
0\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1;36m0\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a[1][Clusters.TestCluster][Clusters.TestCluster.Attributes.Int16u]" - ] - }, - { - "cell_type": "markdown", - "id": "49f5a4f5-9d0e-4678-a4b1-9b00cf5518c1", - "metadata": { - "tags": [] - }, - "source": [ - "#### Read 2 attributes:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "8e2cb85c-9fa4-4f2e-bd71-aea54988274d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Boolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "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.TestCluster'\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.TestCluster.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.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [Clusters.TestCluster.Attributes.Int16u, Clusters.TestCluster.Attributes.Boolean])" - ] - }, - { - "cell_type": "markdown", - "id": "b276df34-e38b-4a1e-a104-7f0e71842a75", - "metadata": {}, - "source": [ - "#### Read the entirety of a cluster on an endpoint:\n", - "\n", - "The path is represented as tuple of (endpoint, cluster)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "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" - ], - "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[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [(1, Clusters.OnOff)])" - ] - }, - { - "cell_type": "markdown", - "id": "07a9e227-4f53-42a9-8fb0-5da32515dc9f", - "metadata": {}, - "source": [ - "#### Read the entirety of a cluster across all endpoints:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "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" - ], - "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\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [Clusters.OnOff])" - ] - }, - { - "cell_type": "markdown", - "id": "8d2403ba-91f1-4b59-b5ce-68ccc175f8ea", - "metadata": {}, - "source": [ - "#### Read an endpoint:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "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" - ], - "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[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[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [2])" - ] - }, - { - "cell_type": "markdown", - "id": "8aad8fef-66d7-4320-ba3c-47b481d66960", - "metadata": {}, - "source": [ - "#### Read the entire node:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "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.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Boolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap32'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap64'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int8u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int24u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int32u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int40u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int48u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int56u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int64u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int8s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int24s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int32s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int40s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int48s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int56s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int64s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Enum8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Enum16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.FloatSingle'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.FloatDouble'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.OctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListInt8u'>: [\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListOctetString'>: [\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b''\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.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.TestCluster.Attributes.LongOctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.CharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.LongCharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.EpochUs'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.EpochS'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.VendorId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.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.TestCluster.Attributes.EnumAttr'>: <SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.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.TestCluster.Attributes.RangeRestrictedInt8u'>: 70,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt8s'>: -20,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt16u'>: 200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt16s'>: -100,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListLongOctetString'>: [\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListFabricScoped'>: [\n",
-       "│   │   │   │   TestFabricScoped(\n",
-       "│   │   │   │   │   fabricIndex=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.TimedWriteBoolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.GeneralErrorBoolean'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.InvalidDataType: 141>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ClusterErrorBoolean'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.Failure: 1>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBoolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap32'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap64'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt8u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt16u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt24u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt32u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt40u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt48u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt56u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt64u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt8s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt16s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt24s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt32s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt40s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt48s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt56s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt64s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableEnum8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableEnum16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableFloatSingle'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableFloatDouble'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableOctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableCharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableEnumAttr'>: <SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableStruct'>: Null,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt8u'>: 70,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt8s'>: -20,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt16u'>: 200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt16s'>: -100,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.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" - ], - "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.TestCluster'\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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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[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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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[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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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.TestCluster.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;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[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [('*')])" - ] - }, - { - "cell_type": "markdown", - "id": "7209813d-81d8-4f4c-8d4a-73a69569c86d", - "metadata": {}, - "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:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "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" - ], - "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[1;36m1030\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[1m)\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [2], True)" - ] - }, - { - "cell_type": "markdown", - "id": "1e852897-ce10-4885-bd84-b1aa060b9b6c", - "metadata": {}, - "source": [ - "#### Read Events:\n", - "\n", - "A `ReadEvents` API exists that behaves similarly to the `ReadAttributes` API. It permits the same degrees of wildcard expression as its counterpart and follows the same format for expressing all wildcard permutations." - ] - }, - { - "cell_type": "markdown", - "id": "11f23767-c8a8-4ecd-8d38-023b3872eceb", - "metadata": {}, - "source": [ - "#### Read all events:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "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" - ], - "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[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[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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Force an event to get emitted.\n", - "await devCtrl.SendCommand(2, 1, Clusters.TestCluster.Commands.TestEmitTestEventRequest())\n", - "\n", - "await devCtrl.ReadEvent(2, [('*')])" - ] - }, - { - "cell_type": "markdown", - "id": "b93ee082-2a7f-47db-8c92-e7accc216086", - "metadata": {}, - "source": [ - "### Subscription Interaction\n", - "\n", - "To subscribe to a Node, the same `ReadAttributes` API is used to trigger a subscription, with a valid `reportInterval` tuple passed in being used as a way to indicate the request to create a subscription." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "921b58f7-cdfb-436f-813a-412cbf7a018d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
<Subscription (Id=6469889299346410316)>\n",
-       "
\n" - ], - "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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "reportingTimingParams = (0, 2) # MinInterval = 0s, MaxInterval = 2s\n", - "subscription = await devCtrl.ReadAttribute(2, [(2, Clusters.OnOff)], True, reportingTimingParams)\n", - "subscription" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "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" - ], - "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\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "subscription.GetAttributes()" - ] - }, - { - "cell_type": "markdown", - "id": "866329a7-7757-4a5d-b7b0-4d70a86b65b0", - "metadata": {}, - "source": [ - "#### Trigger Report\n", - "\n", - "To trigger a report, let's alter the state of the on/off switch on EP1. That should trigger the generation of a set of attribute reports.\n", - "\n", - "The `SubscriptionTransaction` object returned by `ReadAttribute` permits installing a callback that is invoked on any attribute report. A default callback is installed above that just dumps out the attribute data." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "b0d34116-6c9b-4aee-a8a0-f92091654b4c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>,\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.OnOff'\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.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": [ - "await devCtrl.SendCommand(2, 2, Clusters.OnOff.Commands.On())\n", - "time.sleep(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "eb712364-4311-4bcb-91a4-2e9f26b825a1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>,\n",
-       "'Value': False\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.OnOff'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[3;91mFalse\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.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": [ - "await devCtrl.SendCommand(2, 2, Clusters.OnOff.Commands.Off())\n", - "time.sleep(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "50aa8d53-0fe3-4489-badd-3db9f78ea210", - "metadata": {}, - "outputs": [], - "source": [ - "subscription.Shutdown()" - ] - }, - { - "cell_type": "markdown", - "id": "dad3f8bf-431e-496f-b2a7-6e675e3d3ee2", - "metadata": {}, - "source": [ - "#### Subscribe to Events" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "7db20b08-fed9-46f6-ab46-9e69c82a87fb", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "reportingTimingParams = (0, 2) # MinInterval = 0s, MaxInterval = 2s\n", - "subscription = await devCtrl.ReadEvent(2, [()], reportingTimingParams)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "d8599eec-b1e1-4936-aea2-11c2a015a7a7", - "metadata": { - "tags": [] - }, - "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" - ], - "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[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[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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "subscription.GetEvents()" - ] - }, - { - "cell_type": "markdown", - "id": "4ff2d257-ea1b-4957-97ed-fd6518740218", - "metadata": {}, - "source": [ - "### 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, - "id": "93cb4c17-b3c7-4462-b448-397171458416", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Received Event:\n" - ] - }, - { - "data": { - "text/html": [ - "
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",
-       "│   │   │   d=b'',\n",
-       "│   │   │   e='',\n",
-       "│   │   │   f=0,\n",
-       "│   │   │   g=0.0,\n",
-       "│   │   │   h=0.0\n",
-       "│   │   ),\n",
-       "│   │   arg5=[],\n",
-       "│   │   arg6=[]\n",
-       ")\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\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[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[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[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.SendCommand(2, 1, Clusters.TestCluster.Commands.TestEmitTestEventRequest())\n", - "time.sleep(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "6e294da6-1e71-444d-952b-0e1d3b8268b6", - "metadata": {}, - "outputs": [], - "source": [ - "subscription.Shutdown()" - ] - }, - { - "cell_type": "markdown", - "id": "e2b7e2ea-497f-40e7-86c5-198ad1a80950", - "metadata": {}, - "source": [ - "### Write Interaction\n", - "\n", - "To write attribute data, the `WriteAttribute` API can be used. It requires a NodeId and a list of cluster object encapsulated data for the attribute being written." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "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" - ], - "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[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" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.WriteAttribute(2, [ (1, Clusters.TestCluster.Attributes.Int16u(2)) ])" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "69fcf8e6-a49e-471e-9169-14c4fee88f2e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 2\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "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.TestCluster'\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.TestCluster.Attributes.Int16u'\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[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [ (1, Clusters.TestCluster.Attributes.Int16u) ])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - }, - "vscode": { - "interpreter": { - "hash": "f7fd7085b4be428477fa1342305f4ebb7800cfd7c4438123a54b78fc013e2c1b" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/index.md b/docs/index.md index 12218445600743..8447850784787f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -16,6 +16,7 @@ cluster_and_device_type_dev/index guides/index style/index examples/index +testing/index tools/index BUG_REPORT code_generation diff --git a/docs/testing/ci_testing.md b/docs/testing/ci_testing.md new file mode 100644 index 00000000000000..7f974bb6f03604 --- /dev/null +++ b/docs/testing/ci_testing.md @@ -0,0 +1,6 @@ +# CI testing + +This file is a placeholder for information on how to run tests in the CI. + +NOTE: discuss in particular triggers direct to the device, test event triggers +and the CI pics. diff --git a/docs/testing/index.md b/docs/testing/index.md new file mode 100644 index 00000000000000..0b9bbf4c494a38 --- /dev/null +++ b/docs/testing/index.md @@ -0,0 +1,31 @@ +# Testing Guides + +The following guide provide an introduction to the testing mechanisms available +in the SDK. + +```{toctree} +:glob: +:maxdepth: 1 +:hidden: + +* +``` + +## Unit testing + +- [Unit tests](./unit_testing.md) + +## Integration and Certification tests + +- [Integration and Certification tests](./integration_tests.md) +- [YAML](./yaml.md) +- [Python testing framework](./python.md) +- [Enabling tests in the CI](./ci_testing.md) + +## PICS and PIXIT + +- [PICS and PIXIT](./pics_and_pixit.md) + +## Testing in the CI + +- [CI testing](./ci_testing.md) diff --git a/docs/testing/integration_tests.md b/docs/testing/integration_tests.md new file mode 100644 index 00000000000000..46a20ebb8ac090 --- /dev/null +++ b/docs/testing/integration_tests.md @@ -0,0 +1,46 @@ +# Integration and Certification Tests + +Integration tests use a server and a controller or controllers to test the +behavior of a device. Certification tests are all integration tests. For +certified products, the device under test (DUT) is tested against one of the SDK +controller implementations (either chip-tool or the python-based controller, +depending on the test type). For software component certification, the software +component is tested against a sample device built from the SDK. + +Certification tests require an accompanying certification test plan in order to +be used in the certification testing process. More information about test plans +can be found in the +[test plans repository](https://github.com/CHIP-Specifications/chip-test-plans/tree/master/docs). +Integration testing can also be used outside of the certification testing +program to test device behavior in the SDK. Certification tests are all run in +the [CI](./ci_testing). + +There are two main integration test types: + +- [YAML](./yaml.md) +- [Python framework](./python.md) + +YAML is a human-readable serialization language that uses structured tags to +define test steps. Tests are defined in YAML, and parsed and run through a +runner that is backed by the chip-tool controller. + +The Python framework tests are written in python and use the +[Mobly](https://github.com/google/mobly) test framework to execute tests. + +## Which test framework to use + +Both types of tests can be run through the Test Harness for certification +testing, locally for the purposes of development and in the CI for the SDK. The +appropriate test framework to use is whatever lets you automate your tests in a +way that is understandable, readable, and has the features you need + +- YAML + - pros: more readable, simpler to write, easy for ATLs to parse and + understand + - cons: conditionals are harder (not all supported), no branch control, + schema not well documented +- python + - pros: full programming language, full control API with support for core + (certs, commissioning, etc), less plumbing if you need to add features, + can use python libraries + - cons: more complex, can be harder to read diff --git a/docs/testing/pics_and_pixit.md b/docs/testing/pics_and_pixit.md new file mode 100644 index 00000000000000..ee8901c66fecab --- /dev/null +++ b/docs/testing/pics_and_pixit.md @@ -0,0 +1,10 @@ +# PICS and PIXITs + +Placeholder file for PICS and PIXIT info + +- PICS formats - XML vs. test harness +- PICS in CI +- PICS tool and how we practically use it in Matter +- PICS checker test +- PIXITs in tests and how to set them +- Why you should avoid using both of these things. diff --git a/docs/testing/python.md b/docs/testing/python.md new file mode 100644 index 00000000000000..3af81e2394fe85 --- /dev/null +++ b/docs/testing/python.md @@ -0,0 +1,6 @@ +# Python framework tests + +This file is a placeholder for python framework test information. + +NOTE: be sure to include information about how you need to commission with the +python controller, not chip-tool and how to do that in the scripts diff --git a/docs/testing/unit_testing.md b/docs/testing/unit_testing.md new file mode 100644 index 00000000000000..e62940f15a9c7c --- /dev/null +++ b/docs/testing/unit_testing.md @@ -0,0 +1,3 @@ +# Unit testing + +This doc is a placeholder for an guide around unit tests. diff --git a/docs/testing/yaml.md b/docs/testing/yaml.md new file mode 100644 index 00000000000000..2099d623c1b3db --- /dev/null +++ b/docs/testing/yaml.md @@ -0,0 +1,362 @@ +# YAML tests + +YAML is a structured, human-readable data-serialization language. Much like json +or proto, YAML refers to the structure and parser, and the schema used for any +particular application is defined by the application. + +In Matter, we use YAML for describing tests and test steps. A YAML parser and +runner is then used to translate the YAML instructions into actions used to +interact with the device under test (DUT). + +The main runner we use for testing in Matter parses the YAML instructions into +chip-tool commands. + +The schema description for the Matter test YAML is available here: +[YAML Schema](./yaml_schema.md) + +## Writing YAML tests + +Most YAML tests are written for certification. These follow a standard format +that is used to display the test easily in the test harness. + +### Placeholder for anatomy of a yaml test - need diagram + +### Placeholder for anatomy of a test step - need diagram + +### Common actions + +#### Sending a cluster command + +The following shows a test step sending a simple command with no arguments. + +``` + - label: "This label gets printed" + cluster: "On/Off" + command: "On" +``` + +- label - label to print before performing the test step +- cluster - name of the cluster to send the command to +- command - name of the command to send + +This send the On command to the On/Off cluster on the DUT. For most tests, the +nodeID of the DUT and endpoint for the cluster are defined in the top-level +config section of the file and applied to every test step. However, these can +also be overwritten in the individual test steps. + +The following shows how to send a command with arguments: + +``` + - label: "This label gets printed before the test step" + command: "MoveToColor" + arguments: + values: + - name: "ColorX" + value: 32768 + - name: "ColorY" + value: 19660 + - name: "TransitionTime" + value: 0 + - name: "OptionsMask" + value: 0 + - name: "OptionsOverride" + value: 0 +``` + +- label - label to print before performing the test step +- command - name of the command to send +- argument - this is a list parameter that takes either a "value" or "values" + tag. Commands with arguments all use structured fields, which require the + "values" tag with a list. Each of the fields is represented by a "name" and + "value" pair + +In this command, the cluster: tag is elided. The cluster for the entire test can +be set in the config section at the top of the test. This can be overwritten for +individual test steps (as above). + +#### Reading and writing attributes + +Reading and writing attributes is represented in the Matter test YAML schemas as +a special command that requires an additional "attribute" tag. + +The following YAML would appear as a test step, and shows how to read an +attribute. + +``` +- label: "TH reads the ClusterRevision from DUT" + command: "readAttribute" + attribute: "ClusterRevision" +``` + +The following YAML would appear as a test step and shows how to write an +attribute. Commands to write attributes always require an argument: tag. + +``` +- label: "Write example attribute" + command: "writeAttribute" + attribute: "ExampleAttribute" + arguments: + value: 1 +``` + +#### Parsing Responses + +After sending a command or read or write attribute request, you may want to +verify the response. This is done using the "response" tag with various +sub-tags. + +The following shows a simple response parsing with two (somewhat redundant) +checks. + +``` +- label: "TH reads the ClusterRevision from DUT" + command: "readAttribute" + attribute: "ClusterRevision" + response: + value: 1 + constraints: + minValue: 1 +``` + +The following tags can be used to parse the response + +| Example | Description | +| :---------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------- | +| response:
 value: [1, 2, 3, 4] | must match exactly. Variables and saveAs values allowed | +| response:
 values:
  - name: response_field
     value: 1 | Must match exactly
Use for commands that return command responses with named fields | +| response:
  error: CONSTRAINT_ERROR | expect an error back (omit for success)
Variables and saveAs values will not work. | +| response:
 constraints: | more complex checks - see [Schema](./yaml_schema.md) for a complete description | + +#### Lists and structs + +Lists and structs can be represented as follows: + +Lists: `[1,2,3,4,5]` + +structs: `{field1:value, field2:value}` + +lists of structs: + +``` +[ + +{field1:value, field2:value, optionalfield:value}, + +{field1:value, field2:value}, + +] +``` + +Note that structs are different than command and command response fields, which +are represented using name:, value: tags. + +#### Pseudo clusters + +Tests often require functionality that is not strictly cluster-based. Some of +this functionality is supported in YAML using pseudo-clusters. These clusters +accept command: tags like the DUT clusters to control the pseudo-cluster +functionality. + +Some of the more common functionality is shown below: + +Establishing a connection to the DUT. This is the first step in nearly every +test. + +``` + - label: "Establish a connection to the DUT" + cluster: "DelayCommands" + command: "WaitForCommissionee" + arguments: + values: + - name: "nodeId" + value: nodeId +``` + +Wait for a user action: + +``` + - label: "Do a simple user prompt message. Expect 'y' to pass." + cluster: "LogCommands" + command: "UserPrompt" + arguments: + values: + - name: "message" + value: "Please enter 'y' for success" + - name: "expectedValue" + value: "y" +``` + +Wait for a time: + +``` + - label: "Wait for 5S" + cluster: "DelayCommands" + command: "WaitForMs" + arguments: + values: + - name: "ms" + value: 5000 +``` + +A full description of the available pseudo-clusters and their commands is +available at [Pseudo-cluster description](./yaml_pseudocluster.md). + +#### Config variables and saveAs: + +Certain tags can use variables that are either declared in the config: section +or saved from other steps. Variables that are declared in the config can be +overwritten on the command line when running locally or through the config file +in the test harness. + +To declare config variables in the config section, use a label with the desired +name, then provide the type and defaultValue tags as sub-tags. + +``` +config: + nodeId: 0x12344321 + cluster: "Unit Testing" + endpoint: 1 + myArg1: + type: int8u + defaultValue: 5 +``` + +Variables can also be saved from responses: + +``` + - label: "Send Test Add Arguments Command" + command: "TestAddArguments" + arguments: + values: + - name: "arg1" + value: 3 + - name: "arg2" + value: 17 + response: + values: + - name: "returnValue" + saveAs: TestAddArgumentDefaultValue + value: 20 +``` + +Variables can then be used in later steps: + +``` + - label: "Send Test Add Arguments Command" + command: "TestAddArguments" + arguments: + values: + - name: "arg1" + value: 3 + - name: "arg2" + value: 17 + response: + values: + - name: "returnValue" + value: TestAddArgumentDefaultValue +``` + +Tags where variables can be used are noted in the +[schema description](./yaml_schema.md). + +Config variables can be used to implement PIXIT values in tests. + +#### Gating tests and steps: PICS, TestEqualities and runIf + +The PICS tag can be used to unconditionally gate a test step on the PICS value +in the file. + +The PICS tag can handle standard boolean operations on pics (!, ||, &&, ()). + +A PICS tag at the top level of the file can be used to gate the entire test in +the test harness. Note that full-test gating is not currently implemented in the +local runner or in the CI. + +Some test steps need to be gated on values from earlier in the test. In these +cases, PICS cannot be used. Instead, the runIf: tag can be used. This tag +requires a boolean value. To convert values to booleans, the TestEqualities +function can be use. See +[TestEqualities](https://github.com/project-chip/connectedhomeip/blob/master/src/app/tests/suites/TestEqualities.yaml) +for an example of how to use this pseudo-cluster. + +## Running YAML tests + +YAML scripts are parsed and run using a python-based runner program that parses +the file, then translates the tags into chip-tool commands, and sends those +commands over a socket to chip-tool (running in interactive mode). + +### Running locally + +#### Commissioning the DUT + +All YAML tests assume that the DUT has previously been commissioned before +running. DUTs should be commissioned using chip-tool. Use the same KVS file when +running the test. + +#### Running the tests + +There are several options for running tests locally. Because the YAML runner +uses python, it is necessary to compile and install the chip python package +before using any YAML runner script. + +``` +./scripts/build_python.sh -i py +source py/bin/activate +``` + +Compile chip-tool: + +``` +./scripts/build/build_examples.py --target linux-x64-chip-tool build + +``` + +NOTE: use the target appropriate to your system + +[chiptool.py](https://github.com/project-chip/connectedhomeip/blob/master/scripts/tests/yaml/chiptool.py) +can be used to run tests against a commissioned DUT (commissioned by chip-tool). +This will start an interactive instance of chip-tool automatically. + +``` +./scripts/tests/yaml/chiptool.py tests Test_TC_OO_2_1 --server_path ./out/linux-x64-chip-tool/chip-tool + +``` + +NOTE: substitute the appropriate test name and chip-tool path as appropriate. + +A list of available tests can be generated using: + +``` +./scripts/tests/yaml/chiptool.py list +``` + +Config variables can be passed to chiptool.py after the script by separating +with -- + +``` +./scripts/tests/yaml/chiptool.py tests Test_TC_OO_2_1 --server_path ./out/linux-x64-chip-tool/chip-tool -- nodeId 0x12344321 + +``` + +#### Factory resetting the DUT + +On the host machine, you can simulate a factory reset by deleting the KVS file. +If you did not specify a location for the KVS file when starting the +application, the KVS file will be in /tmp as chip_kvs + +### Running in the CI + +- YAML tests added to the certification directory get run automatically + - src/app/tests/suites/certification/ + - PICS file: src/app/tests/suites/certification/ci-pics-values +- If you DON’T want to run a test in the CI + - (ex under development), add it to \_GetInDevelopmentTests in + `scripts/tests/chiptest/__init__.py` + +Please see [CI testing](./ci_testing.md) for more information about how to set +up examples apps, PICS and PIXIT values for use in the CI. + +### Running in the TH + +TODO: Do we have a permanent link to the most up to date TH documentation? If +so, add here. diff --git a/docs/testing/yaml_pseudocluster.md b/docs/testing/yaml_pseudocluster.md new file mode 100644 index 00000000000000..49946187aa39b9 --- /dev/null +++ b/docs/testing/yaml_pseudocluster.md @@ -0,0 +1,74 @@ + + +# YAML Pseudo-clusters + + + +CommissionerCommands +|command|args|arg type| arg optional| +|:---|:---|:---|:---| +|PairWithCode|nodeId
payload
discoverOnce|node_id
char_string
boolean|false
false
true| +|Unpair|nodeId|node_id|false| +|GetCommissionerNodeId|||| +|GetCommissionerNodeIdResponse|nodeId|node_id|false| +|GetCommissionerRootCertificate|||| +|GetCommissionerRootCertificateResponse|RCAC|OCTET_STRING|false| +|IssueNocChain|Elements
nodeId|octet_string
node_id|false
false| +|IssueNocChainResponse|NOC
ICAC
RCAC
IPK|octet_string
octet_string
octet_string
octet_string|false
false
false
false| + + +DelayCommands +|command|args|arg type| arg optional| +|:---|:---|:---|:---| +|WaitForCommissioning|||| +|WaitForCommissionee|nodeId
expireExistingSession|node_id
bool|false
true| +|WaitForMs|ms|int16u|false| +|WaitForMessage|registerKey
message|char_string
char_string|false
false| + + +DiscoveryCommands +|command|args|arg type| arg optional| +|:---|:---|:---|:---| +|FindCommissionable|||| +|FindCommissionableByShortDiscriminator|value|int16u|false| +|FindCommissionableByLongDiscriminator|value|int16u|false| +|FindCommissionableByCommissioningMode|||| +|FindCommissionableByVendorId|value|vendor_id|false| +|FindCommissionableByDeviceType|value|devtype_id|false| +|FindCommissioner|||| +|FindCommissionerByVendorId|value|vendor_id|false| +|FindCommissionerByDeviceType|value|devtype_id|false| +|FindResponse|hostName
instanceName
longDiscriminator
shortDiscriminator
vendorId
productId
commissioningMode
deviceType
deviceName
rotatingId
rotatingIdLen
pairingHint
pairingInstruction
supportsTcp
numIPs
port
mrpRetryIntervalIdle
mrpRetryIntervalActive
mrpRetryActiveThreshold
isICDOperatingAsLIT|char_string
char_string
int16u
int16u
vendor_id
int16u
int8u
devtype_id
char_string
octet_string
int64u
int16u
char_string
boolean
int8u
int16u
int32u
int32u
int16u
boolean|false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
true
true
true
true| + + +EqualityCommands +|command|args|arg type| arg optional| +|:---|:---|:---|:---| +|BooleanEquals|Value1
Value2|boolean
boolean|false
false| +|SignedNumberEquals|Value1
Value2|int64s
int64s|false
false| +|UnsignedNumberEquals|Value1
Value2|int64u
int64u|false
false| +|EqualityResponse|Equals|bool|false| + + +LogCommands +|command|args|arg type| arg optional| +|:---|:---|:---|:---| +|Log|message|char_string|false| +|UserPrompt|message
expectedValue|char_string
char_string|false
true| + + +SystemCommands +|command|args|arg type| arg optional| +|:---|:---|:---|:---| +|Start|registerKey
discriminator
port
minCommissioningTimeout
kvs
filepath
otaDownloadPath
endUserSupportLogPath
networkDiagnosticsLogPath
crashLogPath|char_string
int16u
int16u
int16u
char_string
char_string
char_string
char_string
char_string
char_string|true
true
true
true
true
true
true
true
true
true| +|Stop|registerKey|char_string|true| +|Reboot|registerKey|char_string|true| +|FactoryReset|registerKey|char_string|true| +|CreateOtaImage|otaImageFilePath
rawImageFilePath
rawImageContent|char_string
char_string
char_string|false
false
false| +|CompareFiles|file1
file2|char_string
char_string|false
false| +|CreateFile|filePath
fileContent|char_string
char_string|false
false| +|DeleteFile|filePath|char_string|false| diff --git a/docs/testing/yaml_schema.md b/docs/testing/yaml_schema.md new file mode 100644 index 00000000000000..8a4846bde5e4f1 --- /dev/null +++ b/docs/testing/yaml_schema.md @@ -0,0 +1,75 @@ + + +# YAML Schema + +YAML schema +|key | type| supports variables +|:---|:---|:---| +|name |str|| +|PICS |str,list|| +|config | | | +|  nodeId |int|| +|  cluster |str|| +|  endpoint |int|| +|  _variableName_ | | | +|    type |type|| +|    defaultValue |Any|| +|tests | | | +|  label |str|| +|  identity |str|| +|  nodeId |int|Y| +|  runIf |str|| +|  groupId |int|Y| +|  endpoint |int|Y| +|  cluster |str|| +|  attribute |str|| +|  command |str|| +|  event |str|| +|  eventNumber |int|Y| +|  disabled |bool|| +|  fabricFiltered |bool|| +|  verification |str|| +|  PICS |str|| +|  arguments | | | +|    values | | | +|      value |NoneType,bool,int,float,dict,list|Y| +|      name |str|| +|    value |NoneType,bool,int,float,dict,list|Y| +|  response | |Y | +|    value |NoneType,bool,int,float,dict,list|Y| +|    name |str|| +|    error |str|| +|    clusterError |int|| +|    constraints | | | +|      hasValue |bool|| +|      type |str|| +|      minLength |int|| +|      maxLength |int|| +|      isHexString |bool|| +|      startsWith |str|| +|      endsWith |str|| +|      isUpperCase |bool|| +|      isLowerCase |bool|| +|      minValue |int,float|Y| +|      maxValue |int,float|Y| +|      contains |list|| +|      excludes |list|| +|      hasMasksSet |list|| +|      hasMasksClear |list|| +|      notValue |NoneType,bool,int,float,list,dict|Y| +|      anyOf |list|| +|    saveAs |str|| +|    saveDataVersschemaionAs |str|| +|  saveResponseAs |str|| +|  minInterval |int|| +|  maxInterval |int|| +|  keepSubscriptions |bool|| +|  timeout |int|| +|  timedInteractionTimeoutMs |int|| +|  dataVersion |list,int|Y| +|  busyWaitMs |int|| +|  wait |str|| diff --git a/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter index d6f5e88f0f3407..33de78383c41fc 100644 --- a/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter +++ b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter @@ -1901,7 +1901,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2105,7 +2105,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2192,7 +2192,7 @@ endpoint 2 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2433,7 +2433,7 @@ endpoint 3 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2477,7 +2477,7 @@ endpoint 4 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 9e6fd096b39361..d71c47a6d98758 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 @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2445,10 +2445,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3525,10 +3525,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -6822,10 +6822,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -7347,10 +7347,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter index e1c3018f693dfa..93807b60380b51 100644 --- a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter +++ b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter @@ -1992,7 +1992,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2309,7 +2309,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 52d2ddfccc18f1..06db369cc4e3b6 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 @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4048,10 +4048,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter index 04dbb94c3e0d8f..4d1ac5923ff553 100644 --- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter +++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter @@ -2929,7 +2929,7 @@ cluster RvcRunMode = 84 { } bitmap Feature : bitmap32 { - kOnOff = 0x1; + kNoFeatures = 0x0; } struct ModeTagStruct { @@ -2945,7 +2945,6 @@ cluster RvcRunMode = 84 { readonly attribute ModeOptionStruct supportedModes[] = 0; readonly attribute int8u currentMode = 1; - attribute optional nullable int8u onMode = 3; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -2982,7 +2981,7 @@ cluster RvcCleanMode = 85 { } bitmap Feature : bitmap32 { - kOnOff = 0x1; + kNoFeatures = 0x0; } struct ModeTagStruct { @@ -2998,7 +2997,6 @@ cluster RvcCleanMode = 85 { readonly attribute ModeOptionStruct supportedModes[] = 0; readonly attribute int8u currentMode = 1; - attribute optional nullable int8u onMode = 3; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -3480,10 +3478,6 @@ cluster RvcOperationalState = 97 { /** Upon receipt, the device SHALL pause its operation if it is possible based on the current function of the server. */ command Pause(): OperationalCommandResponse = 0; - /** Upon receipt, the device SHALL stop its operation if it is at a position where it is safe to do so and/or permitted. */ - command Stop(): OperationalCommandResponse = 1; - /** Upon receipt, the device SHALL start its operation if it is safe to do so and the device is in an operational state from which it can be started. */ - command Start(): OperationalCommandResponse = 2; /** Upon receipt, the device SHALL resume its operation from the point it was at when it received the Pause command, or from the point when it was paused by means outside of this cluster (for example by manual button press). */ command Resume(): OperationalCommandResponse = 3; /** On receipt of this command, the device SHALL start seeking the charging dock, if possible in the current state of the device. */ @@ -3492,7 +3486,7 @@ cluster RvcOperationalState = 97 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -3500,13 +3494,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -3528,14 +3515,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -3546,7 +3528,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -3566,7 +3548,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -3605,7 +3587,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -3619,34 +3601,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -3655,7 +3609,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -3675,12 +3629,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** Attributes and commands for monitoring HEPA filters in a device */ @@ -4376,6 +4326,107 @@ provisional cluster EnergyEvse = 153 { timed command ClearTargets(): DefaultSuccess = 7; } +/** Attributes and commands for selecting a mode from a list of supported options. */ +provisional cluster EnergyEvseMode = 157 { + revision 1; + + enum ModeTag : enum16 { + kManual = 16384; + kTimeOfUse = 16385; + kSolarCharging = 16386; + } + + bitmap Feature : bitmap32 { + kOnOff = 0x1; + } + + struct ModeTagStruct { + optional vendor_id mfgCode = 0; + enum16 value = 1; + } + + struct ModeOptionStruct { + char_string<64> label = 0; + int8u mode = 1; + ModeTagStruct modeTags[] = 2; + } + + readonly attribute ModeOptionStruct supportedModes[] = 0; + readonly attribute int8u currentMode = 1; + attribute optional nullable int8u startUpMode = 2; + attribute optional nullable int8u onMode = 3; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ChangeToModeRequest { + int8u newMode = 0; + } + + response struct ChangeToModeResponse = 1 { + enum8 status = 0; + optional char_string<64> statusText = 1; + } + + /** This command is used to change device modes. + On receipt of this command the device SHALL respond with a ChangeToModeResponse command. */ + command ChangeToMode(ChangeToModeRequest): ChangeToModeResponse = 0; +} + +/** Attributes and commands for selecting a mode from a list of supported options. */ +provisional cluster DeviceEnergyManagementMode = 159 { + revision 1; + + enum ModeTag : enum16 { + kNoOptimization = 16384; + kDeviceOptimization = 16385; + kLocalOptimization = 16386; + kGridOptimization = 16387; + } + + bitmap Feature : bitmap32 { + kOnOff = 0x1; + } + + struct ModeTagStruct { + optional vendor_id mfgCode = 0; + enum16 value = 1; + } + + struct ModeOptionStruct { + char_string<64> label = 0; + int8u mode = 1; + ModeTagStruct modeTags[] = 2; + } + + readonly attribute ModeOptionStruct supportedModes[] = 0; + readonly attribute int8u currentMode = 1; + attribute optional nullable int8u startUpMode = 2; + attribute optional nullable int8u onMode = 3; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ChangeToModeRequest { + int8u newMode = 0; + } + + response struct ChangeToModeResponse = 1 { + enum8 status = 0; + optional char_string<64> statusText = 1; + } + + /** This command is used to change device modes. + On receipt of this command the device SHALL respond with a ChangeToModeResponse command. */ + command ChangeToMode(ChangeToModeRequest): ChangeToModeResponse = 0; +} + /** Provides an interface for controlling and adjusting automatic window coverings. */ cluster WindowCovering = 258 { revision 5; @@ -6245,7 +6296,7 @@ cluster RadonConcentrationMeasurement = 1071 { /** This cluster provides an interface for managing low power mode on a device that supports the Wake On LAN protocol. */ cluster WakeOnLan = 1283 { - revision 1; // NOTE: Default/not specifically set + revision 1; readonly attribute optional char_string<12> MACAddress = 0; readonly attribute optional octet_string<16> linkLocalAddress = 1; @@ -6559,6 +6610,10 @@ internal cluster UnitTesting = 4294048773 { fabric_idx fabricIndex = 254; } + info event TestDifferentVendorMeiEvent = 4294050030 { + int8u arg1 = 1; + } + attribute boolean boolean = 0; attribute Bitmap8MaskMap bitmap8 = 1; attribute Bitmap16MaskMap bitmap16 = 2; @@ -6641,6 +6696,7 @@ internal cluster UnitTesting = 4294048773 { attribute nullable int16u nullableRangeRestrictedInt16u = 16424; attribute nullable int16s nullableRangeRestrictedInt16s = 16425; attribute optional int8u writeOnlyInt8u = 16426; + attribute int8u meiInt8u = 4294070017; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -6836,6 +6892,15 @@ internal cluster UnitTesting = 4294048773 { int8u fillCharacter = 2; } + request struct TestDifferentVendorMeiRequestRequest { + int8u arg1 = 0; + } + + response struct TestDifferentVendorMeiResponse = 4294049979 { + int8u arg1 = 0; + int64u eventNumber = 1; + } + /** Simple command without any parameters and without a specific response. To aid in unit testing, this command will re-initialize attribute storage to defaults. */ command Test(): DefaultSuccess = 0; @@ -6906,6 +6971,8 @@ internal cluster UnitTesting = 4294048773 { command TestBatchHelperRequest(TestBatchHelperRequestRequest): TestBatchHelperResponse = 22; /** Second command that responds after sleepBeforeResponseTimeMs with an octet_string the size requested with fillCharacter. */ command TestSecondBatchHelperRequest(TestSecondBatchHelperRequestRequest): TestBatchHelperResponse = 23; + /** Command having a different MEI vendor ID than the cluster. Also emits TestDifferentVendorMeiEvent. */ + command TestDifferentVendorMeiRequest(TestDifferentVendorMeiRequestRequest): TestDifferentVendorMeiResponse = 4294049962; } /** The Fault Injection Cluster provide a means for a test harness to configure faults(for example triggering a fault in the system). */ @@ -6990,7 +7057,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -7171,10 +7238,15 @@ endpoint 0 { } server cluster DiagnosticLogs { + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; handle command RetrieveLogsRequest; + handle command RetrieveLogsResponse; } server cluster GeneralDiagnostics { @@ -7566,7 +7638,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -7650,6 +7722,9 @@ endpoint 1 { callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; + + handle command ChangeToMode; + handle command ChangeToModeResponse; } server cluster LaundryDryerControls { @@ -7726,9 +7801,9 @@ endpoint 1 { server cluster RvcRunMode { callback attribute supportedModes; callback attribute currentMode; - callback attribute onMode; callback attribute generatedCommandList; callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; callback attribute featureMap; ram attribute clusterRevision default = 2; @@ -7740,9 +7815,9 @@ endpoint 1 { server cluster RvcCleanMode { callback attribute supportedModes; callback attribute currentMode; - callback attribute onMode; callback attribute generatedCommandList; callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; callback attribute featureMap; ram attribute clusterRevision default = 2; @@ -7890,6 +7965,7 @@ endpoint 1 { callback attribute operationalError; callback attribute generatedCommandList; callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; @@ -7901,7 +7977,6 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport default = 0x80; ram attribute lastConfiguredBy; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; @@ -7909,8 +7984,8 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; @@ -7925,10 +8000,6 @@ endpoint 1 { handle command RecallScene; handle command GetSceneMembership; handle command GetSceneMembershipResponse; - handle command EnhancedAddScene; - handle command EnhancedAddSceneResponse; - handle command EnhancedViewScene; - handle command EnhancedViewSceneResponse; handle command CopyScene; handle command CopySceneResponse; } @@ -8105,6 +8176,34 @@ endpoint 1 { handle command ClearTargets; } + server cluster EnergyEvseMode { + callback attribute supportedModes; + callback attribute currentMode; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + callback attribute featureMap; + ram attribute clusterRevision default = 1; + + handle command ChangeToMode; + handle command ChangeToModeResponse; + } + + server cluster DeviceEnergyManagementMode { + callback attribute supportedModes; + callback attribute currentMode; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + callback attribute featureMap; + ram attribute clusterRevision default = 1; + + handle command ChangeToMode; + handle command ChangeToModeResponse; + } + server cluster WindowCovering { ram attribute type default = 0x08; ram attribute physicalClosedLimitLift default = 0xFFFF; @@ -8622,6 +8721,7 @@ endpoint 1 { server cluster UnitTesting { emits event TestEvent; emits event TestFabricScopedEvent; + emits event TestDifferentVendorMeiEvent; ram attribute boolean default = false; ram attribute bitmap8 default = 0; ram attribute bitmap16 default = 0; @@ -8705,6 +8805,7 @@ endpoint 1 { callback attribute writeOnlyInt8u default = 0; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; + ram attribute meiInt8u default = 0; handle command Test; handle command TestSpecificResponse; @@ -8734,6 +8835,8 @@ endpoint 1 { handle command TestEmitTestFabricScopedEventRequest; handle command TestBatchHelperRequest; handle command TestSecondBatchHelperRequest; + handle command TestDifferentVendorMeiRequest; + handle command TestDifferentVendorMeiResponse; } } endpoint 2 { @@ -8807,7 +8910,7 @@ endpoint 2 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -8828,7 +8931,6 @@ endpoint 2 { } server cluster ScenesManagement { - ram attribute nameSupport default = 0x80; ram attribute lastConfiguredBy; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; @@ -8836,8 +8938,8 @@ endpoint 2 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; @@ -8852,10 +8954,6 @@ endpoint 2 { handle command RecallScene; handle command GetSceneMembership; handle command GetSceneMembershipResponse; - handle command EnhancedAddScene; - handle command EnhancedAddSceneResponse; - handle command EnhancedViewScene; - handle command EnhancedViewSceneResponse; handle command CopyScene; handle command CopySceneResponse; } @@ -8881,7 +8979,7 @@ endpoint 65534 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 4beb963e3cef2c..b06c93baae9358 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 @@ -17,6 +17,12 @@ } ], "package": [ + { + "pathRelativity": "relativeToZap", + "path": "../../../src/app/zap-templates/app-templates.json", + "type": "gen-templates-json", + "version": "chip-v1" + }, { "pathRelativity": "relativeToZap", "path": "../../../src/app/zap-templates/zcl/zcl-with-test-extensions.json", @@ -24,12 +30,6 @@ "category": "matter", "version": 1, "description": "Matter SDK ZCL data with some extensions" - }, - { - "pathRelativity": "relativeToZap", - "path": "../../../src/app/zap-templates/app-templates.json", - "type": "gen-templates-json", - "version": "chip-v1" } ], "endpointTypes": [ @@ -459,10 +459,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2723,9 +2723,81 @@ "source": "client", "isIncoming": 1, "isEnabled": 1 + }, + { + "name": "RetrieveLogsResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 } ], "attributes": [ + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, @@ -7472,10 +7544,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -8326,6 +8398,24 @@ "side": "server", "enabled": 1, "apiMaturity": "provisional", + "commands": [ + { + "name": "ChangeToMode", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ChangeToModeResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], "attributes": [ { "name": "SupportedModes", @@ -9380,11 +9470,11 @@ "reportableChange": 0 }, { - "name": "OnMode", - "code": 3, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", - "type": "int8u", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -9396,8 +9486,8 @@ "reportableChange": 0 }, { - "name": "GeneratedCommandList", - "code": 65528, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", "type": "array", @@ -9412,8 +9502,8 @@ "reportableChange": 0 }, { - "name": "AcceptedCommandList", - "code": 65529, + "name": "EventList", + "code": 65530, "mfgCode": null, "side": "server", "type": "array", @@ -9421,7 +9511,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": null, + "defaultValue": "", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -9536,11 +9626,11 @@ "reportableChange": 0 }, { - "name": "OnMode", - "code": 3, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", - "type": "int8u", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -9552,8 +9642,8 @@ "reportableChange": 0 }, { - "name": "GeneratedCommandList", - "code": 65528, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", "type": "array", @@ -9568,8 +9658,8 @@ "reportableChange": 0 }, { - "name": "AcceptedCommandList", - "code": 65529, + "name": "EventList", + "code": 65530, "mfgCode": null, "side": "server", "type": "array", @@ -9577,7 +9667,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": null, + "defaultValue": "", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -11263,6 +11353,22 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "AttributeList", "code": 65531, @@ -11442,41 +11548,9 @@ "isIncoming": 0, "isEnabled": 1 }, - { - "name": "EnhancedAddScene", - "code": 64, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedAddSceneResponse", - "code": 64, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, - { - "name": "EnhancedViewScene", - "code": 65, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedViewSceneResponse", - "code": 65, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, { "name": "CopyScene", - "code": 66, + "code": 64, "mfgCode": null, "source": "client", "isIncoming": 1, @@ -11484,7 +11558,7 @@ }, { "name": "CopySceneResponse", - "code": 66, + "code": 64, "mfgCode": null, "source": "server", "isIncoming": 0, @@ -11492,25 +11566,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x80", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "LastConfiguredBy", - "code": 5, + "code": 0, "mfgCode": null, "side": "server", "type": "node_id", @@ -11526,7 +11584,7 @@ }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -11542,7 +11600,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -11630,7 +11688,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -11646,7 +11704,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -13080,7 +13138,7 @@ "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -13752,15 +13810,16 @@ ] }, { - "name": "Window Covering", - "code": 258, + "name": "Energy EVSE Mode", + "code": 157, "mfgCode": null, - "define": "WINDOW_COVERING_CLUSTER", + "define": "ENERGY_EVSE_MODE_CLUSTER", "side": "server", "enabled": 1, + "apiMaturity": "provisional", "commands": [ { - "name": "UpOrOpen", + "name": "ChangeToMode", "code": 0, "mfgCode": null, "source": "client", @@ -13768,27 +13827,340 @@ "isEnabled": 1 }, { - "name": "DownOrClose", + "name": "ChangeToModeResponse", "code": 1, "mfgCode": null, - "source": "client", - "isIncoming": 1, + "source": "server", + "isIncoming": 0, "isEnabled": 1 - }, + } + ], + "attributes": [ { - "name": "StopMotion", - "code": 2, + "name": "SupportedModes", + "code": 0, "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 }, { - "name": "GoToLiftValue", - "code": 4, + "name": "CurrentMode", + "code": 1, "mfgCode": null, - "source": "client", - "isIncoming": 1, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Device Energy Management Mode", + "code": 159, + "mfgCode": null, + "define": "DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER", + "side": "server", + "enabled": 1, + "apiMaturity": "provisional", + "commands": [ + { + "name": "ChangeToMode", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ChangeToModeResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "SupportedModes", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentMode", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Window Covering", + "code": 258, + "mfgCode": null, + "define": "WINDOW_COVERING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "UpOrOpen", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "DownOrClose", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StopMotion", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GoToLiftValue", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, "isEnabled": 1 }, { @@ -20853,6 +21225,22 @@ "source": "client", "isIncoming": 1, "isEnabled": 1 + }, + { + "name": "TestDifferentVendorMeiRequest", + "code": 4294049962, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "TestDifferentVendorMeiResponse", + "code": 4294049979, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 } ], "attributes": [ @@ -22183,6 +22571,22 @@ "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 + }, + { + "name": "mei_int8u", + "code": 4294070017, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 } ], "events": [ @@ -22199,6 +22603,13 @@ "mfgCode": null, "side": "server", "included": 1 + }, + { + "name": "TestDifferentVendorMeiEvent", + "code": 4294050030, + "mfgCode": null, + "side": "server", + "included": 1 } ] } @@ -22994,10 +23405,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -23352,41 +23763,9 @@ "isIncoming": 0, "isEnabled": 1 }, - { - "name": "EnhancedAddScene", - "code": 64, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedAddSceneResponse", - "code": 64, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, - { - "name": "EnhancedViewScene", - "code": 65, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedViewSceneResponse", - "code": 65, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, { "name": "CopyScene", - "code": 66, + "code": 64, "mfgCode": null, "source": "client", "isIncoming": 1, @@ -23394,7 +23773,7 @@ }, { "name": "CopySceneResponse", - "code": 66, + "code": 64, "mfgCode": null, "source": "server", "isIncoming": 0, @@ -23402,25 +23781,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x80", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "LastConfiguredBy", - "code": 5, + "code": 0, "mfgCode": null, "side": "server", "type": "node_id", @@ -23436,7 +23799,7 @@ }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -23452,7 +23815,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -23540,7 +23903,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -23556,7 +23919,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -23826,10 +24189,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h b/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h index af8313fa285385..8af4aa5f6f9155 100644 --- a/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h +++ b/examples/all-clusters-app/all-clusters-common/include/rvc-modes.h @@ -41,6 +41,7 @@ class RvcRunModeDelegate : public ModeBase::Delegate using ModeTagStructType = detail::Structs::ModeTagStruct::Type; ModeTagStructType ModeTagsIdle[1] = { { .value = to_underlying(ModeTag::kIdle) } }; ModeTagStructType ModeTagsCleaning[1] = { { .value = to_underlying(ModeTag::kCleaning) } }; + ModeTagStructType ModeTagsMapping[1] = { { .value = to_underlying(ModeTag::kMapping) } }; const detail::Structs::ModeOptionStruct::Type kModeOptions[3] = { detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Idle"), @@ -49,10 +50,9 @@ class RvcRunModeDelegate : public ModeBase::Delegate detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Cleaning"), .mode = ModeCleaning, .modeTags = DataModel::List(ModeTagsCleaning) }, - detail::Structs::ModeOptionStruct::Type{ - .label = CharSpan::fromCharString("Mapping"), - .mode = ModeMapping, - .modeTags = DataModel::List(ModeTagsIdle) }, // todo set to no mode tags + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Mapping"), + .mode = ModeMapping, + .modeTags = DataModel::List(ModeTagsMapping) }, }; CHIP_ERROR Init() override; diff --git a/examples/all-clusters-app/all-clusters-common/src/boolcfg-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/boolcfg-stub.cpp index 36716ec69ce52e..fe2ec9050683e8 100644 --- a/examples/all-clusters-app/all-clusters-common/src/boolcfg-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/boolcfg-stub.cpp @@ -15,7 +15,7 @@ * limitations under the License. */ -#include +#include #include #include diff --git a/examples/all-clusters-app/all-clusters-common/src/device-energy-management-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/device-energy-management-stub.cpp index 190702c61af464..ddbfe17e639d60 100644 --- a/examples/all-clusters-app/all-clusters-common/src/device-energy-management-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/device-energy-management-stub.cpp @@ -52,8 +52,7 @@ void emberAfDeviceEnergyManagementClusterInitCallback(chip::EndpointId endpointI BitMask( DeviceEnergyManagement::Feature::kPowerAdjustment, DeviceEnergyManagement::Feature::kPowerForecastReporting, DeviceEnergyManagement::Feature::kStateForecastReporting, DeviceEnergyManagement::Feature::kStartTimeAdjustment, - DeviceEnergyManagement::Feature::kPausable, DeviceEnergyManagement::Feature::kForecastAdjustment, - DeviceEnergyManagement::Feature::kConstraintBasedAdjustment)); + DeviceEnergyManagement::Feature::kPausable)); if (!gInstance) { diff --git a/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp b/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp index 480c8f793ceb4d..7fc5b61499fed2 100644 --- a/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/rvc-modes.cpp @@ -43,7 +43,7 @@ void RvcRunModeDelegate::HandleChangeToMode(uint8_t NewMode, ModeBase::Commands: // Our business logic states that we can only switch into the mapping state from the idle state. if (NewMode == RvcRunMode::ModeMapping && currentMode != RvcRunMode::ModeIdle) { - response.status = to_underlying(ModeBase::StatusCode::kGenericFailure); + response.status = to_underlying(ModeBase::StatusCode::kInvalidInMode); response.statusText.SetValue(chip::CharSpan::fromCharString("Change to the mapping mode is only allowed from idle")); return; } @@ -113,7 +113,7 @@ void emberAfRvcRunModeClusterInitCallback(chip::EndpointId endpointId) VerifyOrDie(gRvcRunModeDelegate == nullptr && gRvcRunModeInstance == nullptr); gRvcRunModeDelegate = new RvcRunMode::RvcRunModeDelegate; gRvcRunModeInstance = - new ModeBase::Instance(gRvcRunModeDelegate, 0x1, RvcRunMode::Id, chip::to_underlying(RvcRunMode::Feature::kOnOff)); + new ModeBase::Instance(gRvcRunModeDelegate, 0x1, RvcRunMode::Id, chip::to_underlying(RvcRunMode::Feature::kNoFeatures)); gRvcRunModeInstance->Init(); } @@ -130,10 +130,11 @@ void RvcCleanModeDelegate::HandleChangeToMode(uint8_t NewMode, ModeBase::Command { uint8_t rvcRunCurrentMode = gRvcRunModeInstance->GetCurrentMode(); - if (rvcRunCurrentMode == RvcRunMode::ModeCleaning) + if (rvcRunCurrentMode != RvcRunMode::ModeIdle) { - response.status = to_underlying(RvcCleanMode::StatusCode::kCleaningInProgress); - response.statusText.SetValue(chip::CharSpan::fromCharString("Cannot change the cleaning mode during a clean")); + response.status = to_underlying(ModeBase::StatusCode::kInvalidInMode); + response.statusText.SetValue( + chip::CharSpan::fromCharString("Cannot change the cleaning mode when the device is not in idle")); return; } @@ -202,6 +203,6 @@ void emberAfRvcCleanModeClusterInitCallback(chip::EndpointId endpointId) VerifyOrDie(gRvcCleanModeDelegate == nullptr && gRvcCleanModeInstance == nullptr); gRvcCleanModeDelegate = new RvcCleanMode::RvcCleanModeDelegate; gRvcCleanModeInstance = - new ModeBase::Instance(gRvcCleanModeDelegate, 0x1, RvcCleanMode::Id, chip::to_underlying(RvcCleanMode::Feature::kOnOff)); + new ModeBase::Instance(gRvcCleanModeDelegate, 0x1, RvcCleanMode::Id, chip::to_underlying(RvcRunMode::Feature::kNoFeatures)); gRvcCleanModeInstance->Init(); } diff --git a/examples/all-clusters-app/all-clusters-common/src/smco-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/smco-stub.cpp index 4b1e883a6b7d17..88c85f71fc3687 100644 --- a/examples/all-clusters-app/all-clusters-common/src/smco-stub.cpp +++ b/examples/all-clusters-app/all-clusters-common/src/smco-stub.cpp @@ -15,7 +15,7 @@ * limitations under the License. */ -#include +#include #include #include diff --git a/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp b/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp index bede2bcf537a76..027bb055cca44f 100644 --- a/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp +++ b/examples/all-clusters-app/ameba/main/SmokeCOAlarmManager.cpp @@ -16,7 +16,7 @@ */ #include "SmokeCOAlarmManager.h" -#include +#include #include using namespace chip; diff --git a/examples/all-clusters-app/ameba/main/chipinterface.cpp b/examples/all-clusters-app/ameba/main/chipinterface.cpp index 21280c676154be..20de9cd1ff0124 100644 --- a/examples/all-clusters-app/ameba/main/chipinterface.cpp +++ b/examples/all-clusters-app/ameba/main/chipinterface.cpp @@ -140,8 +140,10 @@ static void InitServer(intptr_t context) static chip::CommonCaseDeviceServerInitParams initParams; #if CONFIG_ENABLE_AMEBA_TEST_EVENT_TRIGGER - static AmebaTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + // TODO(#31723): Show to customers that they can do `Server::GetInstance().GetTestEventTriggerDelegate().AddHandler(xxx)` + // to add custom handlers during their app init, after InitServer. + static AmebaTestEventTriggerDelegate sTestEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; #endif initParams.InitializeStaticResourcesBeforeServerInit(); diff --git a/examples/all-clusters-app/ameba/main/include/SmokeCOAlarmManager.h b/examples/all-clusters-app/ameba/main/include/SmokeCOAlarmManager.h index 390ee679d0d255..af6177299a3948 100644 --- a/examples/all-clusters-app/ameba/main/include/SmokeCOAlarmManager.h +++ b/examples/all-clusters-app/ameba/main/include/SmokeCOAlarmManager.h @@ -22,8 +22,6 @@ #include #include -bool emberAfHandleEventTrigger(uint64_t eventTrigger); - class SmokeCoAlarmManager { public: diff --git a/examples/all-clusters-app/esp32/sdkconfig.defaults.esp32c6 b/examples/all-clusters-app/esp32/sdkconfig.defaults.esp32c6 index 7ef46707ea5c95..29a525f2a75994 100644 --- a/examples/all-clusters-app/esp32/sdkconfig.defaults.esp32c6 +++ b/examples/all-clusters-app/esp32/sdkconfig.defaults.esp32c6 @@ -19,13 +19,13 @@ CONFIG_BT_ENABLED=y CONFIG_BT_NIMBLE_ENABLED=y CONFIG_BT_NIMBLE_EXT_ADV=n CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 -CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=n +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=y # Disable OpenThread CONFIG_OPENTHREAD_ENABLED=n # Disable lwip ipv6 autoconfig -CONFIG_LWIP_IPV6_AUTOCONFIG=n +CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y diff --git a/examples/all-clusters-app/linux/AppOptions.cpp b/examples/all-clusters-app/linux/AppOptions.cpp index ef42660972f8d9..50be6561c6bb4a 100644 --- a/examples/all-clusters-app/linux/AppOptions.cpp +++ b/examples/all-clusters-app/linux/AppOptions.cpp @@ -27,11 +27,23 @@ using chip::ArgParser::OptionDef; using chip::ArgParser::OptionSet; using chip::ArgParser::PrintArgError; -constexpr uint16_t kOptionDacProviderFilePath = 0xFF01; -constexpr uint16_t kOptionMinCommissioningTimeout = 0xFF02; +constexpr uint16_t kOptionDacProviderFilePath = 0xFF01; +constexpr uint16_t kOptionMinCommissioningTimeout = 0xFF02; +constexpr uint16_t kOptionEndUserSupportFilePath = 0xFF03; +constexpr uint16_t kOptionNetworkDiagnosticsFilePath = 0xFF04; +constexpr uint16_t kOptionCrashFilePath = 0xFF05; static chip::Credentials::Examples::TestHarnessDACProvider mDacProvider; +static chip::Optional sEndUserSupportLogFilePath; +static chip::Optional sNetworkDiagnosticsLogFilePath; +static chip::Optional sCrashLogFilePath; + +bool AppOptions::IsEmptyString(const char * value) +{ + return (value == nullptr || strlen(value) == 0); +} + bool AppOptions::HandleOptions(const char * program, OptionSet * options, int identifier, const char * name, const char * value) { bool retval = true; @@ -45,6 +57,27 @@ bool AppOptions::HandleOptions(const char * program, OptionSet * options, int id commissionMgr.OverrideMinCommissioningTimeout(chip::System::Clock::Seconds16(static_cast(atoi(value)))); break; } + case kOptionEndUserSupportFilePath: { + if (!IsEmptyString(value)) + { + sEndUserSupportLogFilePath.SetValue(value); + } + break; + } + case kOptionNetworkDiagnosticsFilePath: { + if (!IsEmptyString(value)) + { + sNetworkDiagnosticsLogFilePath.SetValue(value); + } + break; + } + case kOptionCrashFilePath: { + if (!IsEmptyString(value)) + { + sCrashLogFilePath.SetValue(value); + } + break; + } default: PrintArgError("%s: INTERNAL ERROR: Unhandled option: %s\n", program, name); retval = false; @@ -59,6 +92,9 @@ OptionSet * AppOptions::GetOptions() static OptionDef optionsDef[] = { { "dac_provider", kArgumentRequired, kOptionDacProviderFilePath }, { "min_commissioning_timeout", kArgumentRequired, kOptionMinCommissioningTimeout }, + { "end_user_support_log", kArgumentRequired, kOptionEndUserSupportFilePath }, + { "network_diagnostics_log", kArgumentRequired, kOptionNetworkDiagnosticsFilePath }, + { "crash_log", kArgumentRequired, kOptionCrashFilePath }, {}, }; @@ -68,6 +104,12 @@ OptionSet * AppOptions::GetOptions() " A json file with data used by the example dac provider to validate device attestation procedure.\n" " --min_commissioning_timeout \n" " The minimum time in seconds during which commissioning session establishment is allowed by the Node.\n" + " --end_user_support_log \n" + " The end user support log file to be used for diagnostic logs transfer.\n" + " --network_diagnostics_log \n" + " The network diagnostics log file to be used for diagnostic logs transfer.\n" + " --crash_log \n" + " The crash log file to be used for diagnostic logs transfer.\n" }; return &options; @@ -77,3 +119,18 @@ chip::Credentials::DeviceAttestationCredentialsProvider * AppOptions::GetDACProv { return &mDacProvider; } + +chip::Optional AppOptions::GetEndUserSupportLogFilePath() +{ + return sEndUserSupportLogFilePath; +} + +chip::Optional AppOptions::GetNetworkDiagnosticsLogFilePath() +{ + return sNetworkDiagnosticsLogFilePath; +} + +chip::Optional AppOptions::GetCrashLogFilePath() +{ + return sCrashLogFilePath; +} diff --git a/examples/all-clusters-app/linux/AppOptions.h b/examples/all-clusters-app/linux/AppOptions.h index 3073c66176331f..dfdd2c0e66fe70 100644 --- a/examples/all-clusters-app/linux/AppOptions.h +++ b/examples/all-clusters-app/linux/AppOptions.h @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2022 Project CHIP Authors + * Copyright (c) 2022-2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,8 +27,13 @@ class AppOptions public: static chip::ArgParser::OptionSet * GetOptions(); static chip::Credentials::DeviceAttestationCredentialsProvider * GetDACProvider(); + static chip::Optional GetEndUserSupportLogFilePath(); + static chip::Optional GetNetworkDiagnosticsLogFilePath(); + static chip::Optional GetCrashLogFilePath(); private: static bool HandleOptions(const char * program, chip::ArgParser::OptionSet * options, int identifier, const char * name, const char * value); + + static bool IsEmptyString(const char * value); }; diff --git a/examples/all-clusters-app/linux/BUILD.gn b/examples/all-clusters-app/linux/BUILD.gn index 44f258069c7063..20dd248abf2a1a 100644 --- a/examples/all-clusters-app/linux/BUILD.gn +++ b/examples/all-clusters-app/linux/BUILD.gn @@ -45,10 +45,13 @@ source_set("chip-all-clusters-common") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp", "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-temperature-levels.cpp", "${chip_root}/examples/all-clusters-app/all-clusters-common/src/tcc-mode.cpp", + "${chip_root}/examples/all-clusters-app/linux/diagnostic-logs-provider-delegate-impl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/DeviceEnergyManagementManager.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp", "AllClustersCommandDelegate.cpp", "AppOptions.cpp", "ValveControlDelegate.cpp", diff --git a/examples/all-clusters-app/linux/diagnostic-logs-provider-delegate-impl.cpp b/examples/all-clusters-app/linux/diagnostic-logs-provider-delegate-impl.cpp new file mode 100644 index 00000000000000..4dc94da1338c28 --- /dev/null +++ b/examples/all-clusters-app/linux/diagnostic-logs-provider-delegate-impl.cpp @@ -0,0 +1,177 @@ +/* + * + * Copyright (c) 2023 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "include/diagnostic-logs-provider-delegate-impl.h" + +#include + +using namespace chip; +using namespace chip::app::Clusters::DiagnosticLogs; + +LogProvider LogProvider::sInstance; + +namespace { +bool IsValidIntent(IntentEnum intent) +{ + return intent != IntentEnum::kUnknownEnumValue; +} + +size_t GetFileSize(FILE * fp) +{ + VerifyOrReturnValue(nullptr != fp, 0); + + auto offset = ftell(fp); + VerifyOrReturnValue(offset != -1, 0); + + auto rv = fseek(fp, 0, SEEK_END); + VerifyOrReturnValue(rv == 0, 0); + + auto fileSize = ftell(fp); + VerifyOrReturnValue(fileSize != -1, 0); + + rv = fseek(fp, offset, SEEK_SET); + VerifyOrReturnValue(rv == 0, 0); + + return static_cast(fileSize); +} +} // namespace + +LogProvider::~LogProvider() +{ + for (auto f : mFiles) + { + auto rv = fclose(f.second); + if (rv != 0) + { + ChipLogError(NotSpecified, "Error when closing file pointer: %p (%d)", f.second, errno); + } + } + mFiles.clear(); +} + +CHIP_ERROR LogProvider::GetLogForIntent(IntentEnum intent, MutableByteSpan & outBuffer, Optional & outTimeStamp, + Optional & outTimeSinceBoot) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + LogSessionHandle sessionHandle = kInvalidLogSessionHandle; + + err = StartLogCollection(intent, sessionHandle, outTimeStamp, outTimeSinceBoot); + VerifyOrReturnError(CHIP_NO_ERROR == err, err, outBuffer.reduce_size(0)); + + bool unusedOutIsEndOfLog; + err = CollectLog(sessionHandle, outBuffer, unusedOutIsEndOfLog); + VerifyOrReturnError(CHIP_NO_ERROR == err, err, outBuffer.reduce_size(0)); + + err = EndLogCollection(sessionHandle); + VerifyOrReturnError(CHIP_NO_ERROR == err, err, outBuffer.reduce_size(0)); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR LogProvider::StartLogCollection(IntentEnum intent, LogSessionHandle & outHandle, Optional & outTimeStamp, + Optional & outTimeSinceBoot) +{ + VerifyOrReturnValue(IsValidIntent(intent), CHIP_ERROR_INVALID_ARGUMENT); + + auto filePath = GetFilePathForIntent(intent); + VerifyOrReturnValue(filePath.HasValue(), CHIP_ERROR_NOT_FOUND); + + auto fp = fopen(filePath.Value().c_str(), "rb"); + VerifyOrReturnValue(!(nullptr == fp && errno == ENOENT), CHIP_ERROR_NOT_FOUND); + VerifyOrReturnValue(nullptr != fp, CHIP_ERROR_INTERNAL); + + mLogSessionHandle++; + // If the session handle rolls over to UINT16_MAX which is invalid, reset to 0. + VerifyOrDo(mLogSessionHandle != kInvalidLogSessionHandle, mLogSessionHandle = 0); + + outHandle = mLogSessionHandle; + mFiles[mLogSessionHandle] = fp; + return CHIP_NO_ERROR; +} + +CHIP_ERROR LogProvider::EndLogCollection(LogSessionHandle sessionHandle) +{ + VerifyOrReturnValue(sessionHandle != kInvalidLogSessionHandle, CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnValue(mFiles.count(sessionHandle), CHIP_ERROR_INVALID_ARGUMENT); + + auto fp = mFiles[sessionHandle]; + mFiles.erase(sessionHandle); + + auto rv = fclose(fp); + VerifyOrReturnError(rv == 0, CHIP_ERROR_POSIX(errno)); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR LogProvider::CollectLog(LogSessionHandle sessionHandle, MutableByteSpan & outBuffer, bool & outIsEndOfLog) +{ + VerifyOrReturnValue(sessionHandle != kInvalidLogSessionHandle, CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnValue(mFiles.count(sessionHandle), CHIP_ERROR_INVALID_ARGUMENT); + + auto fp = mFiles[sessionHandle]; + auto fileSize = GetFileSize(fp); + auto count = std::min(fileSize, outBuffer.size()); + + VerifyOrReturnError(CanCastTo(count), CHIP_ERROR_INVALID_ARGUMENT, outBuffer.reduce_size(0)); + + auto bytesRead = fread(outBuffer.data(), 1, count, fp); + VerifyOrReturnError(CanCastTo(bytesRead), CHIP_ERROR_INTERNAL, outBuffer.reduce_size(0)); + + outBuffer.reduce_size(static_cast(bytesRead)); + outIsEndOfLog = fileSize == static_cast(ftell(fp)); + return CHIP_NO_ERROR; +} + +size_t LogProvider::GetSizeForIntent(IntentEnum intent) +{ + VerifyOrReturnValue(IsValidIntent(intent), 0); + + auto filePath = GetFilePathForIntent(intent); + VerifyOrReturnValue(filePath.HasValue(), 0); + + auto fp = fopen(filePath.Value().c_str(), "rb"); + VerifyOrReturnValue(nullptr != fp, 0); + + auto fileSize = GetFileSize(fp); + + auto rv = fclose(fp); + if (rv != 0) + { + ChipLogError(NotSpecified, "Error when closing file pointer (%d)", errno); + } + + return fileSize; +} + +Optional LogProvider::GetFilePathForIntent(IntentEnum intent) const +{ + switch (intent) + { + case IntentEnum::kEndUserSupport: + return mEndUserSupportLogFilePath; + case IntentEnum::kNetworkDiag: + return mNetworkDiagnosticsLogFilePath; + case IntentEnum::kCrashLogs: + return mCrashLogFilePath; + case IntentEnum::kUnknownEnumValue: + // It should never happen. + chipDie(); + } + + return NullOptional; +} diff --git a/examples/all-clusters-app/linux/include/CHIPProjectAppConfig.h b/examples/all-clusters-app/linux/include/CHIPProjectAppConfig.h index 7346ebd2807bfb..588d77da1ce652 100644 --- a/examples/all-clusters-app/linux/include/CHIPProjectAppConfig.h +++ b/examples/all-clusters-app/linux/include/CHIPProjectAppConfig.h @@ -42,3 +42,8 @@ // Marks that a ModeBase Derived cluster is being used. #define EMBER_AF_PLUGIN_MODE_BASE + +// Enable batching of up to 5 commands. +#define CHIP_CONFIG_MAX_PATHS_PER_INVOKE 5 + +#define CHIP_CONFIG_ENABLE_BDX_LOG_TRANSFER 1 diff --git a/examples/all-clusters-app/linux/include/diagnostic-logs-provider-delegate-impl.h b/examples/all-clusters-app/linux/include/diagnostic-logs-provider-delegate-impl.h new file mode 100644 index 00000000000000..c0e69f1c5bde0b --- /dev/null +++ b/examples/all-clusters-app/linux/include/diagnostic-logs-provider-delegate-impl.h @@ -0,0 +1,78 @@ +/* + * + * Copyright (c) 2023 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#include +#include + +namespace chip { +namespace app { +namespace Clusters { +namespace DiagnosticLogs { + +/** + * The LogProvider class serves as the sole instance delegate for handling diagnostic logs. + * + * It implements the DiagnosticLogsProviderDelegate interface and provides mechanisms to set file paths for different types of logs + * (end-user support, network diagnostics, and crash logs). + */ + +class LogProvider : public DiagnosticLogsProviderDelegate +{ +public: + static inline LogProvider & GetInstance() { return sInstance; } + + void SetEndUserSupportLogFilePath(Optional logFilePath) { mEndUserSupportLogFilePath = logFilePath; } + void SetNetworkDiagnosticsLogFilePath(Optional logFilePath) { mNetworkDiagnosticsLogFilePath = logFilePath; } + void SetCrashLogFilePath(Optional logFilePath) { mCrashLogFilePath = logFilePath; } + + /////////// DiagnosticLogsProviderDelegate Interface ///////// + CHIP_ERROR StartLogCollection(IntentEnum intent, LogSessionHandle & outHandle, Optional & outTimeStamp, + Optional & outTimeSinceBoot) override; + CHIP_ERROR EndLogCollection(LogSessionHandle sessionHandle) override; + CHIP_ERROR CollectLog(LogSessionHandle sessionHandle, MutableByteSpan & outBuffer, bool & outIsEndOfLog) override; + size_t GetSizeForIntent(IntentEnum intent) override; + CHIP_ERROR GetLogForIntent(IntentEnum intent, MutableByteSpan & outBuffer, Optional & outTimeStamp, + Optional & outTimeSinceBoot) override; + +private: + static LogProvider sInstance; + LogProvider() = default; + ~LogProvider(); + + LogProvider(const LogProvider &) = delete; + LogProvider & operator=(const LogProvider &) = delete; + + Optional GetFilePathForIntent(IntentEnum intent) const; + + Optional mEndUserSupportLogFilePath; + Optional mNetworkDiagnosticsLogFilePath; + Optional mCrashLogFilePath; + + std::map mFiles; + + LogSessionHandle mLogSessionHandle = kInvalidLogSessionHandle; +}; + +} // namespace DiagnosticLogs +} // namespace Clusters +} // namespace app +} // namespace chip diff --git a/examples/all-clusters-app/linux/main-common.cpp b/examples/all-clusters-app/linux/main-common.cpp index e408c36ff417fa..1d849dc5f2751b 100644 --- a/examples/all-clusters-app/linux/main-common.cpp +++ b/examples/all-clusters-app/linux/main-common.cpp @@ -17,10 +17,14 @@ */ #include "AllClustersCommandDelegate.h" +#include "AppOptions.h" #include "ValveControlDelegate.h" #include "WindowCoveringManager.h" #include "air-quality-instance.h" +#include "device-energy-management-modes.h" #include "dishwasher-mode.h" +#include "energy-evse-modes.h" +#include "include/diagnostic-logs-provider-delegate-impl.h" #include "include/tv-callbacks.h" #include "laundry-dryer-controls-delegate-impl.h" #include "laundry-washer-controls-delegate-impl.h" @@ -37,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -251,6 +256,9 @@ void ApplicationShutdown() Clusters::OvenMode::Shutdown(); Clusters::OvenCavityOperationalState::Shutdown(); + Clusters::DeviceEnergyManagementMode::Shutdown(); + Clusters::EnergyEvseMode::Shutdown(); + if (sChipNamedPipeCommands.Stop() != CHIP_NO_ERROR) { ChipLogError(NotSpecified, "Failed to stop CHIP NamedPipeCommands"); @@ -281,3 +289,14 @@ void emberAfWindowCoveringClusterInitCallback(chip::EndpointId endpoint) Clusters::WindowCovering::SetDefaultDelegate(endpoint, &sWindowCoveringManager); Clusters::WindowCovering::ConfigStatusUpdateFeatures(endpoint); } + +using namespace chip::app::Clusters::DiagnosticLogs; +void emberAfDiagnosticLogsClusterInitCallback(chip::EndpointId endpoint) +{ + auto & logProvider = LogProvider::GetInstance(); + logProvider.SetEndUserSupportLogFilePath(AppOptions::GetEndUserSupportLogFilePath()); + logProvider.SetNetworkDiagnosticsLogFilePath(AppOptions::GetNetworkDiagnosticsLogFilePath()); + logProvider.SetCrashLogFilePath(AppOptions::GetCrashLogFilePath()); + + DiagnosticLogsServer::Instance().SetDiagnosticLogsProviderDelegate(endpoint, &logProvider); +} diff --git a/examples/all-clusters-app/nrfconnect/main/AppTask.cpp b/examples/all-clusters-app/nrfconnect/main/AppTask.cpp index 9f471943406c80..f8d117790fac3d 100644 --- a/examples/all-clusters-app/nrfconnect/main/AppTask.cpp +++ b/examples/all-clusters-app/nrfconnect/main/AppTask.cpp @@ -27,8 +27,9 @@ #include #include +#include #include -#include +#include #include #include @@ -204,9 +205,12 @@ CHIP_ERROR AppTask::Init() #endif static CommonCaseDeviceServerInitParams initParams; - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams)); AppFabricTableDelegate::Init(); diff --git a/examples/all-clusters-app/nxp/mw320/main.cpp b/examples/all-clusters-app/nxp/mw320/main.cpp index e103359f593400..b778d95fc4430b 100644 --- a/examples/all-clusters-app/nxp/mw320/main.cpp +++ b/examples/all-clusters-app/nxp/mw320/main.cpp @@ -1152,12 +1152,10 @@ void task_test_main(void * param) PRINTF("--> update CurrentPosition [%d] \r\n", value); Clusters::Switch::Attributes::CurrentPosition::Set(1, value); #ifdef SUPPORT_MANUAL_CTRL -#error \ - "This code thinks it's setting the OnOff attribute, but it's actually setting the NumberOfPositions attribute! And passing the wrong size for either case. Figure out what it's trying to do." - // sync-up the Light attribute (for test event, OO.M.ManuallyControlled) - PRINTF("--> update [Clusters::Switch::Id]: OnOff::Id [%d] \r\n", value); - emAfWriteAttribute(1, Clusters::Switch::Id, Clusters::OnOff::Attributes::OnOff::Id, (uint8_t *) &value, sizeof(value), - true, false); +#error "Not implemented" + // TODO: previous code was trying to write a OnOff cluster attribute id to a switch attribute, generally + // not working. Determine if this should maybe be + // OnOff::Attributes::OnOff::Set(1, is_on) or similar #endif // SUPPORT_MANUAL_CTRL need2sync_sw_attr = false; diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter index ee5f558431657e..7794726e68dcd7 100644 --- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter +++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter @@ -2398,7 +2398,7 @@ cluster TemperatureControl = 86 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -2406,13 +2406,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -2434,14 +2427,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -2452,7 +2440,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -2472,7 +2460,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -2511,7 +2499,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -2525,34 +2513,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -2561,7 +2521,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -2581,12 +2541,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** An interface to a generic way to secure a door */ @@ -4497,7 +4453,7 @@ cluster OccupancySensing = 1030 { /** This cluster provides an interface for managing low power mode on a device that supports the Wake On LAN protocol. */ cluster WakeOnLan = 1283 { - revision 1; // NOTE: Default/not specifically set + revision 1; readonly attribute optional char_string<12> MACAddress = 0; readonly attribute optional octet_string<16> linkLocalAddress = 1; @@ -4511,12 +4467,13 @@ cluster WakeOnLan = 1283 { /** This cluster provides an interface for controlling the current Channel on a device. */ cluster Channel = 1284 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum ChannelTypeEnum : enum8 { kSatellite = 0; kCable = 1; kTerrestrial = 2; + kOTT = 3; } enum LineupInfoTypeEnum : enum8 { @@ -4532,14 +4489,14 @@ cluster Channel = 1284 { bitmap Feature : bitmap32 { kChannelList = 0x1; kLineupInfo = 0x2; - kElectronicGuide = 0x3; - kRecordProgram = 0x4; + kElectronicGuide = 0x4; + kRecordProgram = 0x8; } bitmap RecordingFlagBitmap : bitmap32 { kScheduled = 0x1; kRecordSeries = 0x2; - kRecorded = 0x3; + kRecorded = 0x4; } struct ProgramCastStruct { @@ -4685,7 +4642,7 @@ cluster Channel = 1284 { /** This cluster provides an interface for UX navigation within a set of targets on a device or endpoint. */ cluster TargetNavigator = 1285 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum StatusEnum : enum8 { kSuccess = 0; @@ -4729,7 +4686,7 @@ cluster TargetNavigator = 1285 { /** This cluster provides an interface for controlling Media Playback (PLAY, PAUSE, etc) on a media device such as a TV or Speaker. */ cluster MediaPlayback = 1286 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum CharacteristicEnum : enum8 { kForcedSubtitles = 0; @@ -4771,9 +4728,9 @@ cluster MediaPlayback = 1286 { bitmap Feature : bitmap32 { kAdvancedSeek = 0x1; kVariableSpeed = 0x2; - kTextTracks = 0x3; - kAudioTracks = 0x4; - kAudioAdvance = 0x5; + kTextTracks = 0x4; + kAudioTracks = 0x8; + kAudioAdvance = 0x10; } struct TrackAttributesStruct { @@ -5376,7 +5333,7 @@ cluster ApplicationBasic = 1293 { /** This cluster provides commands that facilitate user account login on a Content App or a node. For example, a Content App running on a Video Player device, which is represented as an endpoint (see [TV Architecture]), can use this cluster to help make the user account on the Content App match the user account on the Client. */ cluster AccountLogin = 1294 { - revision 1; // NOTE: Default/not specifically set + revision 2; critical event LoggedOut = 0 { optional node_id node = 0; @@ -5535,6 +5492,10 @@ internal cluster UnitTesting = 4294048773 { fabric_idx fabricIndex = 254; } + info event TestDifferentVendorMeiEvent = 4294050030 { + int8u arg1 = 1; + } + attribute boolean boolean = 0; attribute Bitmap8MaskMap bitmap8 = 1; attribute Bitmap16MaskMap bitmap16 = 2; @@ -5617,6 +5578,7 @@ internal cluster UnitTesting = 4294048773 { attribute nullable int16u nullableRangeRestrictedInt16u = 16424; attribute nullable int16s nullableRangeRestrictedInt16s = 16425; attribute optional int8u writeOnlyInt8u = 16426; + attribute int8u meiInt8u = 4294070017; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -5812,6 +5774,15 @@ internal cluster UnitTesting = 4294048773 { int8u fillCharacter = 2; } + request struct TestDifferentVendorMeiRequestRequest { + int8u arg1 = 0; + } + + response struct TestDifferentVendorMeiResponse = 4294049979 { + int8u arg1 = 0; + int64u eventNumber = 1; + } + /** Simple command without any parameters and without a specific response. To aid in unit testing, this command will re-initialize attribute storage to defaults. */ command Test(): DefaultSuccess = 0; @@ -5882,6 +5853,8 @@ internal cluster UnitTesting = 4294048773 { command TestBatchHelperRequest(TestBatchHelperRequestRequest): TestBatchHelperResponse = 22; /** Second command that responds after sleepBeforeResponseTimeMs with an octet_string the size requested with fillCharacter. */ command TestSecondBatchHelperRequest(TestSecondBatchHelperRequestRequest): TestBatchHelperResponse = 23; + /** Command having a different MEI vendor ID than the cluster. Also emits TestDifferentVendorMeiEvent. */ + command TestDifferentVendorMeiRequest(TestDifferentVendorMeiRequestRequest): TestDifferentVendorMeiResponse = 4294049962; } endpoint 0 { @@ -5925,7 +5898,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -6331,7 +6304,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -6413,7 +6386,6 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport default = 0x80; ram attribute lastConfiguredBy; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; @@ -6421,8 +6393,8 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; @@ -6691,6 +6663,7 @@ endpoint 1 { server cluster UnitTesting { emits event TestEvent; emits event TestFabricScopedEvent; + emits event TestDifferentVendorMeiEvent; ram attribute boolean default = false; ram attribute bitmap8 default = 0; ram attribute bitmap16 default = 0; @@ -6771,8 +6744,10 @@ endpoint 1 { ram attribute nullableRangeRestrictedInt8s default = -20; ram attribute nullableRangeRestrictedInt16u default = 200; ram attribute nullableRangeRestrictedInt16s default = -100; + callback attribute writeOnlyInt8u default = 0; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; + ram attribute meiInt8u default = 0; handle command Test; handle command TestSpecificResponse; @@ -6800,6 +6775,10 @@ endpoint 1 { handle command TestSimpleOptionalArgumentRequest; handle command TestEmitTestEventRequest; handle command TestEmitTestFabricScopedEventRequest; + handle command TestBatchHelperRequest; + handle command TestSecondBatchHelperRequest; + handle command TestDifferentVendorMeiRequest; + handle command TestDifferentVendorMeiResponse; } } endpoint 2 { @@ -6872,7 +6851,7 @@ endpoint 2 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -6890,15 +6869,15 @@ endpoint 2 { } server cluster ScenesManagement { - ram attribute nameSupport default = 0x80; + ram attribute lastConfiguredBy; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; @@ -6936,7 +6915,7 @@ endpoint 65534 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 50d9d7c8d9d996..2f7a83ee7362de 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 @@ -435,10 +435,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5165,10 +5165,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -6153,25 +6153,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x80", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "LastConfiguredBy", - "code": 5, + "code": 0, "mfgCode": null, "side": "server", "type": "node_id", @@ -6187,7 +6171,7 @@ }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -6203,7 +6187,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -6291,7 +6275,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -6307,7 +6291,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -9104,6 +9088,38 @@ "source": "client", "isIncoming": 1, "isEnabled": 1 + }, + { + "name": "TestBatchHelperRequest", + "code": 22, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "TestSecondBatchHelperRequest", + "code": 23, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "TestDifferentVendorMeiRequest", + "code": 4294049962, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "TestDifferentVendorMeiResponse", + "code": 4294049979, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 } ], "attributes": [ @@ -10387,6 +10403,22 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "write_only_int8u", + "code": 16426, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, @@ -10418,6 +10450,22 @@ "minInterval": 0, "maxInterval": 65344, "reportableChange": 0 + }, + { + "name": "mei_int8u", + "code": 4294070017, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 0, + "maxInterval": 65344, + "reportableChange": 0 } ], "events": [ @@ -10434,6 +10482,13 @@ "mfgCode": null, "side": "server", "included": 1 + }, + { + "name": "TestDifferentVendorMeiEvent", + "code": 4294050030, + "mfgCode": null, + "side": "server", + "included": 1 } ] } @@ -11213,10 +11268,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -11526,24 +11581,24 @@ ], "attributes": [ { - "name": "NameSupport", - "code": 4, + "name": "LastConfiguredBy", + "code": 0, "mfgCode": null, "side": "server", - "type": "NameSupportBitmap", + "type": "node_id", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0x80", + "defaultValue": "", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -11559,7 +11614,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -11647,7 +11702,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -11663,7 +11718,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -11933,10 +11988,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/bridge-app/bridge-common/bridge-app.matter b/examples/bridge-app/bridge-common/bridge-app.matter index aef4649df2ce39..55712fe444589c 100644 --- a/examples/bridge-app/bridge-common/bridge-app.matter +++ b/examples/bridge-app/bridge-common/bridge-app.matter @@ -1902,7 +1902,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2265,7 +2265,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2330,7 +2330,7 @@ endpoint 2 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/bridge-app/bridge-common/bridge-app.zap b/examples/bridge-app/bridge-common/bridge-app.zap index 0412a216ba7872..78c1e1b8d6fdaf 100644 --- a/examples/bridge-app/bridge-common/bridge-app.zap +++ b/examples/bridge-app/bridge-common/bridge-app.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4723,10 +4723,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5473,10 +5473,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/NEW_CHEF_DEVICES.md b/examples/chef/NEW_CHEF_DEVICES.md index 4f52b29966f415..c2e8538e7b8e5a 100644 --- a/examples/chef/NEW_CHEF_DEVICES.md +++ b/examples/chef/NEW_CHEF_DEVICES.md @@ -94,13 +94,13 @@ Basic device availability should show when running: ### Compilation -This example uses `rootnode_contactsensor_lFAGG1bfRO` for commands. Substitute +This example uses `rootnode_contactsensor_27f76aeaf5` for commands. Substitute your own device for testing newly created devices. ``` ./examples/chef/chef.py \ -t linux \ - -d rootnode_contactsensor_lFAGG1bfRO \ + -d rootnode_contactsensor_27f76aeaf5 \ -b ``` @@ -113,5 +113,5 @@ Where options used are: ### Execution Build will be available in -`examples/chef/linux/out/rootnode_contactsensor_lFAGG1bfRO` (path will vary +`examples/chef/linux/out/rootnode_contactsensor_27f76aeaf5` (path will vary based on platform and device being built) diff --git a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter index 63ead45d7bb823..bb412cca740ea1 100644 --- a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter +++ b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter @@ -1643,7 +1643,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2026,7 +2026,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } diff --git a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap index 44e06c856968f8..9c33313413f340 100644 --- a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap +++ b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4698,10 +4698,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter index 3c5269f5edf490..d26348310ca696 100644 --- a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter +++ b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter @@ -1325,7 +1325,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1545,7 +1545,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap index 5ca6fd92d71bd1..d207dd10082700 100644 --- a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap +++ b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2611,10 +2611,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter index df276f6ab3fce3..a06d523bd40cf3 100644 --- a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter +++ b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter @@ -2194,7 +2194,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2406,7 +2406,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2483,7 +2483,7 @@ endpoint 2 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2714,7 +2714,7 @@ endpoint 3 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2757,7 +2757,7 @@ endpoint 4 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2800,7 +2800,7 @@ endpoint 5 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 0d630cb43d894e..fbfaa57a7df141 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 @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2450,10 +2450,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3436,10 +3436,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -6573,10 +6573,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -7082,10 +7082,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -7591,10 +7591,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter index 90005fa99cd6f0..ebfb6e54b28213 100644 --- a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter +++ b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter @@ -1834,7 +1834,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2067,7 +2067,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap index ce907b4d22843f..11e9fc1295ecdc 100644 --- a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap +++ b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2743,10 +2743,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter index 9157827f8f1311..c2c74d4a969059 100644 --- a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter +++ b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter @@ -1216,7 +1216,7 @@ cluster FixedLabel = 64 { /** This cluster provides an interface for managing low power mode on a device that supports the Wake On LAN protocol. */ cluster WakeOnLan = 1283 { - revision 1; // NOTE: Default/not specifically set + revision 1; readonly attribute optional char_string<12> MACAddress = 0; readonly attribute optional octet_string<16> linkLocalAddress = 1; @@ -1230,12 +1230,13 @@ cluster WakeOnLan = 1283 { /** This cluster provides an interface for controlling the current Channel on a device. */ cluster Channel = 1284 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum ChannelTypeEnum : enum8 { kSatellite = 0; kCable = 1; kTerrestrial = 2; + kOTT = 3; } enum LineupInfoTypeEnum : enum8 { @@ -1251,14 +1252,14 @@ cluster Channel = 1284 { bitmap Feature : bitmap32 { kChannelList = 0x1; kLineupInfo = 0x2; - kElectronicGuide = 0x3; - kRecordProgram = 0x4; + kElectronicGuide = 0x4; + kRecordProgram = 0x8; } bitmap RecordingFlagBitmap : bitmap32 { kScheduled = 0x1; kRecordSeries = 0x2; - kRecorded = 0x3; + kRecorded = 0x4; } struct ProgramCastStruct { @@ -1404,7 +1405,7 @@ cluster Channel = 1284 { /** This cluster provides an interface for UX navigation within a set of targets on a device or endpoint. */ cluster TargetNavigator = 1285 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum StatusEnum : enum8 { kSuccess = 0; @@ -1448,7 +1449,7 @@ cluster TargetNavigator = 1285 { /** This cluster provides an interface for controlling Media Playback (PLAY, PAUSE, etc) on a media device such as a TV or Speaker. */ cluster MediaPlayback = 1286 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum CharacteristicEnum : enum8 { kForcedSubtitles = 0; @@ -1490,9 +1491,9 @@ cluster MediaPlayback = 1286 { bitmap Feature : bitmap32 { kAdvancedSeek = 0x1; kVariableSpeed = 0x2; - kTextTracks = 0x3; - kAudioTracks = 0x4; - kAudioAdvance = 0x5; + kTextTracks = 0x4; + kAudioTracks = 0x8; + kAudioAdvance = 0x10; } struct TrackAttributesStruct { @@ -1858,7 +1859,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2095,7 +2096,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap index 272db06ab28ad4..245f7ee38016e5 100644 --- a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap +++ b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2783,10 +2783,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter index af5819a6623250..dfb0d2c30da30f 100644 --- a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter +++ b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter @@ -1716,7 +1716,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1992,7 +1992,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap index 709b2d3d338aba..780705f02b4bb0 100644 --- a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap +++ b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3181,10 +3181,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter index a1b2409676b40f..2fe383530fea5c 100644 --- a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter +++ b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter @@ -1417,7 +1417,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1636,7 +1636,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap index c81df7d7482f9e..cbbcbea13c6d81 100644 --- a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap +++ b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2587,10 +2587,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter index cfb648787c6b84..65e16fc68d08b4 100644 --- a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter +++ b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter @@ -1317,7 +1317,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1572,7 +1572,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap index 7b5a4b49f9810a..f92b4a2b8807aa 100644 --- a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap +++ b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2939,10 +2939,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter index 541f0e2afafd61..76e54a5ccdc84a 100644 --- a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter +++ b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter @@ -1538,7 +1538,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1837,7 +1837,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } diff --git a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap index 6ccf72e82c653b..aa943a62f9afcd 100644 --- a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap +++ b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3435,10 +3435,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter b/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter index 75fc5f1af0cb09..2803433e108d20 100644 --- a/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter +++ b/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter @@ -1126,7 +1126,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1383,7 +1383,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap b/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap index 5bc8fb68715b8c..112a3c7b048ec9 100644 --- a/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap +++ b/examples/chef/devices/rootnode_dishwasher_cc105034fe.zap @@ -279,10 +279,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3276,10 +3276,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter index 646f2cc00279fa..99b8356ecdf6aa 100644 --- a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter +++ b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter @@ -1951,7 +1951,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2206,7 +2206,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap index 96c60ff5453cd3..8980e074c1ef44 100644 --- a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap +++ b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2939,10 +2939,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter index 906cd474afa5d2..062f3d8421a83c 100644 --- a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter +++ b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter @@ -1817,7 +1817,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2113,7 +2113,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap index edd39619401e94..fb126a3c790f37 100644 --- a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap +++ b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3403,10 +3403,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter b/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter index fc2c4c62b0d179..af697266d1b2f6 100644 --- a/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter +++ b/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter @@ -1361,7 +1361,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1617,7 +1617,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap b/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap index f3b01c60689739..b1651dcca50bb8 100644 --- a/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap +++ b/examples/chef/devices/rootnode_fan_7N2TobIlOX.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2963,10 +2963,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter index 1a35e053e79660..798bbaf3c50af3 100644 --- a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter +++ b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter @@ -1316,7 +1316,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1552,7 +1552,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap index 5fe9927c1a14ea..10e66cda8d94e5 100644 --- a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap +++ b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2793,10 +2793,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter index 9a519df48b380f..d343385b18d5da 100644 --- a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter +++ b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter @@ -985,7 +985,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1176,7 +1176,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap index d4f54512a7f13e..a9eded89acddec 100644 --- a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap +++ b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2246,10 +2246,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter index ed16842ca4a281..bf73232fd78f06 100644 --- a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter +++ b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter @@ -1950,7 +1950,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2241,7 +2241,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap index 139e739d9f8411..64d8592a83382c 100644 --- a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap +++ b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3307,10 +3307,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter index 13d17eb37417ea..6453623a943ebe 100644 --- a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter +++ b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter @@ -1316,7 +1316,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1552,7 +1552,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap index d93a61ea027e91..e9e134d3f90508 100644 --- a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap +++ b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2793,10 +2793,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter index 51af151b59bbcf..372b79a19f8c6a 100644 --- a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter +++ b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter @@ -1126,7 +1126,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1370,7 +1370,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap index 6b3b2859bc5f03..f1e98479de205e 100644 --- a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap +++ b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.zap @@ -279,10 +279,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3136,10 +3136,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter index e02f49d22e9596..71923d22279635 100644 --- a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter +++ b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter @@ -1322,7 +1322,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1558,7 +1558,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap index c01e3ca021db05..dd2cd67a75b559 100644 --- a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap +++ b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2777,10 +2777,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter index e0c1190683fd55..73e4c3ce1d1bee 100644 --- a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter +++ b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter @@ -1341,7 +1341,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1577,7 +1577,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap index 550bd5b467de59..e9281aa459e8fb 100644 --- a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap +++ b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2793,10 +2793,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter index 3e0677c042fcba..098de3b8bc0c04 100644 --- a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter +++ b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter @@ -1497,7 +1497,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1793,7 +1793,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } diff --git a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap index e39bd754aadf0c..c7a98b1ec03e3a 100644 --- a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap +++ b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3403,10 +3403,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_onofflight_samplemei.matter b/examples/chef/devices/rootnode_onofflight_samplemei.matter index a5ab25e98ee287..792908dc70e8a1 100644 --- a/examples/chef/devices/rootnode_onofflight_samplemei.matter +++ b/examples/chef/devices/rootnode_onofflight_samplemei.matter @@ -1529,7 +1529,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1825,7 +1825,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_onofflight_samplemei.zap b/examples/chef/devices/rootnode_onofflight_samplemei.zap index 5ebbfde48fba36..d1b34e47130692 100644 --- a/examples/chef/devices/rootnode_onofflight_samplemei.zap +++ b/examples/chef/devices/rootnode_onofflight_samplemei.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3403,10 +3403,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter index fbcda1f0781584..aa6867dc6dd7b5 100644 --- a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter +++ b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter @@ -1444,7 +1444,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1713,7 +1713,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } diff --git a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap index 4172207e164fe8..fa6cd7601142ad 100644 --- a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap +++ b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3123,10 +3123,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter index 11e2818981123a..a1ef7be5a8875b 100644 --- a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter +++ b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter @@ -1372,7 +1372,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1644,7 +1644,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } diff --git a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap index 7dcde4698b9da4..a272c5251974ad 100644 --- a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap +++ b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3135,10 +3135,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter index 29ecb770963c79..6a64f874178e92 100644 --- a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter +++ b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter @@ -1343,7 +1343,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1585,7 +1585,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap index d8a968333633c6..22e60458826a92 100644 --- a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap +++ b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2835,10 +2835,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_pump_5f904818cc.matter b/examples/chef/devices/rootnode_pump_5f904818cc.matter index eff24b568e8e1f..2d0689d5f25371 100644 --- a/examples/chef/devices/rootnode_pump_5f904818cc.matter +++ b/examples/chef/devices/rootnode_pump_5f904818cc.matter @@ -1226,7 +1226,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1453,7 +1453,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_pump_5f904818cc.zap b/examples/chef/devices/rootnode_pump_5f904818cc.zap index b8909b097aaaa0..bf3d6a21b1ab87 100644 --- a/examples/chef/devices/rootnode_pump_5f904818cc.zap +++ b/examples/chef/devices/rootnode_pump_5f904818cc.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2788,10 +2788,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_pump_a811bb33a0.matter b/examples/chef/devices/rootnode_pump_a811bb33a0.matter index 3cb93176336f27..4c2184dff0c73e 100644 --- a/examples/chef/devices/rootnode_pump_a811bb33a0.matter +++ b/examples/chef/devices/rootnode_pump_a811bb33a0.matter @@ -1169,7 +1169,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1396,7 +1396,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_pump_a811bb33a0.zap b/examples/chef/devices/rootnode_pump_a811bb33a0.zap index e41fb9daa1c1aa..8b6e21c9b5b383 100644 --- a/examples/chef/devices/rootnode_pump_a811bb33a0.zap +++ b/examples/chef/devices/rootnode_pump_a811bb33a0.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2788,10 +2788,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter index 4ed7903266400a..aa021d9050990d 100644 --- a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter +++ b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter @@ -1092,7 +1092,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1336,7 +1336,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } @@ -1352,7 +1352,7 @@ endpoint 2 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1380,7 +1380,7 @@ endpoint 3 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap index 7aa39d37307947..56bc27665c5951 100644 --- a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap +++ b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.zap @@ -279,10 +279,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3136,10 +3136,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3319,10 +3319,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3634,10 +3634,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter index fa836fe8b0c5e2..dc190ad05ecd31 100644 --- a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter +++ b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter @@ -1020,7 +1020,7 @@ cluster RvcRunMode = 84 { } bitmap Feature : bitmap32 { - kOnOff = 0x1; + kNoFeatures = 0x0; } struct ModeTagStruct { @@ -1036,7 +1036,6 @@ cluster RvcRunMode = 84 { readonly attribute ModeOptionStruct supportedModes[] = 0; readonly attribute int8u currentMode = 1; - attribute optional nullable int8u onMode = 3; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1073,7 +1072,7 @@ cluster RvcCleanMode = 85 { } bitmap Feature : bitmap32 { - kOnOff = 0x1; + kNoFeatures = 0x0; } struct ModeTagStruct { @@ -1089,7 +1088,6 @@ cluster RvcCleanMode = 85 { readonly attribute ModeOptionStruct supportedModes[] = 0; readonly attribute int8u currentMode = 1; - attribute optional nullable int8u onMode = 3; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1172,10 +1170,6 @@ cluster RvcOperationalState = 97 { /** Upon receipt, the device SHALL pause its operation if it is possible based on the current function of the server. */ command Pause(): OperationalCommandResponse = 0; - /** Upon receipt, the device SHALL stop its operation if it is at a position where it is safe to do so and/or permitted. */ - command Stop(): OperationalCommandResponse = 1; - /** Upon receipt, the device SHALL start its operation if it is safe to do so and the device is in an operational state from which it can be started. */ - command Start(): OperationalCommandResponse = 2; /** Upon receipt, the device SHALL resume its operation from the point it was at when it received the Pause command, or from the point when it was paused by means outside of this cluster (for example by manual button press). */ command Resume(): OperationalCommandResponse = 3; /** On receipt of this command, the device SHALL start seeking the charging dock, if possible in the current state of the device. */ @@ -1191,7 +1185,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1403,14 +1397,13 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } server cluster RvcRunMode { callback attribute supportedModes; callback attribute currentMode; - callback attribute onMode; callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute eventList; @@ -1425,7 +1418,6 @@ endpoint 1 { server cluster RvcCleanMode { callback attribute supportedModes; callback attribute currentMode; - callback attribute onMode; callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute eventList; @@ -1454,8 +1446,6 @@ endpoint 1 { ram attribute clusterRevision default = 1; handle command Pause; - handle command Stop; - handle command Start; handle command Resume; handle command OperationalCommandResponse; } diff --git a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap index 126e811df06356..28300ead917487 100644 --- a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap +++ b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2450,10 +2450,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter index 6797456a6b6091..c41e4fcc03b29b 100644 --- a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter +++ b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter @@ -1566,7 +1566,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1791,7 +1791,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap index 3c1f4e2a352817..d2b7880a6f3246 100644 --- a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap +++ b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2582,10 +2582,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter index 6328708dc1f816..af7c3a340cf24d 100644 --- a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter +++ b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter @@ -1378,7 +1378,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1590,7 +1590,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap index 5659783ce4ece8..02a1ca850eafb1 100644 --- a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap +++ b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2442,10 +2442,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter index d5e42a22c43f66..2862703d045d1d 100644 --- a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter +++ b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter @@ -1420,7 +1420,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1690,7 +1690,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } diff --git a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap index b6cd32c5f5895d..3601b64d819002 100644 --- a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap +++ b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3119,10 +3119,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter index c45114f20de705..6993a6fa5e9a6f 100644 --- a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter +++ b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter @@ -1316,7 +1316,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1552,7 +1552,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap index b35d366285e564..9213df7635a717 100644 --- a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap +++ b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2793,10 +2793,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter index 30163a05f14a9a..4ab01b329d34aa 100644 --- a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter +++ b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter @@ -1860,7 +1860,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2119,7 +2119,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap index 1fc6cb94ba9606..3d25fcb70f94f3 100644 --- a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap +++ b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2939,10 +2939,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter index 3cb70eea484491..20fa873418127e 100644 --- a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter +++ b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter @@ -1453,7 +1453,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1708,7 +1708,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap index b91dfc2b141d36..caf75a60da9de9 100644 --- a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap +++ b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2939,10 +2939,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/devices/template.zap b/examples/chef/devices/template.zap index 54e1c65b73ce67..7a486e09066efc 100644 --- a/examples/chef/devices/template.zap +++ b/examples/chef/devices/template.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2418,10 +2418,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2561,16 +2561,16 @@ ], "attributes": [ { - "name": "NameSupport", - "code": 4, + "name": "LastConfiguredBy", + "code": 0, "mfgCode": null, "side": "server", - "type": "NameSupportBitmap", + "type": "node_id", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0x00", + "defaultValue": "", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2578,7 +2578,7 @@ }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -2594,7 +2594,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -2682,7 +2682,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2698,7 +2698,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "6", "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/chef/esp32/main/CMakeLists.txt b/examples/chef/esp32/main/CMakeLists.txt index 6c342d07b4fa15..e6ab518f3494a9 100644 --- a/examples/chef/esp32/main/CMakeLists.txt +++ b/examples/chef/esp32/main/CMakeLists.txt @@ -141,6 +141,17 @@ pw_proto_library(attributes_service pw_protobuf.common_proto ) +pw_proto_library(boolean_state_service + SOURCES + ${CHIP_ROOT}/examples/common/pigweed/protos/boolean_state_service.proto + PREFIX + boolean_state_service + STRIP_PREFIX + ${CHIP_ROOT}/examples/common/pigweed/protos + DEPS + pw_protobuf.common_proto +) + pw_proto_library(button_service SOURCES ${CHIP_ROOT}/examples/common/pigweed/protos/button_service.proto @@ -191,6 +202,7 @@ pw_proto_library(wifi_service target_link_libraries(${COMPONENT_LIB} PUBLIC attributes_service.nanopb_rpc + boolean_state_service.nanopb_rpc button_service.nanopb_rpc descriptor_service.nanopb_rpc device_service.nanopb_rpc @@ -215,6 +227,7 @@ target_link_options(${COMPONENT_LIB} target_compile_options(${COMPONENT_LIB} PRIVATE "-DPW_RPC_ATTRIBUTE_SERVICE=1" + "-DPW_RPC_BOOLEAN_STATE_SERVICE=1" "-DPW_RPC_BUTTON_SERVICE=1" "-DPW_RPC_DEVICE_SERVICE=1" "-DPW_RPC_DESCRIPTOR_SERVICE=1" diff --git a/examples/chef/linux/BUILD.gn b/examples/chef/linux/BUILD.gn index d3cf534a01ba75..a25c1f5ffa11ce 100644 --- a/examples/chef/linux/BUILD.gn +++ b/examples/chef/linux/BUILD.gn @@ -69,6 +69,7 @@ executable("${sample_name}") { defines = [ "PW_RPC_ENABLED", "PW_RPC_ATTRIBUTE_SERVICE=1", + "PW_RPC_BOOLEAN_STATE_SERVICE=1", "PW_RPC_BUTTON_SERVICE=1", "PW_RPC_DESCRIPTOR_SERVICE=1", "PW_RPC_DEVICE_SERVICE=1", @@ -82,7 +83,7 @@ executable("${sample_name}") { ] deps += [ - "$dir_pw_hdlc:pw_rpc", + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_log", "$dir_pw_rpc:server", @@ -95,6 +96,7 @@ executable("${sample_name}") { "$dir_pw_trace_tokenized:trace_rpc_service", "${chip_root}/config/linux/lib/pw_rpc:pw_rpc", "${chip_root}/examples/common/pigweed:attributes_service.nanopb_rpc", + "${chip_root}/examples/common/pigweed:boolean_state_service.nanopb_rpc", "${chip_root}/examples/common/pigweed:button_service.nanopb_rpc", "${chip_root}/examples/common/pigweed:descriptor_service.nanopb_rpc", "${chip_root}/examples/common/pigweed:device_service.nanopb_rpc", diff --git a/examples/chef/nrfconnect/CMakeLists.txt b/examples/chef/nrfconnect/CMakeLists.txt index b0b69815246c10..17556ef398b27a 100644 --- a/examples/chef/nrfconnect/CMakeLists.txt +++ b/examples/chef/nrfconnect/CMakeLists.txt @@ -133,6 +133,17 @@ pw_proto_library(attributes_service pw_protobuf.common_proto ) +pw_proto_library(boolean_state_service + SOURCES + ${CHIP_ROOT}/examples/common/pigweed/protos/boolean_state_service.proto + PREFIX + boolean_state_service + STRIP_PREFIX + ${CHIP_ROOT}/examples/common/pigweed/protos + DEPS + pw_protobuf.common_proto +) + pw_proto_library(descriptor_service SOURCES ${CHIP_ROOT}/examples/common/pigweed/protos/descriptor_service.proto @@ -202,6 +213,7 @@ target_include_directories(app PRIVATE target_compile_options(app PRIVATE "-DPW_RPC_ATTRIBUTE_SERVICE=1" + "-DPW_RPC_BOOLEAN_STATE_SERVICE=1" "-DPW_RPC_DESCRIPTOR_SERVICE=1" "-DPW_RPC_DEVICE_SERVICE=1" "-DPW_RPC_THREAD_SERVICE=1" @@ -209,12 +221,12 @@ target_compile_options(app PRIVATE target_link_libraries(app PRIVATE attributes_service.nanopb_rpc + boolean_state_service.nanopb_rpc descriptor_service.nanopb_rpc device_service.nanopb_rpc thread_service.nanopb_rpc pw_checksum pw_hdlc - pw_hdlc.pw_rpc pw_log pw_rpc.server pw_sys_io diff --git a/examples/chef/silabs/BUILD.gn b/examples/chef/silabs/BUILD.gn index cecef1c71bc050..3f74106f9f54c2 100644 --- a/examples/chef/silabs/BUILD.gn +++ b/examples/chef/silabs/BUILD.gn @@ -120,6 +120,7 @@ silabs_executable("chef_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "$dir_pw_trace", diff --git a/examples/chef/telink/CMakeLists.txt b/examples/chef/telink/CMakeLists.txt index 5d30d424ea3dfd..71f0c549e6ed79 100755 --- a/examples/chef/telink/CMakeLists.txt +++ b/examples/chef/telink/CMakeLists.txt @@ -231,7 +231,6 @@ target_link_libraries(app PRIVATE thread_service.nanopb_rpc pw_checksum pw_hdlc - pw_hdlc.pw_rpc pw_log pw_rpc.server pw_sys_io diff --git a/examples/chip-tool/BUILD.gn b/examples/chip-tool/BUILD.gn index 53568316114c9a..c6f5edc819ba95 100644 --- a/examples/chip-tool/BUILD.gn +++ b/examples/chip-tool/BUILD.gn @@ -55,6 +55,7 @@ static_library("chip-tool-utils") { "${chip_root}/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp", "commands/clusters/ModelCommand.cpp", "commands/clusters/ModelCommand.h", + "commands/common/BDXDiagnosticLogsServerDelegate.cpp", "commands/common/CHIPCommand.cpp", "commands/common/CHIPCommand.h", "commands/common/Command.cpp", diff --git a/examples/chip-tool/commands/clusters/ClusterCommand.h b/examples/chip-tool/commands/clusters/ClusterCommand.h index 6b68e1b04bfea0..792588a886dffb 100644 --- a/examples/chip-tool/commands/clusters/ClusterCommand.h +++ b/examples/chip-tool/commands/clusters/ClusterCommand.h @@ -55,6 +55,22 @@ class ClusterCommand : public InteractionModelCommands, public ModelCommand, pub return InteractionModelCommands::SendCommand(device, endpointId, clusterId, commandId, value); } + CHIP_ERROR SendCommand(chip::DeviceProxy * device, chip::EndpointId endpointId, chip::ClusterId clusterId, + chip::CommandId commandId, + const chip::app::Clusters::DiagnosticLogs::Commands::RetrieveLogsRequest::Type & value) + { + ReturnErrorOnFailure(InteractionModelCommands::SendCommand(device, endpointId, clusterId, commandId, value)); + + if (value.transferFileDesignator.HasValue() && + value.requestedProtocol == chip::app::Clusters::DiagnosticLogs::TransferProtocolEnum::kBdx) + { + auto sender = mCommandSender.back().get(); + auto fileDesignator = value.transferFileDesignator.Value(); + BDXDiagnosticLogsServerDelegate::GetInstance().AddFileDesignator(sender, fileDesignator); + } + return CHIP_NO_ERROR; + } + CHIP_ERROR SendGroupCommand(chip::GroupId groupId, chip::FabricIndex fabricIndex) override { return InteractionModelCommands::SendGroupCommand(groupId, fabricIndex, mClusterId, mCommandId, mPayload); @@ -120,6 +136,8 @@ class ClusterCommand : public InteractionModelCommands, public ModelCommand, pub shouldStop = mRepeatCount.Value() == 0; } + BDXDiagnosticLogsServerDelegate::GetInstance().RemoveFileDesignator(client); + if (shouldStop) { SetCommandExitStatus(mError); diff --git a/examples/chip-tool/commands/common/BDXDiagnosticLogsServerDelegate.cpp b/examples/chip-tool/commands/common/BDXDiagnosticLogsServerDelegate.cpp new file mode 100644 index 00000000000000..27260a54f57887 --- /dev/null +++ b/examples/chip-tool/commands/common/BDXDiagnosticLogsServerDelegate.cpp @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2023 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "BDXDiagnosticLogsServerDelegate.h" + +#include + +constexpr const char kTmpDir[] = "/tmp/"; +constexpr uint8_t kMaxFileDesignatorLen = 32; +constexpr uint16_t kMaxFilePathLen = kMaxFileDesignatorLen + sizeof(kTmpDir) + 1; + +// For testing a few file names trigger an error depending on the current 'phase'. +constexpr char kErrorOnTransferBegin[] = "Error:OnTransferBegin"; +constexpr char kErrorOnTransferData[] = "Error:OnTransferData"; +constexpr char kErrorOnTransferEnd[] = "Error:OnTransferEnd"; + +BDXDiagnosticLogsServerDelegate BDXDiagnosticLogsServerDelegate::sInstance; + +CHIP_ERROR CheckForErrorRequested(const chip::CharSpan & phaseErrorTarget, const chip::CharSpan & fileDesignator) +{ + VerifyOrReturnError(!phaseErrorTarget.data_equal(fileDesignator), CHIP_ERROR_INTERNAL); + return CHIP_NO_ERROR; +} + +CHIP_ERROR CheckFileDesignatorAllowed(const std::map & fileDesignators, + const chip::CharSpan & fileDesignator) +{ + std::string targetFileDesignator(fileDesignator.data(), fileDesignator.size()); + + for (auto it = fileDesignators.begin(); it != fileDesignators.end(); it++) + { + auto expectedFileDesignator = it->second; + if (targetFileDesignator.compare(expectedFileDesignator) == 0) + { + return CHIP_NO_ERROR; + } + } + + return CHIP_ERROR_NOT_FOUND; +} + +CHIP_ERROR GetFilePath(const chip::CharSpan & fileDesignator, chip::MutableCharSpan & outFilePath) +{ + VerifyOrReturnError(fileDesignator.size() <= kMaxFileDesignatorLen, CHIP_ERROR_INVALID_STRING_LENGTH); + // sizeof(kTmpDir) includes the trailing null. + VerifyOrReturnError(outFilePath.size() >= sizeof(kTmpDir) - 1 + fileDesignator.size(), CHIP_ERROR_INTERNAL); + + memcpy(outFilePath.data(), kTmpDir, sizeof(kTmpDir) - 1); + memcpy(outFilePath.data() + sizeof(kTmpDir) - 1, fileDesignator.data(), fileDesignator.size()); + outFilePath.reduce_size(sizeof(kTmpDir) - 1 + fileDesignator.size()); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR CheckFileExists(const char * filePath) +{ + if (access(filePath, F_OK) != 0) + { + ChipLogError(chipTool, "The file '%s' for dumping the logs does not exist.", filePath); + return CHIP_ERROR_INCORRECT_STATE; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR CheckFileDoesNotExist(const char * filePath) +{ + if (access(filePath, F_OK) == 0) + { + ChipLogError(chipTool, "The file '%s' for dumping the logs already exists.", filePath); + return CHIP_ERROR_INCORRECT_STATE; + } + + return CHIP_NO_ERROR; +} + +void LogFileDesignator(const char * prefix, const chip::CharSpan & fileDesignator, CHIP_ERROR error = CHIP_NO_ERROR) +{ +#if CHIP_PROGRESS_LOGGING + auto size = static_cast(fileDesignator.size()); + auto data = fileDesignator.data(); + ChipLogProgress(chipTool, "%s (%u): %.*s", prefix, size, size, data); +#endif // CHIP_PROGRESS_LOGGING + + if (CHIP_NO_ERROR != error) + { + ChipLogError(chipTool, "%s: %s", prefix, ErrorStr(error)); + } +} + +CHIP_ERROR CreateFile(const char * filePath) +{ + VerifyOrReturnError(nullptr != filePath, CHIP_ERROR_INVALID_ARGUMENT); + + auto fd = fopen(filePath, "w+"); + VerifyOrReturnError(nullptr != fd, CHIP_ERROR_WRITE_FAILED); + + auto rv = fclose(fd); + VerifyOrReturnError(EOF != rv, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR AppendToFile(const char * filePath, const chip::ByteSpan & data) +{ + VerifyOrReturnError(nullptr != filePath, CHIP_ERROR_INVALID_ARGUMENT); + + auto fd = fopen(filePath, "a"); + VerifyOrReturnError(nullptr != fd, CHIP_ERROR_WRITE_FAILED); + + fwrite(data.data(), data.size(), 1, fd); + + auto rv = fclose(fd); + VerifyOrReturnError(EOF != rv, CHIP_ERROR_INTERNAL); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR BDXDiagnosticLogsServerDelegate::OnTransferBegin(chip::bdx::BDXTransferProxy * transfer) +{ + auto fileDesignator = transfer->GetFileDesignator(); + LogFileDesignator("OnTransferBegin", fileDesignator); + + chip::CharSpan phaseErrorTarget(kErrorOnTransferBegin, sizeof(kErrorOnTransferBegin) - 1); + ReturnErrorOnFailure(CheckForErrorRequested(phaseErrorTarget, fileDesignator)); + ReturnErrorOnFailure(CheckFileDesignatorAllowed(mFileDesignators, fileDesignator)); + + char outputFilePath[kMaxFilePathLen] = { 0 }; + chip::MutableCharSpan outputFilePathSpan(outputFilePath); + ReturnErrorOnFailure(GetFilePath(fileDesignator, outputFilePathSpan)); + + // Ensure null-termination of the filename, since we will be passing it around as a char *. + VerifyOrReturnError(outputFilePathSpan.size() < ArraySize(outputFilePath), CHIP_ERROR_INTERNAL); + outputFilePath[outputFilePathSpan.size()] = '\0'; + + ReturnErrorOnFailure(CheckFileDoesNotExist(outputFilePath)); + ReturnErrorOnFailure(CreateFile(outputFilePath)); + + return transfer->Accept(); +} + +CHIP_ERROR BDXDiagnosticLogsServerDelegate::OnTransferEnd(chip::bdx::BDXTransferProxy * transfer, CHIP_ERROR error) +{ + auto fileDesignator = transfer->GetFileDesignator(); + LogFileDesignator("OnTransferEnd", fileDesignator, error); + + chip::CharSpan phaseErrorTarget(kErrorOnTransferEnd, sizeof(kErrorOnTransferEnd) - 1); + ReturnErrorOnFailure(CheckForErrorRequested(phaseErrorTarget, fileDesignator)); + + char outputFilePath[kMaxFilePathLen] = { 0 }; + chip::MutableCharSpan outputFilePathSpan(outputFilePath); + ReturnErrorOnFailure(GetFilePath(fileDesignator, outputFilePathSpan)); + ReturnErrorOnFailure(CheckFileExists(outputFilePath)); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR BDXDiagnosticLogsServerDelegate::OnTransferData(chip::bdx::BDXTransferProxy * transfer, const chip::ByteSpan & data) +{ + auto fileDesignator = transfer->GetFileDesignator(); + LogFileDesignator("OnTransferData", fileDesignator); + + chip::CharSpan phaseErrorTarget(kErrorOnTransferData, sizeof(kErrorOnTransferData) - 1); + ReturnErrorOnFailure(CheckForErrorRequested(phaseErrorTarget, fileDesignator)); + + char outputFilePath[kMaxFilePathLen] = { 0 }; + chip::MutableCharSpan outputFilePathSpan(outputFilePath); + ReturnErrorOnFailure(GetFilePath(fileDesignator, outputFilePathSpan)); + ReturnErrorOnFailure(CheckFileExists(outputFilePath)); + ReturnErrorOnFailure(AppendToFile(outputFilePath, data)); + + return transfer->Continue(); +} + +void BDXDiagnosticLogsServerDelegate::AddFileDesignator(chip::app::CommandSender * sender, const chip::CharSpan & fileDesignator) +{ + std::string entry(fileDesignator.data(), fileDesignator.size()); + mFileDesignators[sender] = entry; +} + +void BDXDiagnosticLogsServerDelegate::RemoveFileDesignator(chip::app::CommandSender * sender) +{ + mFileDesignators.erase(sender); +} diff --git a/examples/chip-tool/commands/common/BDXDiagnosticLogsServerDelegate.h b/examples/chip-tool/commands/common/BDXDiagnosticLogsServerDelegate.h new file mode 100644 index 00000000000000..5aea4b56632e79 --- /dev/null +++ b/examples/chip-tool/commands/common/BDXDiagnosticLogsServerDelegate.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#include +#include + +#include +#include + +class BDXDiagnosticLogsServerDelegate : public chip::bdx::BDXTransferServerDelegate +{ +public: + static BDXDiagnosticLogsServerDelegate & GetInstance() { return sInstance; } + + void AddFileDesignator(chip::app::CommandSender * sender, const chip::CharSpan & fileDesignator); + void RemoveFileDesignator(chip::app::CommandSender * sender); + + /////////// BDXTransferServerDelegate Interface ///////// + CHIP_ERROR OnTransferBegin(chip::bdx::BDXTransferProxy * transfer) override; + CHIP_ERROR OnTransferEnd(chip::bdx::BDXTransferProxy * transfer, CHIP_ERROR error) override; + CHIP_ERROR OnTransferData(chip::bdx::BDXTransferProxy * transfer, const chip::ByteSpan & data) override; + +private: + BDXDiagnosticLogsServerDelegate() = default; + + std::map mFileDesignators; + static BDXDiagnosticLogsServerDelegate sInstance; +}; diff --git a/examples/chip-tool/commands/common/CHIPCommand.cpp b/examples/chip-tool/commands/common/CHIPCommand.cpp index 45fc2105183cdc..78abff12ada208 100644 --- a/examples/chip-tool/commands/common/CHIPCommand.cpp +++ b/examples/chip-tool/commands/common/CHIPCommand.cpp @@ -139,6 +139,14 @@ CHIP_ERROR CHIPCommand::MaybeSetUpStack() factoryInitParams.listenPort = port; ReturnLogErrorOnFailure(DeviceControllerFactory::GetInstance().Init(factoryInitParams)); + auto systemState = chip::Controller::DeviceControllerFactory::GetInstance().GetSystemState(); + VerifyOrReturnError(nullptr != systemState, CHIP_ERROR_INCORRECT_STATE); + + auto server = systemState->BDXTransferServer(); + VerifyOrReturnError(nullptr != server, CHIP_ERROR_INCORRECT_STATE); + + server->SetDelegate(&BDXDiagnosticLogsServerDelegate::GetInstance()); + ReturnErrorOnFailure(GetAttestationTrustStore(mPaaTrustStorePath.ValueOr(nullptr), &sTrustStore)); ReturnLogErrorOnFailure(sCheckInDelegate.Init(&sICDClientStorage)); diff --git a/examples/chip-tool/commands/common/CHIPCommand.h b/examples/chip-tool/commands/common/CHIPCommand.h index 2caf6fe9cc94ec..55817b5213e589 100644 --- a/examples/chip-tool/commands/common/CHIPCommand.h +++ b/examples/chip-tool/commands/common/CHIPCommand.h @@ -24,6 +24,8 @@ #include "Command.h" +#include "BDXDiagnosticLogsServerDelegate.h" + #include #include #include diff --git a/examples/chip-tool/commands/interactive/InteractiveCommands.cpp b/examples/chip-tool/commands/interactive/InteractiveCommands.cpp index d0f27acad60d34..284c145cfe0569 100644 --- a/examples/chip-tool/commands/interactive/InteractiveCommands.cpp +++ b/examples/chip-tool/commands/interactive/InteractiveCommands.cpp @@ -28,6 +28,7 @@ constexpr char kInteractiveModeStopCommand[] = "quit()"; constexpr char kCategoryError[] = "Error"; constexpr char kCategoryProgress[] = "Info"; constexpr char kCategoryDetail[] = "Debug"; +constexpr char kCategoryAutomation[] = "Automation"; namespace { @@ -146,6 +147,9 @@ struct InteractiveServerResult case chip::Logging::kLogCategory_Detail: messageType = kCategoryDetail; break; + case chip::Logging::kLogCategory_Automation: + messageType = kCategoryAutomation; + return; default: // This should not happen. chipDie(); diff --git a/examples/chip-tool/templates/commands.zapt b/examples/chip-tool/templates/commands.zapt index 37aaef24cc2678..bf981ec8e9e9bf 100644 --- a/examples/chip-tool/templates/commands.zapt +++ b/examples/chip-tool/templates/commands.zapt @@ -31,7 +31,7 @@ public: { {{#zcl_command_arguments}} {{#if_chip_complex}} - AddArgument("{{asUpperCamelCase label}}", &mComplex_{{asUpperCamelCase label}}); + AddArgument("{{asUpperCamelCase label}}", &mComplex_{{asUpperCamelCase label}}{{#if isOptional}}, "", Argument::kOptional{{/if}}); {{else if (isString type)}} AddArgument("{{asUpperCamelCase label}}", &mRequest.{{asLowerCamelCase label}}); {{else}} diff --git a/examples/common/pigweed/BUILD.gn b/examples/common/pigweed/BUILD.gn index 389c3fbc242951..e056f2ef228a8a 100644 --- a/examples/common/pigweed/BUILD.gn +++ b/examples/common/pigweed/BUILD.gn @@ -43,6 +43,13 @@ pw_proto_library("attributes_service") { prefix = "attributes_service" } +pw_proto_library("boolean_state_service") { + sources = [ "protos/boolean_state_service.proto" ] + deps = [ "$dir_pw_protobuf:common_protos" ] + strip_prefix = "protos" + prefix = "boolean_state_service" +} + pw_proto_library("device_service") { sources = [ "protos/device_service.proto" ] inputs = [ "protos/device_service.options" ] @@ -115,7 +122,7 @@ pw_source_set("system_rpc_server") { ] public_deps = [ - "$dir_pw_hdlc:pw_rpc", + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", ] diff --git a/examples/common/pigweed/RpcService.cpp b/examples/common/pigweed/RpcService.cpp index e36ab54afe1eb4..74d0b891e9b00d 100644 --- a/examples/common/pigweed/RpcService.cpp +++ b/examples/common/pigweed/RpcService.cpp @@ -22,8 +22,9 @@ #include #include +#include "pw_hdlc/decoder.h" +#include "pw_hdlc/default_addresses.h" #include "pw_hdlc/rpc_channel.h" -#include "pw_hdlc/rpc_packets.h" #include "pw_log/log.h" #include "pw_rpc/channel.h" #include "pw_status/status.h" @@ -116,7 +117,25 @@ void Start(void (*RegisterServices)(pw::rpc::Server &), ::chip::rpc::Mutex * uar std::array input_buffer; Logging::Log(Logging::kLogModule_NotSpecified, Logging::kLogCategory_Detail, "Starting pw_rpc server"); - pw::hdlc::ReadAndProcessPackets(server, input_buffer); + + pw::hdlc::Decoder decoder(input_buffer); + while (true) + { + std::byte data; + if (!pw::sys_io::ReadByte(&data).ok()) + { + // TODO: should we log? + return; + } + if (auto result = decoder.Process(data); result.ok()) + { + pw::hdlc::Frame & frame = result.value(); + if (frame.address() == pw::hdlc::kDefaultRpcAddress) + { + server.ProcessPacket(frame.data()).IgnoreError(); + } + } + } } } // namespace rpc diff --git a/examples/common/pigweed/mbed/Rpc.cpp b/examples/common/pigweed/mbed/Rpc.cpp index 79940b005eba06..2695822363d4ad 100644 --- a/examples/common/pigweed/mbed/Rpc.cpp +++ b/examples/common/pigweed/mbed/Rpc.cpp @@ -22,7 +22,6 @@ #include "pigweed/RpcService.h" #include "pw_hdlc/rpc_channel.h" -#include "pw_hdlc/rpc_packets.h" #include "pw_rpc/server.h" #include "pw_stream/sys_io_stream.h" #include "pw_sys_io/sys_io.h" diff --git a/examples/common/pigweed/protos/boolean_state_service.proto b/examples/common/pigweed/protos/boolean_state_service.proto new file mode 100644 index 00000000000000..ea15c0174f33b9 --- /dev/null +++ b/examples/common/pigweed/protos/boolean_state_service.proto @@ -0,0 +1,37 @@ +syntax = "proto3"; + +import 'pw_protobuf_protos/common.proto'; + +package chip.rpc; + +// This may eventually contain more attributes. +message BooleanStateState { + bool state_value = 1; +} + +message BooleanStateSetRequest { + uint32 endpoint_id = 1; + bool state_value = 2; +} + +message BooleanStateSetResponse { + uint64 event_number = 1; +} + +message BooleanStateGetRequest { + uint32 endpoint_id = 1; +} + +message BooleanStateGetResponse { + BooleanStateState state = 1; +} + +service BooleanState { + // Set will return generated event number (caused by change) if all supported fields are successfully applied, any + // unsupported fields will be ignored. + rpc Set(BooleanStateSetRequest) returns (BooleanStateSetResponse){} + + // Get will populate all of the supported boolean state cluster state fields + // with the current values. + rpc Get(BooleanStateGetRequest) returns (BooleanStateGetResponse){} +} diff --git a/examples/common/pigweed/rpc_console/py/BUILD.gn b/examples/common/pigweed/rpc_console/py/BUILD.gn index 5c74b7b2599544..a050fb64747302 100644 --- a/examples/common/pigweed/rpc_console/py/BUILD.gn +++ b/examples/common/pigweed/rpc_console/py/BUILD.gn @@ -40,6 +40,7 @@ pw_python_package("chip_rpc") { "$dir_pw_system/py", "$dir_pw_tokenizer/py", "${chip_root}/examples/common/pigweed:attributes_service.python", + "${chip_root}/examples/common/pigweed:boolean_state_service.python", "${chip_root}/examples/common/pigweed:button_service.python", "${chip_root}/examples/common/pigweed:descriptor_service.python", "${chip_root}/examples/common/pigweed:device_service.python", diff --git a/examples/common/pigweed/rpc_console/py/chip_rpc/console.py b/examples/common/pigweed/rpc_console/py/chip_rpc/console.py index 6d2b06fd73208f..f5ed5b5ab4d582 100644 --- a/examples/common/pigweed/rpc_console/py/chip_rpc/console.py +++ b/examples/common/pigweed/rpc_console/py/chip_rpc/console.py @@ -47,6 +47,7 @@ # Protos # isort: off from attributes_service import attributes_service_pb2 +from boolean_state_service import boolean_state_service_pb2 from button_service import button_service_pb2 from descriptor_service import descriptor_service_pb2 from device_service import device_service_pb2 @@ -128,6 +129,7 @@ def show_console(device: str, baudrate: int, use_ipython=True, compiled_protos=[ attributes_service_pb2, + boolean_state_service_pb2, button_service_pb2, descriptor_service_pb2, device_service_pb2, diff --git a/examples/common/pigweed/rpc_services/BooleanState.h b/examples/common/pigweed/rpc_services/BooleanState.h new file mode 100644 index 00000000000000..bb4b524459d03d --- /dev/null +++ b/examples/common/pigweed/rpc_services/BooleanState.h @@ -0,0 +1,72 @@ +/* + * + * 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 "app/util/attribute-storage.h" +#include "boolean_state_service/boolean_state_service.rpc.pb.h" +#include "pigweed/rpc_services/internal/StatusUtils.h" +#include +#include +#include + +namespace chip { +namespace rpc { + +class BooleanState final : public pw_rpc::nanopb::BooleanState::Service +{ +public: + virtual ~BooleanState() = default; + + virtual pw::Status Set(const chip_rpc_BooleanStateSetRequest & request, chip_rpc_BooleanStateSetResponse & response) + { + EndpointId endpointId = request.endpoint_id; + bool newState = request.state_value; + + EventNumber eventNumber; + { + DeviceLayer::StackLock lock; + + // Update attribute first, then emit StateChange event only on success. + RETURN_STATUS_IF_NOT_OK(app::Clusters::BooleanState::Attributes::StateValue::Set(endpointId, newState)); + + chip::app::Clusters::BooleanState::Events::StateChange::Type event{ newState }; + RETURN_STATUS_IF_NOT_OK(app::LogEvent(event, endpointId, eventNumber)); + } + + response.event_number = static_cast(eventNumber); + return pw::OkStatus(); + } + + virtual pw::Status Get(const chip_rpc_BooleanStateGetRequest & request, chip_rpc_BooleanStateGetResponse & response) + { + EndpointId endpointId = request.endpoint_id; + bool state_value = false; + + { + DeviceLayer::StackLock lock; + RETURN_STATUS_IF_NOT_OK(app::Clusters::BooleanState::Attributes::StateValue::Get(endpointId, &state_value)); + } + + response.state.state_value = state_value; + return pw::OkStatus(); + } +}; + +} // namespace rpc +} // namespace chip diff --git a/examples/common/pigweed/rpc_services/internal/StatusUtils.h b/examples/common/pigweed/rpc_services/internal/StatusUtils.h index 444759f818efa2..f92ee66afc44bb 100644 --- a/examples/common/pigweed/rpc_services/internal/StatusUtils.h +++ b/examples/common/pigweed/rpc_services/internal/StatusUtils.h @@ -20,12 +20,13 @@ #pragma once #include "app/util/attribute-storage.h" +#include "protocols/interaction_model/StatusCode.h" #include "pw_status/status.h" #define RETURN_STATUS_IF_NOT_OK(expr) \ do \ { \ - pw::Status __status = chip::rpc::EmberStatusToPwStatus(expr); \ + pw::Status __status = chip::rpc::ToPwStatus(expr); \ if (!__status.ok()) \ { \ return __status; \ @@ -35,7 +36,7 @@ namespace chip { namespace rpc { -constexpr pw::Status EmberStatusToPwStatus(EmberAfStatus ember_status) +constexpr pw::Status ToPwStatus(EmberAfStatus ember_status) { switch (ember_status) { @@ -50,5 +51,26 @@ constexpr pw::Status EmberStatusToPwStatus(EmberAfStatus ember_status) } } +constexpr pw::Status ToPwStatus(CHIP_ERROR chip_error_status) +{ + switch (chip_error_status.AsInteger()) + { + case CHIP_NO_ERROR.AsInteger(): + return pw::OkStatus(); + case CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute).AsInteger(): + case CHIP_IM_GLOBAL_STATUS(UnsupportedCommand).AsInteger(): + case CHIP_IM_GLOBAL_STATUS(UnsupportedEndpoint).AsInteger(): + case CHIP_IM_GLOBAL_STATUS(UnsupportedEvent).AsInteger(): + return pw::Status::NotFound(); + case CHIP_IM_GLOBAL_STATUS(UnsupportedAccess).AsInteger(): + return pw::Status::PermissionDenied(); + case CHIP_IM_GLOBAL_STATUS(InvalidAction).AsInteger(): + case CHIP_IM_GLOBAL_STATUS(InvalidCommand).AsInteger(): + return pw::Status::InvalidArgument(); + default: + return pw::Status::Unknown(); + } +} + } // namespace rpc } // namespace chip diff --git a/examples/common/pigweed/system_rpc_server.cc b/examples/common/pigweed/system_rpc_server.cc index 6778499c54ab3c..098aa3b1711058 100644 --- a/examples/common/pigweed/system_rpc_server.cc +++ b/examples/common/pigweed/system_rpc_server.cc @@ -17,8 +17,9 @@ #include +#include "pw_hdlc/decoder.h" +#include "pw_hdlc/default_addresses.h" #include "pw_hdlc/rpc_channel.h" -#include "pw_hdlc/rpc_packets.h" #include "pw_log/log.h" #include "pw_rpc_system_server/rpc_server.h" #include "pw_stream/sys_io_stream.h" diff --git a/examples/common/tracing/TraceDecoder.h b/examples/common/tracing/TraceDecoder.h index 4e70f5f12f1535..4630b556e329b7 100644 --- a/examples/common/tracing/TraceDecoder.h +++ b/examples/common/tracing/TraceDecoder.h @@ -40,7 +40,7 @@ class TraceDecoder : public TraceStream void AddField(const std::string & tag, const std::string & data) override { - char buffer[2048] = {}; + char buffer[4096] = {}; snprintf(buffer, sizeof(buffer), " %s\t %s", tag.c_str(), data.c_str()); CHIP_ERROR err = ReadString(buffer); diff --git a/examples/common/tracing/decoder/bdx/Decoder.cpp b/examples/common/tracing/decoder/bdx/Decoder.cpp index 7a6181fcf73bb3..268b4c78be7ef1 100644 --- a/examples/common/tracing/decoder/bdx/Decoder.cpp +++ b/examples/common/tracing/decoder/bdx/Decoder.cpp @@ -18,6 +18,9 @@ #include "Decoder.h" +#include "../logging/Log.h" + +#include #include namespace { @@ -34,14 +37,30 @@ constexpr char kBlockEOF[] = "Block End Of File"; constexpr char kBlockAck[] = "Block Ack"; constexpr char kBlockAckEOF[] = "Block Ack End Of File"; constexpr char kBlockQueryWithSkip[] = "Block Query With Skip"; + +constexpr char kDataHeader[] = "Data"; } // namespace -using MessageType = chip::bdx::MessageType; +using MessageType = chip::bdx::MessageType; +using RangeControlFlags = chip::bdx::RangeControlFlags; +using TransferControlFlags = chip::bdx::TransferControlFlags; namespace chip { namespace trace { namespace bdx { +using namespace logging; + +CHIP_ERROR DecodeTransferInit(System::PacketBufferHandle msgData); +CHIP_ERROR DecodeSendAccept(System::PacketBufferHandle msgData); +CHIP_ERROR DecodeReceiveAccept(System::PacketBufferHandle msgData); +CHIP_ERROR DecodeBlockCounter(System::PacketBufferHandle msgData); +CHIP_ERROR DecodeDataBlock(System::PacketBufferHandle msgData); +CHIP_ERROR DecodeBlockQueryWithSkip(System::PacketBufferHandle msgData); +void DecodeAndPrintTransferControl(const char * header, BitFlags & flags); +void DecodeAndPrintRangeControl(const char * header, BitFlags & flags); +void DecodeAndPrintMetadata(const ByteSpan & data); + const char * ToProtocolName() { return kProtocolName; @@ -71,39 +90,210 @@ const char * ToProtocolMessageTypeName(uint8_t protocolCode) return kBlockAckEOF; case to_underlying(MessageType::BlockQueryWithSkip): return kBlockQueryWithSkip; - default: - return kUnknown; } + + return kUnknown; } CHIP_ERROR LogAsProtocolMessage(uint8_t protocolCode, const uint8_t * data, size_t len) { - // TODO Implement messages decoding + auto msgData = System::PacketBufferHandle::NewWithData(data, len); switch (protocolCode) { case to_underlying(MessageType::SendInit): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeTransferInit(std::move(msgData)); case to_underlying(MessageType::SendAccept): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeSendAccept(std::move(msgData)); case to_underlying(MessageType::ReceiveInit): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeTransferInit(std::move(msgData)); case to_underlying(MessageType::ReceiveAccept): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeReceiveAccept(std::move(msgData)); case to_underlying(MessageType::BlockQuery): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeBlockCounter(std::move(msgData)); case to_underlying(MessageType::Block): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeDataBlock(std::move(msgData)); case to_underlying(MessageType::BlockEOF): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeDataBlock(std::move(msgData)); case to_underlying(MessageType::BlockAck): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeBlockCounter(std::move(msgData)); case to_underlying(MessageType::BlockAckEOF): - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeBlockCounter(std::move(msgData)); case to_underlying(MessageType::BlockQueryWithSkip): - return CHIP_ERROR_NOT_IMPLEMENTED; - default: - return CHIP_ERROR_NOT_IMPLEMENTED; + return DecodeBlockQueryWithSkip(std::move(msgData)); + } + + return CHIP_ERROR_NOT_IMPLEMENTED; +} + +CHIP_ERROR DecodeTransferInit(System::PacketBufferHandle msgData) +{ + auto scopedIndent = ScopedLogIndentWithSize(kDataHeader, msgData->DataLength()); + + chip::bdx::TransferInit msg; + ReturnErrorOnFailure(msg.Parse(msgData.Retain())); + + auto ptc = msg.TransferCtlOptions; + auto rc = msg.mRangeCtlFlags; + auto pmbs = msg.MaxBlockSize; + auto startofs = msg.StartOffset; + auto len = msg.MaxLength; + auto fdl = msg.FileDesLength; + auto fd = CharSpan(Uint8::to_const_char(msg.FileDesignator), msg.FileDesLength); + auto mdata = ByteSpan(msg.Metadata, msg.MetadataLength); + + DecodeAndPrintTransferControl("Proposed Transfer Control", ptc); + DecodeAndPrintRangeControl("Range Control", rc); + Log("Proposed Max Block Size", pmbs); + + if (rc.Has(RangeControlFlags::kStartOffset)) + { + LogAsHex("Start Offset", startofs); + } + + if (rc.Has(RangeControlFlags::kDefLen)) + { + LogAsHex("Proposed Max Length", len); + } + + Log("File Designator Length", fdl); + Log("File Designator", fd); + DecodeAndPrintMetadata(mdata); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DecodeSendAccept(System::PacketBufferHandle msgData) +{ + auto scopedIndent = ScopedLogIndentWithSize(kDataHeader, msgData->DataLength()); + + chip::bdx::SendAccept msg; + ReturnErrorOnFailure(msg.Parse(msgData.Retain())); + + auto tc = msg.TransferCtlFlags; + auto mbs = msg.MaxBlockSize; + auto mdata = ByteSpan(msg.Metadata, msg.MetadataLength); + + DecodeAndPrintTransferControl("Transfer Control", tc); + Log("Max Block Size", mbs); + DecodeAndPrintMetadata(mdata); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DecodeReceiveAccept(System::PacketBufferHandle msgData) +{ + auto scopedIndent = ScopedLogIndentWithSize(kDataHeader, msgData->DataLength()); + + chip::bdx::ReceiveAccept msg; + ReturnErrorOnFailure(msg.Parse(msgData.Retain())); + + auto tc = msg.TransferCtlFlags; + auto rc = msg.mRangeCtlFlags; + auto mbs = msg.MaxBlockSize; + auto len = msg.Length; + auto mdata = ByteSpan(msg.Metadata, msg.MetadataLength); + + DecodeAndPrintTransferControl("Transfer Control", tc); + DecodeAndPrintRangeControl("Range Control", rc); + Log("Max Block Size", mbs); + + if (rc.Has(RangeControlFlags::kDefLen)) + { + LogAsHex("Length", len); + } + + DecodeAndPrintMetadata(mdata); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DecodeBlockCounter(System::PacketBufferHandle msgData) +{ + auto scopedIndent = ScopedLogIndent(kDataHeader); + + chip::bdx::CounterMessage msg; + ReturnErrorOnFailure(msg.Parse(msgData.Retain())); + + Log("BlockCounter", msg.BlockCounter); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DecodeDataBlock(System::PacketBufferHandle msgData) +{ + auto scopedIndent = ScopedLogIndentWithSize(kDataHeader, msgData->DataLength()); + + chip::bdx::DataBlock msg; + ReturnErrorOnFailure(msg.Parse(msgData.Retain())); + + Log("BlockCounter", msg.BlockCounter); + + auto data = ByteSpan(msg.Data, msg.DataLength); + Log("Data", data); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DecodeBlockQueryWithSkip(System::PacketBufferHandle msgData) +{ + auto scopedIndent = ScopedLogIndent(kDataHeader); + + chip::bdx::BlockQueryWithSkip msg; + ReturnErrorOnFailure(msg.Parse(msgData.Retain())); + + Log("BlockCounter", msg.BlockCounter); + LogAsHex("BytesToSkip", msg.BytesToSkip); + + return CHIP_NO_ERROR; +} + +void DecodeAndPrintTransferControl(const char * header, BitFlags & flags) +{ + auto scopedIndent = ScopedLogIndentWithFlags(header, flags.Raw()); + + if (flags.Has(TransferControlFlags::kSenderDrive)) + { + Log("SenderDrive"); + } + + if (flags.Has(TransferControlFlags::kReceiverDrive)) + { + Log("ReceivedDrive"); + } + + if (flags.Has(TransferControlFlags::kAsync)) + { + Log("Async"); + } +} + +void DecodeAndPrintRangeControl(const char * header, BitFlags & flags) +{ + auto scopedIndent = ScopedLogIndentWithFlags(header, flags.Raw()); + + if (flags.Has(chip::bdx::RangeControlFlags::kDefLen)) + { + Log("DefLen"); + } + + if (flags.Has(RangeControlFlags::kStartOffset)) + { + Log("StartOffset"); + } + + if (flags.Has(RangeControlFlags::kWiderange)) + { + Log("Widerange"); + } +} + +void DecodeAndPrintMetadata(const ByteSpan & data) +{ + if (data.size()) + { + // TODO Make metadata decoding prettier. + Log("HasMetadata"); } } diff --git a/examples/common/tracing/decoder/logging/Log.cpp b/examples/common/tracing/decoder/logging/Log.cpp index 4fa5d9dfeb8bfc..b0645bb3980d77 100644 --- a/examples/common/tracing/decoder/logging/Log.cpp +++ b/examples/common/tracing/decoder/logging/Log.cpp @@ -34,7 +34,7 @@ uint8_t gIndentLevel = 0; void ENFORCE_FORMAT(1, 2) LogFormatted(const char * format, ...) { - char buffer[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE] = {}; + char buffer[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE + 1] = {}; int indentation = gIndentLevel * kSpacePerIndent; snprintf(buffer, sizeof(buffer), "%*s", indentation, ""); @@ -76,9 +76,20 @@ void Log(const char * name, ByteSpan & data) return; } - char buffer[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE]; + // If the size of the data is larger than half of the maximum size for a log message (minus 1 for null-termination), + // reduce the size of the data to fit within this limit. + // The limit is half the size of the message because we will be logging a hex representation of that data, at 2 chars per byte. + if (data.size() > (CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE / 2) - 1) + { + data.reduce_size((CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE / 2) - 1); + } + + char buffer[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE] = { 0 }; chip::MutableCharSpan destination(buffer); + // Check if the size of the data can be cast to uint16_t. + // If yes, log the name and size of the data followed by its hexadecimal string representation. + // If no, log the name and a marker indicating the size exceeds UINT16_MAX, followed by the data's hexadecimal string. CanCastTo(data.size()) ? LogFormatted("%s (%u) = %s", name, static_cast(data.size()), ToHexString(data, destination)) : LogFormatted("%s (>UINT16_MAX) = %s", name, ToHexString(data, destination)); @@ -116,6 +127,11 @@ void Log(const char * name) LogFormatted("%s", name); } +void LogAsHex(const char * name, uint8_t value) +{ + LogFormatted("%s = 0x%02x", name, value); +} + void LogAsHex(const char * name, uint16_t value) { LogFormatted("%s = 0x%04x", name, value); diff --git a/examples/common/tracing/decoder/logging/Log.h b/examples/common/tracing/decoder/logging/Log.h index b2ff6915eb4604..39f656546cc4c2 100644 --- a/examples/common/tracing/decoder/logging/Log.h +++ b/examples/common/tracing/decoder/logging/Log.h @@ -60,6 +60,8 @@ void Log(const char * name); void Log(const char * name, const char * value); +void LogAsHex(const char * name, uint8_t value); + void LogAsHex(const char * name, uint16_t value); void LogAsHex(const char * name, uint64_t value); diff --git a/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter b/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter index 6023f53fa18bba..4372e568a2927d 100644 --- a/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter +++ b/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter @@ -1657,7 +1657,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2007,7 +2007,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 c6b0021764b0a4..19b43af9e8140a 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 @@ -279,10 +279,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4496,10 +4496,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/darwin-framework-tool/BUILD.gn b/examples/darwin-framework-tool/BUILD.gn index 7ee396dd04e24a..1973c64a889e20 100644 --- a/examples/darwin-framework-tool/BUILD.gn +++ b/examples/darwin-framework-tool/BUILD.gn @@ -163,6 +163,8 @@ executable("darwin-framework-tool") { "${chip_root}/examples/chip-tool/commands/common/Commands.h", "${chip_root}/examples/chip-tool/commands/common/HexConversion.h", "${chip_root}/zzz_generated/chip-tool/zap-generated/cluster/ComplexArgumentParser.cpp", + "commands/bdx/Commands.h", + "commands/bdx/DownloadLogCommand.mm", "commands/clusters/ClusterCommandBridge.h", "commands/clusters/ModelCommandBridge.mm", "commands/clusters/ReportCommandBridge.h", diff --git a/examples/darwin-framework-tool/commands/bdx/Commands.h b/examples/darwin-framework-tool/commands/bdx/Commands.h new file mode 100644 index 00000000000000..126ea055d03ba9 --- /dev/null +++ b/examples/darwin-framework-tool/commands/bdx/Commands.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#pragma once + +#include "commands/bdx/DownloadLogCommand.h" +#include "commands/common/Commands.h" + +void registerCommandsBdx(Commands & commands) +{ + const char * clusterName = "Bdx"; + commands_list clusterCommands = { + make_unique(), // + }; + + commands.RegisterCommandSet(clusterName, clusterCommands, "Commands related to BDX"); +} diff --git a/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.h b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.h new file mode 100644 index 00000000000000..ce48270d28b6ac --- /dev/null +++ b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.h @@ -0,0 +1,45 @@ +/* + * 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 "../common/CHIPCommandBridge.h" + +class DownloadLogCommand : public CHIPCommandBridge +{ +public: + DownloadLogCommand() : CHIPCommandBridge("download") + { + AddArgument("node-id", 0, UINT64_MAX, &mNodeId, "Node to download the logs from."); + AddArgument("log-type", 0, 2, &mLogType, + "The type of log being requested. This should correspond to a value in the enum MTRDiagnosticLogType."); + AddArgument("timeout", 0, UINT16_MAX, &mTimeout, + "The timeout for getting the log. If the timeout expires, completion will be called with whatever has been " + "retrieved by that point (which might be none or a partial log). If the timeout is set to 0, the request will " + "not expire and completion will not be called until the log is fully retrieved or an error occurs."); + } + + /////////// CHIPCommandBridge Interface ///////// + CHIP_ERROR RunCommand() override; + chip::System::Clock::Timeout GetWaitDuration() const override { return chip::System::Clock::Seconds16(10); } + +private: + chip::NodeId mNodeId; + uint8_t mLogType; + uint16_t mTimeout; +}; diff --git a/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.mm b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.mm new file mode 100644 index 00000000000000..494ec964f14b63 --- /dev/null +++ b/examples/darwin-framework-tool/commands/bdx/DownloadLogCommand.mm @@ -0,0 +1,58 @@ +/* + * 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. + * + */ + +#import + +#import "MTRError_Utils.h" + +#include "DownloadLogCommand.h" + +CHIP_ERROR DownloadLogCommand::RunCommand() +{ + ChipLogProgress(chipTool, "Downloading logs from node 0x" ChipLogFormatX64, ChipLogValueX64(mNodeId)); + + MTRDeviceController * commissioner = CurrentCommissioner(); + auto * device = [MTRDevice deviceWithNodeID:@(mNodeId) controller:commissioner]; + + auto logType = static_cast(mLogType); + auto queue = dispatch_queue_create("com.chip.bdx.downloader", DISPATCH_QUEUE_SERIAL); + + auto * self = this; + auto completion = ^(NSURL * url, NSError * error) { + // A non-nil url indicates the presence of content, which can occur even in error scenarios like timeouts. + if (nil != url) { + NSError * readError = nil; + auto * data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&readError]; + VerifyOrReturn(nil == readError, self->SetCommandExitStatus(MTRErrorToCHIPErrorCode(readError))); + + auto * content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; + NSLog(@"Content: %@", content); + } + + VerifyOrReturn(nil == error, self->SetCommandExitStatus(MTRErrorToCHIPErrorCode(error))); + + // The url is nil when there are no logs on the target device. + if (nil == url) { + NSLog(@"No logs has been found onto node 0x" ChipLogFormatX64, ChipLogValueX64(mNodeId)); + } + self->SetCommandExitStatus(CHIP_NO_ERROR); + }; + + [device downloadLogOfType:logType timeout:mTimeout queue:queue completion:completion]; + return CHIP_NO_ERROR; +} diff --git a/examples/darwin-framework-tool/main.mm b/examples/darwin-framework-tool/main.mm index 8c96d490dc5ed8..070ae3188407d4 100644 --- a/examples/darwin-framework-tool/main.mm +++ b/examples/darwin-framework-tool/main.mm @@ -20,6 +20,7 @@ #import "logging/logging.h" +#include "commands/bdx/Commands.h" #include "commands/common/Commands.h" #include "commands/delay/Commands.h" #include "commands/discover/Commands.h" @@ -38,6 +39,7 @@ int main(int argc, const char * argv[]) dft::logging::Setup(); Commands commands; + registerCommandsBdx(commands); registerCommandsPairing(commands); registerCommandsDelay(commands); registerCommandsDiscover(commands); diff --git a/examples/darwin-framework-tool/templates/tests/ciTests.json b/examples/darwin-framework-tool/templates/tests/ciTests.json index a9c54d4bb43193..66886c7d769ff5 100644 --- a/examples/darwin-framework-tool/templates/tests/ciTests.json +++ b/examples/darwin-framework-tool/templates/tests/ciTests.json @@ -63,6 +63,10 @@ "Test_TC_LWM_3_1", "Test_TC_LWM_3_2", "Test_TC_LWM_3_3", + "Test_TC_OTCCM_2_1", + "Test_TC_OTCCM_3_1", + "Test_TC_OTCCM_3_2", + "Test_TC_OTCCM_3_3", "Disabled because darwin-framework-tool does not support constraints arithmetic operations", "Test_TC_FLW_2_1", "Test_TC_RH_2_1", diff --git a/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter b/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter index 6a2620e02878fa..3359107957e727 100644 --- a/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter +++ b/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter @@ -1241,7 +1241,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1514,7 +1514,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap b/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap index 09ad0865018b8c..83e189441e4a2d 100644 --- a/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap +++ b/examples/dishwasher-app/dishwasher-common/dishwasher-app.zap @@ -419,10 +419,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3548,10 +3548,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "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.matter b/examples/energy-management-app/energy-management-common/energy-management-app.matter index 56e288bc712b9b..dae189309d4dbb 100644 --- a/examples/energy-management-app/energy-management-common/energy-management-app.matter +++ b/examples/energy-management-app/energy-management-common/energy-management-app.matter @@ -900,6 +900,85 @@ cluster GroupKeyManagement = 63 { fabric command access(invoke: administer) KeySetReadAllIndices(): KeySetReadAllIndicesResponse = 4; } +/** This cluster provides a mechanism for querying data about the electrical energy imported or provided by the server. */ +provisional cluster ElectricalEnergyMeasurement = 145 { + revision 1; + + enum MeasurementTypeEnum : enum16 { + kUnspecified = 0; + kVoltage = 1; + kActiveCurrent = 2; + kReactiveCurrent = 3; + kApparentCurrent = 4; + kActivePower = 5; + kReactivePower = 6; + kApparentPower = 7; + kRMSVoltage = 8; + kRMSCurrent = 9; + kRMSPower = 10; + kFrequency = 11; + kPowerFactor = 12; + kNeutralCurrent = 13; + kElectricalEnergy = 14; + } + + bitmap Feature : bitmap32 { + kImportedEnergy = 0x1; + kExportedEnergy = 0x2; + kCumulativeEnergy = 0x4; + kPeriodicEnergy = 0x8; + } + + struct MeasurementAccuracyRangeStruct { + int64s rangeMin = 0; + int64s rangeMax = 1; + optional percent100ths percentMax = 2; + optional percent100ths percentMin = 3; + optional percent100ths percentTypical = 4; + optional int64u fixedMax = 5; + optional int64u fixedMin = 6; + optional int64u fixedTypical = 7; + } + + struct MeasurementAccuracyStruct { + MeasurementTypeEnum measurementType = 0; + boolean measured = 1; + int64s minMeasuredValue = 2; + int64s maxMeasuredValue = 3; + MeasurementAccuracyRangeStruct accuracyRanges[] = 4; + } + + struct EnergyMeasurementStruct { + int64s energy = 0; + optional epoch_s startTimestamp = 1; + optional epoch_s endTimestamp = 2; + optional systime_ms startSystime = 3; + optional systime_ms endSystime = 4; + } + + info event CumulativeEnergyMeasured = 0 { + optional EnergyMeasurementStruct energyImported = 0; + optional EnergyMeasurementStruct energyExported = 1; + } + + info event PeriodicEnergyMeasured = 1 { + optional EnergyMeasurementStruct energyImported = 0; + optional EnergyMeasurementStruct energyExported = 1; + } + + readonly attribute MeasurementAccuracyStruct accuracy = 0; + readonly attribute optional nullable EnergyMeasurementStruct cumulativeEnergyImported = 1; + readonly attribute optional nullable EnergyMeasurementStruct cumulativeEnergyExported = 2; + readonly attribute optional nullable EnergyMeasurementStruct periodicEnergyImported = 3; + readonly attribute optional nullable EnergyMeasurementStruct periodicEnergyExported = 4; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + /** This cluster allows a client to manage the power draw of a device. An example of such a client could be an Energy Management System (EMS) which controls an Energy Smart Appliance (ESA). */ provisional cluster DeviceEnergyManagement = 152 { revision 3; @@ -1288,6 +1367,107 @@ provisional cluster EnergyEvse = 153 { timed command ClearTargets(): DefaultSuccess = 7; } +/** Attributes and commands for selecting a mode from a list of supported options. */ +provisional cluster EnergyEvseMode = 157 { + revision 1; + + enum ModeTag : enum16 { + kManual = 16384; + kTimeOfUse = 16385; + kSolarCharging = 16386; + } + + bitmap Feature : bitmap32 { + kOnOff = 0x1; + } + + struct ModeTagStruct { + optional vendor_id mfgCode = 0; + enum16 value = 1; + } + + struct ModeOptionStruct { + char_string<64> label = 0; + int8u mode = 1; + ModeTagStruct modeTags[] = 2; + } + + readonly attribute ModeOptionStruct supportedModes[] = 0; + readonly attribute int8u currentMode = 1; + attribute optional nullable int8u startUpMode = 2; + attribute optional nullable int8u onMode = 3; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ChangeToModeRequest { + int8u newMode = 0; + } + + response struct ChangeToModeResponse = 1 { + enum8 status = 0; + optional char_string<64> statusText = 1; + } + + /** This command is used to change device modes. + On receipt of this command the device SHALL respond with a ChangeToModeResponse command. */ + command ChangeToMode(ChangeToModeRequest): ChangeToModeResponse = 0; +} + +/** Attributes and commands for selecting a mode from a list of supported options. */ +provisional cluster DeviceEnergyManagementMode = 159 { + revision 1; + + enum ModeTag : enum16 { + kNoOptimization = 16384; + kDeviceOptimization = 16385; + kLocalOptimization = 16386; + kGridOptimization = 16387; + } + + bitmap Feature : bitmap32 { + kOnOff = 0x1; + } + + struct ModeTagStruct { + optional vendor_id mfgCode = 0; + enum16 value = 1; + } + + struct ModeOptionStruct { + char_string<64> label = 0; + int8u mode = 1; + ModeTagStruct modeTags[] = 2; + } + + readonly attribute ModeOptionStruct supportedModes[] = 0; + readonly attribute int8u currentMode = 1; + attribute optional nullable int8u startUpMode = 2; + attribute optional nullable int8u onMode = 3; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct ChangeToModeRequest { + int8u newMode = 0; + } + + response struct ChangeToModeResponse = 1 { + enum8 status = 0; + optional char_string<64> statusText = 1; + } + + /** This command is used to change device modes. + On receipt of this command the device SHALL respond with a ChangeToModeResponse command. */ + command ChangeToMode(ChangeToModeRequest): ChangeToModeResponse = 0; +} + endpoint 0 { device type ma_rootdevice = 22, version 1; @@ -1301,7 +1481,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1493,10 +1673,22 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } + server cluster ElectricalEnergyMeasurement { + emits event CumulativeEnergyMeasured; + callback attribute accuracy; + callback attribute cumulativeEnergyImported; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + ram attribute featureMap default = 5; + ram attribute clusterRevision default = 1; + } + server cluster DeviceEnergyManagement { emits event PowerAdjustStart; emits event PowerAdjustEnd; @@ -1573,6 +1765,34 @@ endpoint 1 { handle command GetTargets; handle command ClearTargets; } + + server cluster EnergyEvseMode { + callback attribute supportedModes; + callback attribute currentMode; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + callback attribute featureMap; + ram attribute clusterRevision default = 1; + + handle command ChangeToMode; + handle command ChangeToModeResponse; + } + + server cluster DeviceEnergyManagementMode { + callback attribute supportedModes; + callback attribute currentMode; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + callback attribute featureMap; + ram attribute clusterRevision default = 1; + + handle command ChangeToMode; + handle command ChangeToModeResponse; + } } 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 59bfa1efb8a6c0..0e1f15b808317d 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 @@ -203,10 +203,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2490,10 +2490,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2517,6 +2517,154 @@ } ] }, + { + "name": "Electrical Energy Measurement", + "code": 145, + "mfgCode": null, + "define": "ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER", + "side": "server", + "enabled": 1, + "apiMaturity": "provisional", + "attributes": [ + { + "name": "Accuracy", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "MeasurementAccuracyStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CumulativeEnergyImported", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "EnergyMeasurementStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "CumulativeEnergyMeasured", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, { "name": "Device Energy Management", "code": 152, @@ -3432,6 +3580,320 @@ "included": 1 } ] + }, + { + "name": "Energy EVSE Mode", + "code": 157, + "mfgCode": null, + "define": "ENERGY_EVSE_MODE_CLUSTER", + "side": "server", + "enabled": 1, + "apiMaturity": "provisional", + "commands": [ + { + "name": "ChangeToMode", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ChangeToModeResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "SupportedModes", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentMode", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Device Energy Management Mode", + "code": 159, + "mfgCode": null, + "define": "DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER", + "side": "server", + "enabled": 1, + "apiMaturity": "provisional", + "commands": [ + { + "name": "ChangeToMode", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ChangeToModeResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "SupportedModes", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CurrentMode", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] } ] } diff --git a/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h b/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h index df757f7374e672..f1c3eac6f60dc9 100644 --- a/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h +++ b/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h @@ -60,6 +60,56 @@ class EVSEManufacturer */ static void ApplicationCallbackHandler(const EVSECbInfo * cb, intptr_t arg); + /** + * @brief Allows a client application to send in power readings into the system + * + * @param[in] aEndpointId - Endpoint to send to EPM Cluster + * @param[in] aActivePower_mW - Power measured in milli-watts + * @param[in] aVoltage_mV - Voltage measured in milli-volts + * @param[in] aCurrent_mA - Current measured in milli-amps + */ + CHIP_ERROR SendPowerReading(EndpointId aEndpointId, int64_t aActivePower_mW, int64_t aVoltage_mV, int64_t aCurrent_mA); + + /** + * @brief Allows a client application to send in energy readings into the system + * + * This is a helper function to add timestamps to the readings + * + * @param[in] aCumulativeEnergyImported -total energy imported in milli-watthours + * @param[in] aCumulativeEnergyExported -total energy exported in milli-watthours + */ + CHIP_ERROR SendEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, int64_t aCumulativeEnergyExported); + + /** Fake Meter data generation - used for testing EPM/EEM clusters */ + /** + * @brief Starts a fake load/generator to periodically callback the power and energy + * clusters. + * @param[in] aEndpointId - which endpoint is the meter to be updated on + * @param[in] aPower_mW - the mean power of the load + * Positive power indicates Imported energy (e.g. a load) + * Negative power indicated Exported energy (e.g. a generator) + * @param[in] aPowerRandomness_mW This is used to scale random power fluctuations around the mean power of the load + * + * @param[in] aInterval_s - the callback interval in seconds + * @param[in] bReset - boolean: true will reset the energy values to 0 + */ + void StartFakeReadings(EndpointId aEndpointId, int64_t aPower_mW, uint32_t aPowerRandomness_mW, uint8_t aInterval_s, + bool bReset); + + /** + * @brief Stops any active updates to the fake load data callbacks + */ + void StopFakeReadings(); + + /** + * @brief Sends fake meter data into the cluster and restarts the timer + */ + void FakeReadingsUpdate(); + /** + * @brief Timer expiry callback to handle fake load + */ + static void FakeReadingsTimerExpiry(System::Layer * systemLayer, void * manufacturer); + private: EnergyEvseManager * mInstance; diff --git a/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h b/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h index 558f7c13df2766..e6f5c8c324d91e 100644 --- a/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h +++ b/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h @@ -26,6 +26,14 @@ #include using chip::Protocols::InteractionModel::Status; + +/** + * @brief Helper function to get current timestamp in Epoch format + * + * @param chipEpoch reference to hold return timestamp + */ +CHIP_ERROR GetEpochTS(uint32_t & chipEpoch); + namespace chip { namespace app { namespace Clusters { diff --git a/examples/energy-management-app/energy-management-common/include/device-energy-management-modes.h b/examples/energy-management-app/energy-management-common/include/device-energy-management-modes.h new file mode 100644 index 00000000000000..75d1a66fcb0f37 --- /dev/null +++ b/examples/energy-management-app/energy-management-common/include/device-energy-management-modes.h @@ -0,0 +1,95 @@ +/* + * + * 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 +#include + +namespace chip { +namespace app { +namespace Clusters { + +namespace DeviceEnergyManagementMode { + +constexpr uint8_t kModeNoOptimization = 0; +constexpr uint8_t kModeDeviceOnlyOptimization = 1; +constexpr uint8_t kModeDeviceAndLocalOptimization = 2; +constexpr uint8_t kModeDeviceAndGridOptimization = 3; +constexpr uint8_t kModeAllOptimization = 4; + +/// This is an application level delegate to handle DeviceEnergyManagement modes. +class DeviceEnergyManagementModeDelegate : public ModeBase::Delegate +{ +private: + using ModeTagStructType = detail::Structs::ModeTagStruct::Type; + ModeTagStructType ModeTagsNoOptimization[1] = { { .value = to_underlying(ModeTag::kNoOptimization) } }; + ModeTagStructType ModeTagsDeviceOnlyOptimization[1] = { { .value = to_underlying(ModeTag::kDeviceOptimization) } }; + ModeTagStructType ModeTagsDeviceAndLocalOptimization[2] = { { .value = to_underlying(ModeTag::kLocalOptimization) }, + { .value = to_underlying(ModeTag::kDeviceOptimization) } }; + ModeTagStructType ModeTagsDeviceAndGridOptimization[2] = { { .value = to_underlying(ModeTag::kDeviceOptimization) }, + { .value = to_underlying(ModeTag::kGridOptimization) } }; + ModeTagStructType ModeTagsAllOptimization[3] = { { .value = to_underlying(ModeTag::kLocalOptimization) }, + { .value = to_underlying(ModeTag::kDeviceOptimization) }, + { .value = to_underlying(ModeTag::kGridOptimization) } }; + + const detail::Structs::ModeOptionStruct::Type kModeOptions[5] = { + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("No energy management (forecast only)"), + .mode = kModeNoOptimization, + .modeTags = DataModel::List(ModeTagsNoOptimization) }, + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Device optimizes (no local or grid control)"), + .mode = kModeDeviceOnlyOptimization, + .modeTags = + DataModel::List(ModeTagsDeviceOnlyOptimization) }, + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Optimized within building"), + .mode = kModeDeviceAndLocalOptimization, + .modeTags = + DataModel::List(ModeTagsDeviceAndLocalOptimization) }, + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Optimized for grid"), + .mode = kModeDeviceAndGridOptimization, + .modeTags = + DataModel::List(ModeTagsDeviceAndGridOptimization) }, + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Optimized for grid and building"), + .mode = kModeAllOptimization, + .modeTags = DataModel::List(ModeTagsAllOptimization) }, + + }; + + CHIP_ERROR Init() override; + void HandleChangeToMode(uint8_t mode, ModeBase::Commands::ChangeToModeResponse::Type & response) override; + + CHIP_ERROR GetModeLabelByIndex(uint8_t modeIndex, MutableCharSpan & label) override; + CHIP_ERROR GetModeValueByIndex(uint8_t modeIndex, uint8_t & value) override; + CHIP_ERROR GetModeTagsByIndex(uint8_t modeIndex, DataModel::List & tags) override; + +public: + ~DeviceEnergyManagementModeDelegate() override = default; +}; + +ModeBase::Instance * Instance(); + +void Shutdown(); + +} // namespace DeviceEnergyManagementMode + +} // namespace Clusters +} // namespace app +} // namespace chip diff --git a/examples/energy-management-app/energy-management-common/include/energy-evse-modes.h b/examples/energy-management-app/energy-management-common/include/energy-evse-modes.h new file mode 100644 index 00000000000000..97189b0069fa81 --- /dev/null +++ b/examples/energy-management-app/energy-management-common/include/energy-evse-modes.h @@ -0,0 +1,87 @@ +/* + * + * 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 +#include + +namespace chip { +namespace app { +namespace Clusters { + +namespace EnergyEvseMode { + +constexpr uint8_t kModeManual = 0; +constexpr uint8_t kModeTimeOfUse = 1; +constexpr uint8_t kModeSolarCharging = 2; +constexpr uint8_t kModeTimeOfUseAndSolarCharging = 3; + +/// This is an application level delegate to handle EnergyEvse modes. +class EnergyEvseModeDelegate : public ModeBase::Delegate +{ +private: + using ModeTagStructType = detail::Structs::ModeTagStruct::Type; + ModeTagStructType ModeTagsManual[1] = { { .value = to_underlying(ModeTag::kManual) } }; + ModeTagStructType ModeTagsTimeOfUse[1] = { { .value = to_underlying(ModeTag::kTimeOfUse) } }; + ModeTagStructType ModeTagsSolarCharging[1] = { { .value = to_underlying(ModeTag::kSolarCharging) } }; + ModeTagStructType ModeTagsTimeOfUseAndSolarCharging[2] = { + { .value = to_underlying(ModeTag::kTimeOfUse) }, + { .value = to_underlying(ModeTag::kSolarCharging) }, + }; + + const detail::Structs::ModeOptionStruct::Type kModeOptions[4] = { + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Manual"), + .mode = kModeManual, + .modeTags = DataModel::List(ModeTagsManual) }, + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Auto-scheduled"), + .mode = kModeTimeOfUse, + .modeTags = DataModel::List(ModeTagsTimeOfUse) }, + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Solar"), + .mode = kModeSolarCharging, + .modeTags = DataModel::List(ModeTagsSolarCharging) }, + detail::Structs::ModeOptionStruct::Type{ .label = CharSpan::fromCharString("Auto-scheduled with Solar charging"), + .mode = kModeTimeOfUseAndSolarCharging, + .modeTags = + DataModel::List(ModeTagsTimeOfUseAndSolarCharging) }, + + }; + + CHIP_ERROR Init() override; + void HandleChangeToMode(uint8_t mode, ModeBase::Commands::ChangeToModeResponse::Type & response) override; + + CHIP_ERROR GetModeLabelByIndex(uint8_t modeIndex, MutableCharSpan & label) override; + CHIP_ERROR GetModeValueByIndex(uint8_t modeIndex, uint8_t & value) override; + CHIP_ERROR GetModeTagsByIndex(uint8_t modeIndex, DataModel::List & tags) override; + +public: + ~EnergyEvseModeDelegate() override = default; +}; + +ModeBase::Instance * Instance(); + +void Shutdown(); + +} // namespace EnergyEvseMode + +} // namespace Clusters +} // namespace app +} // namespace chip diff --git a/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp b/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp index fe51c9da664b6d..0f204671a9feca 100644 --- a/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp +++ b/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp @@ -18,12 +18,16 @@ #include #include -#include +#include +#include +#include using namespace chip; using namespace chip::app; using namespace chip::app::Clusters; using namespace chip::app::Clusters::EnergyEvse; +using namespace chip::app::Clusters::ElectricalEnergyMeasurement; +using namespace chip::app::Clusters::ElectricalEnergyMeasurement::Structs; CHIP_ERROR EVSEManufacturer::Init() { @@ -89,6 +93,179 @@ CHIP_ERROR EVSEManufacturer::Shutdown() return CHIP_NO_ERROR; } +/** + * @brief Allows a client application to send in power readings into the system + * + * @param[in] aEndpointId - Endpoint to send to EPM Cluster + * @param[in] aActivePower_mW - Power measured in milli-watts + * @param[in] aVoltage_mV - Voltage measured in milli-volts + * @param[in] aCurrent_mA - Current measured in milli-amps + */ +CHIP_ERROR EVSEManufacturer::SendPowerReading(EndpointId aEndpointId, int64_t aActivePower_mW, int64_t aVoltage_mV, + int64_t aCurrent_mA) +{ + // TODO add Power Readings when EPM cluster is merged + + return CHIP_NO_ERROR; +} + +/** + * @brief Allows a client application to send in energy readings into the system + * + * This is a helper function to add timestamps to the readings + * + * @param[in] aCumulativeEnergyImported -total energy imported in milli-watthours + * @param[in] aCumulativeEnergyExported -total energy exported in milli-watthours + */ +CHIP_ERROR EVSEManufacturer::SendEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, + int64_t aCumulativeEnergyExported) +{ + MeasurementData * data = MeasurementDataForEndpoint(aEndpointId); + + EnergyMeasurementStruct::Type energyImported; + EnergyMeasurementStruct::Type energyExported; + + // Get current timestamp + uint32_t currentTimestamp; + CHIP_ERROR err = GetEpochTS(currentTimestamp); + if (err != CHIP_NO_ERROR) + { + ChipLogError(AppServer, "GetEpochTS returned error getting timestamp"); + return err; + } + + /** IMPORT */ + // Copy last endTimestamp into new startTimestamp if it exists + energyImported.startTimestamp.ClearValue(); + if (data->cumulativeImported.HasValue()) + { + energyImported.startTimestamp = data->cumulativeImported.Value().endTimestamp; + } + + energyImported.endTimestamp.SetValue(currentTimestamp); + energyImported.energy = aCumulativeEnergyImported; + + /** EXPORT */ + // Copy last endTimestamp into new startTimestamp if it exists + energyExported.startTimestamp.ClearValue(); + if (data->cumulativeExported.HasValue()) + { + energyExported.startTimestamp = data->cumulativeExported.Value().endTimestamp; + } + energyExported.endTimestamp.SetValue(currentTimestamp); + energyExported.energy = aCumulativeEnergyExported; + + // call the SDK to update attributes and generate an event + if (!NotifyCumulativeEnergyMeasured(aEndpointId, MakeOptional(energyImported), MakeOptional(energyExported))) + { + ChipLogError(AppServer, "Failed to notify Cumulative Energy reading."); + return CHIP_ERROR_INTERNAL; + } + + return CHIP_NO_ERROR; +} + +struct FakeReadingsData +{ + bool bEnabled; /* If enabled then the timer callback will re-trigger */ + EndpointId mEndpointId; /* Which endpoint the meter is on */ + uint8_t mInterval_s; /* Interval in seconds to callback */ + int64_t mPower_mW; /* Power on the load in mW (signed value) +ve = imported */ + uint32_t mPowerRandomness_mW; /* The amount to randomize the Power on the load in mW */ + /* These energy values can only be positive values. + * however the underlying energy type (power_mWh) is signed, so keeping with that convention */ + int64_t mTotalEnergyImported = 0; /* Energy Imported which is updated if mPower > 0 */ + int64_t mTotalEnergyExported = 0; /* Energy Imported which is updated if mPower < 0 */ +}; + +static FakeReadingsData gFakeReadingsData; + +/* This helper routine starts and handles a callback */ +/** + * @brief Starts a fake load/generator to periodically callback the power and energy + * clusters. + * @param[in] aEndpointId - which endpoint is the meter to be updated on + * @param[in] aPower_mW - the mean power of the load + * Positive power indicates Imported energy (e.g. a load) + * Negative power indicated Exported energy (e.g. a generator) + * @param[in] aPowerRandomness_mW This is used to define the std.dev of the + * random power values around the mean power of the load + * + * @param[in] aInterval_s - the callback interval in seconds + * @param[in] bReset - boolean: true will reset the energy values to 0 + */ +void EVSEManufacturer::StartFakeReadings(EndpointId aEndpointId, int64_t aPower_mW, uint32_t aPowerRandomness_mW, + uint8_t aInterval_s, bool bReset) +{ + gFakeReadingsData.bEnabled = true; + gFakeReadingsData.mEndpointId = aEndpointId; + gFakeReadingsData.mPower_mW = aPower_mW; + gFakeReadingsData.mPowerRandomness_mW = aPowerRandomness_mW; + gFakeReadingsData.mInterval_s = aInterval_s; + + if (bReset) + { + gFakeReadingsData.mTotalEnergyImported = 0; + gFakeReadingsData.mTotalEnergyExported = 0; + } + + // Call update function to kick off regular readings + FakeReadingsUpdate(); +} +/** + * @brief Stops any active updates to the fake load data callbacks + */ +void EVSEManufacturer::StopFakeReadings() +{ + gFakeReadingsData.bEnabled = false; +} +/** + * @brief Sends fake meter data into the cluster and restarts the timer + */ +void EVSEManufacturer::FakeReadingsUpdate() +{ + /* Check to see if the fake Load is still running - don't send updates if the timer was already cancelled */ + if (!gFakeReadingsData.bEnabled) + { + return; + } + + // Update meter values + // Avoid using floats - so we will do a basic rand() call which will generate a integer value between 0 and RAND_MAX + // first compute power as a mean + some random value in range 0 to mPowerRandomness_mW + int64_t power = (rand() % gFakeReadingsData.mPowerRandomness_mW); + power += gFakeReadingsData.mPower_mW; // add in the base power + + // TODO call the EPM cluster to send a power reading + + // update the energy meter - we'll assume that the power has been constant during the previous interval + if (gFakeReadingsData.mPower_mW > 0) + { + // Positive power - means power is imported + gFakeReadingsData.mTotalEnergyImported += ((power * gFakeReadingsData.mInterval_s) / 3600); + } + else + { + // Negative power - means power is exported, but the cumulative energy is positive + gFakeReadingsData.mTotalEnergyExported += ((-power * gFakeReadingsData.mInterval_s) / 3600); + } + + SendEnergyReading(gFakeReadingsData.mEndpointId, gFakeReadingsData.mTotalEnergyImported, + gFakeReadingsData.mTotalEnergyExported); + + // start/restart the timer + DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds32(gFakeReadingsData.mInterval_s), FakeReadingsTimerExpiry, this); +} +/** + * @brief Timer expiry callback to handle fake load + */ +void EVSEManufacturer::FakeReadingsTimerExpiry(System::Layer * systemLayer, void * manufacturer) +{ + EVSEManufacturer * mn = reinterpret_cast(manufacturer); + + mn->FakeReadingsUpdate(); +} + /** * @brief Main Callback handler - to be implemented by Manufacturer * @@ -231,6 +408,37 @@ void SetTestEventTrigger_EVSEDiagnosticsComplete() dg->HwDiagnosticsComplete(); } +void SetTestEventTrigger_FakeReadingsLoadStart() +{ + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); + + int64_t aPower_mW = 1'000'000; // Fake load 1000 W + uint32_t aPowerRandomness_mW = 20'000; // randomness 20W + uint8_t aInterval_s = 2; // 2s updates + bool bReset = true; + mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aInterval_s, bReset); +} + +void SetTestEventTrigger_FakeReadingsGeneratorStart() +{ + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); + + int64_t aPower_mW = -3'000'000; // Fake Generator -3000 W + uint32_t aPowerRandomness_mW = 20'000; // randomness 20W + uint8_t aInterval_s = 5; // 5s updates + bool bReset = true; + mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aInterval_s, bReset); +} + +void SetTestEventTrigger_FakeReadingsStop() +{ + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); + mn->StopFakeReadings(); +} + bool HandleEnergyEvseTestEventTrigger(uint64_t eventTrigger) { EnergyEvseTrigger trigger = static_cast(eventTrigger); @@ -284,3 +492,29 @@ bool HandleEnergyEvseTestEventTrigger(uint64_t eventTrigger) return true; } + +bool HandleEnergyReportingTestEventTrigger(uint64_t eventTrigger) +{ + EnergyReportingTrigger trigger = static_cast(eventTrigger); + + switch (trigger) + { + case EnergyReportingTrigger::kFakeReadingsStop: + ChipLogProgress(Support, "[EnergyReporting-Test-Event] => Stop Fake load"); + SetTestEventTrigger_FakeReadingsStop(); + break; + case EnergyReportingTrigger::kFakeReadingsLoadStart_1kW_2s: + ChipLogProgress(Support, "[EnergyReporting-Test-Event] => Start Fake load 1kW @2s Import"); + SetTestEventTrigger_FakeReadingsLoadStart(); + break; + case EnergyReportingTrigger::kFakeReadingsGenStart_3kW_5s: + ChipLogProgress(Support, "[EnergyReporting-Test-Event] => Start Fake generator 3kW @5s Export"); + SetTestEventTrigger_FakeReadingsGeneratorStart(); + break; + + default: + return false; + } + + return true; +} diff --git a/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp b/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp index 710b13f9d342b8..24643885d54368 100644 --- a/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp +++ b/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp @@ -27,7 +27,12 @@ CHIP_ERROR EnergyEvseManager::LoadPersistentAttributes() { SafeAttributePersistenceProvider * aProvider = GetSafeAttributePersistenceProvider(); - EndpointId aEndpointId = mDelegate->GetEndpointId(); + if (aProvider == nullptr) + { + ChipLogError(AppServer, "GetSafeAttributePersistenceProvider returned NULL"); + return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE; + } + EndpointId aEndpointId = mDelegate->GetEndpointId(); CHIP_ERROR err; // Restore ChargingEnabledUntil value diff --git a/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp b/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp new file mode 100644 index 00000000000000..9f79f78ee653d5 --- /dev/null +++ b/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp @@ -0,0 +1,100 @@ +/* + * + * 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. + */ + +#include +#include + +using namespace chip::app::Clusters; +using namespace chip::app::Clusters::DeviceEnergyManagementMode; +using chip::Protocols::InteractionModel::Status; +template +using List = chip::app::DataModel::List; +using ModeTagStructType = chip::app::Clusters::detail::Structs::ModeTagStruct::Type; + +static std::unique_ptr gDeviceEnergyManagementModeDelegate; +static std::unique_ptr gDeviceEnergyManagementModeInstance; + +CHIP_ERROR DeviceEnergyManagementModeDelegate::Init() +{ + return CHIP_NO_ERROR; +} + +void DeviceEnergyManagementModeDelegate::HandleChangeToMode(uint8_t NewMode, + ModeBase::Commands::ChangeToModeResponse::Type & response) +{ + response.status = to_underlying(ModeBase::StatusCode::kSuccess); +} + +CHIP_ERROR DeviceEnergyManagementModeDelegate::GetModeLabelByIndex(uint8_t modeIndex, chip::MutableCharSpan & label) +{ + if (modeIndex >= ArraySize(kModeOptions)) + { + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + } + return chip::CopyCharSpanToMutableCharSpan(kModeOptions[modeIndex].label, label); +} + +CHIP_ERROR DeviceEnergyManagementModeDelegate::GetModeValueByIndex(uint8_t modeIndex, uint8_t & value) +{ + if (modeIndex >= ArraySize(kModeOptions)) + { + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + } + value = kModeOptions[modeIndex].mode; + return CHIP_NO_ERROR; +} + +CHIP_ERROR DeviceEnergyManagementModeDelegate::GetModeTagsByIndex(uint8_t modeIndex, List & tags) +{ + if (modeIndex >= ArraySize(kModeOptions)) + { + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + } + + if (tags.size() < kModeOptions[modeIndex].modeTags.size()) + { + return CHIP_ERROR_INVALID_ARGUMENT; + } + + std::copy(kModeOptions[modeIndex].modeTags.begin(), kModeOptions[modeIndex].modeTags.end(), tags.begin()); + tags.reduce_size(kModeOptions[modeIndex].modeTags.size()); + + return CHIP_NO_ERROR; +} + +ModeBase::Instance * DeviceEnergyManagementMode::Instance() +{ + return gDeviceEnergyManagementModeInstance.get(); +} + +void DeviceEnergyManagementMode::Shutdown() +{ + gDeviceEnergyManagementModeInstance.reset(); + gDeviceEnergyManagementModeDelegate.reset(); +} + +void emberAfDeviceEnergyManagementModeClusterInitCallback(chip::EndpointId endpointId) +{ + VerifyOrDie(endpointId == 1); // this cluster is only enabled for endpoint 1. + VerifyOrDie(!gDeviceEnergyManagementModeDelegate && !gDeviceEnergyManagementModeInstance); + gDeviceEnergyManagementModeDelegate = std::make_unique(); + gDeviceEnergyManagementModeInstance = + std::make_unique(gDeviceEnergyManagementModeDelegate.get(), 0x1, DeviceEnergyManagementMode::Id, + chip::to_underlying(DeviceEnergyManagementMode::Feature::kOnOff)); + gDeviceEnergyManagementModeInstance->Init(); +} diff --git a/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp b/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp new file mode 100644 index 00000000000000..0d413682d20f84 --- /dev/null +++ b/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp @@ -0,0 +1,97 @@ +/* + * + * 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. + */ + +#include +#include + +using namespace chip::app::Clusters; +using namespace chip::app::Clusters::EnergyEvseMode; +using chip::Protocols::InteractionModel::Status; +template +using List = chip::app::DataModel::List; +using ModeTagStructType = chip::app::Clusters::detail::Structs::ModeTagStruct::Type; + +static std::unique_ptr gEnergyEvseModeDelegate; +static std::unique_ptr gEnergyEvseModeInstance; + +CHIP_ERROR EnergyEvseModeDelegate::Init() +{ + return CHIP_NO_ERROR; +} + +void EnergyEvseModeDelegate::HandleChangeToMode(uint8_t NewMode, ModeBase::Commands::ChangeToModeResponse::Type & response) +{ + response.status = to_underlying(ModeBase::StatusCode::kSuccess); +} + +CHIP_ERROR EnergyEvseModeDelegate::GetModeLabelByIndex(uint8_t modeIndex, chip::MutableCharSpan & label) +{ + if (modeIndex >= ArraySize(kModeOptions)) + { + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + } + return chip::CopyCharSpanToMutableCharSpan(kModeOptions[modeIndex].label, label); +} + +CHIP_ERROR EnergyEvseModeDelegate::GetModeValueByIndex(uint8_t modeIndex, uint8_t & value) +{ + if (modeIndex >= ArraySize(kModeOptions)) + { + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + } + value = kModeOptions[modeIndex].mode; + return CHIP_NO_ERROR; +} + +CHIP_ERROR EnergyEvseModeDelegate::GetModeTagsByIndex(uint8_t modeIndex, List & tags) +{ + if (modeIndex >= ArraySize(kModeOptions)) + { + return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED; + } + + if (tags.size() < kModeOptions[modeIndex].modeTags.size()) + { + return CHIP_ERROR_INVALID_ARGUMENT; + } + + std::copy(kModeOptions[modeIndex].modeTags.begin(), kModeOptions[modeIndex].modeTags.end(), tags.begin()); + tags.reduce_size(kModeOptions[modeIndex].modeTags.size()); + + return CHIP_NO_ERROR; +} + +ModeBase::Instance * EnergyEvseMode::Instance() +{ + return gEnergyEvseModeInstance.get(); +} + +void EnergyEvseMode::Shutdown() +{ + gEnergyEvseModeInstance.reset(); + gEnergyEvseModeDelegate.reset(); +} + +void emberAfEnergyEvseModeClusterInitCallback(chip::EndpointId endpointId) +{ + VerifyOrDie(!gEnergyEvseModeDelegate && !gEnergyEvseModeInstance); + gEnergyEvseModeDelegate = std::make_unique(); + gEnergyEvseModeInstance = std::make_unique(gEnergyEvseModeDelegate.get(), 0x1, EnergyEvseMode::Id, + chip::to_underlying(EnergyEvseMode::Feature::kOnOff)); + gEnergyEvseModeInstance->Init(); +} diff --git a/examples/energy-management-app/esp32/main/CMakeLists.txt b/examples/energy-management-app/esp32/main/CMakeLists.txt index 1c7f2a5b782948..edba8f9671d1bc 100644 --- a/examples/energy-management-app/esp32/main/CMakeLists.txt +++ b/examples/energy-management-app/esp32/main/CMakeLists.txt @@ -50,6 +50,7 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/time-format-localization-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/barrier-control-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/energy-evse-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/device-energy-management-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/network-commissioning" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/occupancy-sensor-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/operational-credentials-server" @@ -63,6 +64,8 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ota-requestor" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/groups-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/group-key-mgmt-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/mode-base-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/electrical-energy-measurement-server" ) set(PRIV_REQUIRES_LIST chip QRCode bt led_strip app_update openthread driver nvs_flash spi_flash) diff --git a/examples/energy-management-app/esp32/main/main.cpp b/examples/energy-management-app/esp32/main/main.cpp index 77899a45b58d03..2e7e43f730a025 100644 --- a/examples/energy-management-app/esp32/main/main.cpp +++ b/examples/energy-management-app/esp32/main/main.cpp @@ -16,9 +16,12 @@ */ #include "DeviceCallbacks.h" +#include #include #include #include +#include +#include #include "esp_log.h" #include @@ -74,9 +77,11 @@ using namespace ::chip::Credentials; using namespace ::chip::DeviceManager; using namespace ::chip::DeviceLayer; -static EnergyEvseDelegate * gDelegate = nullptr; -static EnergyEvseManager * gInstance = nullptr; -static EVSEManufacturer * gEvseManufacturer = nullptr; +static std::unique_ptr gEvseDelegate; +static std::unique_ptr gEvseInstance; +static std::unique_ptr gDEMDelegate; +static std::unique_ptr gDEMInstance; +static std::unique_ptr gEvseManufacturer; #if CONFIG_ENABLE_ESP_INSIGHTS_TRACE extern const char insights_auth_key_start[] asm("_binary_insights_auth_key_txt_start"); @@ -116,44 +121,237 @@ chip::Credentials::DeviceAttestationCredentialsProvider * get_dac_provider(void) } // namespace -void ApplicationInit() +EVSEManufacturer * EnergyEvse::GetEvseManufacturer() +{ + return gEvseManufacturer.get(); +} + +/* + * @brief Creates a Delegate and Instance for DEM + * + * The Instance is a container around the Delegate, so + * create the Delegate first, then wrap it in the Instance + * Then call the Instance->Init() to register the attribute and command handlers + */ +CHIP_ERROR DeviceEnergyManagementInit() +{ + if (gDEMDelegate || gDEMInstance) + { + ESP_LOGE(TAG, "DEM Instance or Delegate already exist."); + return CHIP_ERROR_INCORRECT_STATE; + } + + gDEMDelegate = std::make_unique(); + if (!gDEMDelegate) + { + ESP_LOGE(TAG, "Failed to allocate memory for DeviceEnergyManagementDelegate"); + return CHIP_ERROR_NO_MEMORY; + } + + /* Manufacturer may optionally not support all features, commands & attributes */ + gDEMInstance = std::make_unique( + EndpointId(ENERGY_EVSE_ENDPOINT), *gDEMDelegate, + BitMask( + DeviceEnergyManagement::Feature::kPowerAdjustment, DeviceEnergyManagement::Feature::kPowerForecastReporting, + DeviceEnergyManagement::Feature::kStateForecastReporting, DeviceEnergyManagement::Feature::kStartTimeAdjustment, + DeviceEnergyManagement::Feature::kPausable)); + + if (!gDEMInstance) + { + ESP_LOGE(TAG, "Failed to allocate memory for DeviceEnergyManagementManager"); + gDEMDelegate.reset(); + return CHIP_ERROR_NO_MEMORY; + } + + CHIP_ERROR err = gDEMInstance->Init(); /* Register Attribute & Command handlers */ + if (err != CHIP_NO_ERROR) + { + ESP_LOGE(TAG, "Init failed on gDEMInstance, err:%" CHIP_ERROR_FORMAT, err.Format()); + gDEMInstance.reset(); + gDEMDelegate.reset(); + return err; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DeviceEnergyManagementShutdown() { - if ((gDelegate == nullptr) && (gInstance == nullptr) && (gEvseManufacturer == nullptr)) + /* Do this in the order Instance first, then delegate + * Ensure we call the Instance->Shutdown to free attribute & command handlers first + */ + if (gDEMInstance) { - gDelegate = new EnergyEvseDelegate(); - if (gDelegate != nullptr) - { - gInstance = new EnergyEvseManager( - EndpointId(ENERGY_EVSE_ENDPOINT), *gDelegate, - BitMask(EnergyEvse::Feature::kChargingPreferences, - EnergyEvse::Feature::kPlugAndCharge, EnergyEvse::Feature::kRfid, - EnergyEvse::Feature::kSoCReporting, EnergyEvse::Feature::kV2x), - BitMask(OptionalAttributes::kSupportsUserMaximumChargingCurrent, - OptionalAttributes::kSupportsRandomizationWindow, - OptionalAttributes::kSupportsApproximateEvEfficiency), - BitMask(OptionalCommands::kSupportsStartDiagnostics)); - gInstance->Init(); /* Register Attribute & Command handlers */ - } + /* deregister attribute & command handlers */ + gDEMInstance->Shutdown(); + gDEMInstance.reset(); } - else + if (gDEMDelegate) { - ChipLogError(AppServer, "EVSE Instance or Delegate already exist.") + gDEMDelegate.reset(); } + return CHIP_NO_ERROR; +} + +/* + * @brief Creates a Delegate and Instance for EVSE cluster + * + * The Instance is a container around the Delegate, so + * create the Delegate first, then wrap it in the Instance + * Then call the Instance->Init() to register the attribute and command handlers + */ +CHIP_ERROR EnergyEvseInit() +{ + CHIP_ERROR err; - if (gEvseManufacturer == nullptr) + if (gEvseDelegate || gEvseInstance) { - gEvseManufacturer = new EVSEManufacturer(); - gEvseManufacturer->Init(gInstance); + ESP_LOGE(TAG, "EVSE Instance or Delegate already exist."); + return CHIP_ERROR_INCORRECT_STATE; } - else + + gEvseDelegate = std::make_unique(); + if (!gEvseDelegate) + { + ESP_LOGE(TAG, "Failed to allocate memory for EnergyEvseDelegate"); + return CHIP_ERROR_NO_MEMORY; + } + + /* Manufacturer may optionally not support all features, commands & attributes */ + gEvseInstance = std::make_unique( + EndpointId(ENERGY_EVSE_ENDPOINT), *gEvseDelegate, + BitMask(EnergyEvse::Feature::kChargingPreferences, EnergyEvse::Feature::kPlugAndCharge, + EnergyEvse::Feature::kRfid, EnergyEvse::Feature::kSoCReporting, + EnergyEvse::Feature::kV2x), + BitMask(EnergyEvse::OptionalAttributes::kSupportsUserMaximumChargingCurrent, + EnergyEvse::OptionalAttributes::kSupportsRandomizationWindow, + EnergyEvse::OptionalAttributes::kSupportsApproximateEvEfficiency), + BitMask(EnergyEvse::OptionalCommands::kSupportsStartDiagnostics)); + + if (!gEvseInstance) { - ChipLogError(AppServer, "EVSEManufacturer already exists.") + ESP_LOGE(TAG, "Failed to allocate memory for EnergyEvseManager"); + gEvseDelegate.reset(); + return CHIP_ERROR_NO_MEMORY; } + + err = gEvseInstance->Init(); /* Register Attribute & Command handlers */ + if (err != CHIP_NO_ERROR) + { + ESP_LOGE(TAG, "Init failed on gEvseInstance, err:%" CHIP_ERROR_FORMAT, err.Format()); + gEvseInstance.reset(); + gEvseDelegate.reset(); + return err; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR EnergyEvseShutdown() +{ + /* Do this in the order Instance first, then delegate + * Ensure we call the Instance->Shutdown to free attribute & command handlers first + */ + if (gEvseInstance) + { + /* deregister attribute & command handlers */ + gEvseInstance->Shutdown(); + gEvseInstance.reset(); + } + + if (gEvseDelegate) + { + gEvseDelegate.reset(); + } + + return CHIP_NO_ERROR; +} + +/* + * @brief Creates a EVSEManufacturer class to hold the EVSE & DEM clusters + * + * The Instance is a container around the Delegate, so + * create the Delegate first, then wrap it in the Instance + * Then call the Instance->Init() to register the attribute and command handlers + */ +CHIP_ERROR EVSEManufacturerInit() +{ + CHIP_ERROR err; + + if (gEvseManufacturer) + { + ESP_LOGE(TAG, "EvseManufacturer already exist."); + return CHIP_ERROR_INCORRECT_STATE; + } + + /* Now create EVSEManufacturer */ + gEvseManufacturer = std::make_unique(gEvseInstance.get()); + if (!gEvseManufacturer) + { + ESP_LOGE(TAG, "Failed to allocate memory for EvseManufacturer"); + return CHIP_ERROR_NO_MEMORY; + } + + /* Call Manufacturer specific init */ + err = gEvseManufacturer->Init(); + if (err != CHIP_NO_ERROR) + { + ESP_LOGE(TAG, "Init failed on gEvseManufacturer, err:%" CHIP_ERROR_FORMAT, err.Format()); + gEvseManufacturer.reset(); + return err; + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR EVSEManufacturerShutdown() +{ + if (gEvseManufacturer) + { + /* Shutdown the EVSEManufacturer */ + gEvseManufacturer->Shutdown(); + gEvseManufacturer.reset(); + } + + return CHIP_NO_ERROR; +} + +void ApplicationInit() +{ + if (DeviceEnergyManagementInit() != CHIP_NO_ERROR) + { + return; + } + + if (EnergyEvseInit() != CHIP_NO_ERROR) + { + DeviceEnergyManagementShutdown(); + return; + } + + if (EVSEManufacturerInit() != CHIP_NO_ERROR) + { + DeviceEnergyManagementShutdown(); + EnergyEvseShutdown(); + return; + } +} + +void ApplicationShutdown() +{ + ESP_LOGD(TAG, "Energy Management App: ApplicationShutdown()"); + + /* Shutdown in reverse order that they were created */ + EVSEManufacturerShutdown(); /* Free the EVSEManufacturer */ + EnergyEvseShutdown(); /* Free the EnergyEvse */ + DeviceEnergyManagementShutdown(); /* Free the DEM */ + + Clusters::DeviceEnergyManagementMode::Shutdown(); + Clusters::EnergyEvseMode::Shutdown(); } static void InitServer(intptr_t context) { - ApplicationInit(); // Print QR Code URL PrintOnboardingCodes(chip::RendezvousInformationFlags(CONFIG_RENDEZVOUS_MODE)); @@ -175,6 +373,9 @@ static void InitServer(intptr_t context) static Tracing::Insights::ESP32Backend backend; Tracing::Register(backend); #endif + + // Application code should always be initialised after the initialisation of server. + ApplicationInit(); } extern "C" void app_main() diff --git a/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c6 b/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c6 index 4947bd2fdf276f..104777a72bb735 100644 --- a/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c6 +++ b/examples/energy-management-app/esp32/sdkconfig.defaults.esp32c6 @@ -19,13 +19,13 @@ CONFIG_BT_ENABLED=y CONFIG_BT_NIMBLE_ENABLED=y CONFIG_BT_NIMBLE_EXT_ADV=n CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 -CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=n +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=y # Disable OpenThread CONFIG_OPENTHREAD_ENABLED=n # Disable lwip ipv6 autoconfig -CONFIG_LWIP_IPV6_AUTOCONFIG=n +CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y diff --git a/examples/energy-management-app/linux/BUILD.gn b/examples/energy-management-app/linux/BUILD.gn index 8fb53878129c60..11919a4e8c12a3 100644 --- a/examples/energy-management-app/linux/BUILD.gn +++ b/examples/energy-management-app/linux/BUILD.gn @@ -42,6 +42,8 @@ executable("chip-energy-management-app") { "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseDelegateImpl.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyEvseManager.cpp", "${chip_root}/examples/energy-management-app/energy-management-common/src/EnergyManagementManager.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/device-energy-management-mode.cpp", + "${chip_root}/examples/energy-management-app/energy-management-common/src/energy-evse-mode.cpp", "include/CHIPProjectAppConfig.h", "main.cpp", ] @@ -84,7 +86,7 @@ executable("chip-energy-management-app") { ] deps += [ - "$dir_pw_hdlc:pw_rpc", + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_log", "$dir_pw_rpc:server", diff --git a/examples/energy-management-app/linux/README.md b/examples/energy-management-app/linux/README.md index d316dd807c13e2..424ef46d58e259 100644 --- a/examples/energy-management-app/linux/README.md +++ b/examples/energy-management-app/linux/README.md @@ -366,7 +366,7 @@ If you haven't implemented a real EVSE but want to simulate plugging in an EV then you can use a few of the test event triggers to simulate these scenarios. The test event triggers values can be found in: -[EnergyEvseTestEventTriggerDelegate.h](../../../src/app/clusters/energy-evse-server/EnergyEvseTestEventTriggerDelegate.h) +[EnergyEvseTestEventTriggerHandler.h](../../../src/app/clusters/energy-evse-server/EnergyEvseTestEventTriggerHandler.h) - 0x0099000000000000 - Simulates the EVSE being installed on a 32A supply - 0x0099000000000002 - Simulates the EVSE being plugged in (this should diff --git a/examples/energy-management-app/linux/args.gni b/examples/energy-management-app/linux/args.gni index b7c71c3097a680..e1000e6cb3fa27 100644 --- a/examples/energy-management-app/linux/args.gni +++ b/examples/energy-management-app/linux/args.gni @@ -30,3 +30,4 @@ matter_enable_tracing_support = true chip_enable_read_client = false chip_enable_energy_evse_trigger = true +chip_enable_energy_reporting_trigger = true diff --git a/examples/energy-management-app/linux/main.cpp b/examples/energy-management-app/linux/main.cpp index df544484975f4f..a150b82c4bb171 100644 --- a/examples/energy-management-app/linux/main.cpp +++ b/examples/energy-management-app/linux/main.cpp @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include @@ -75,8 +77,7 @@ CHIP_ERROR DeviceEnergyManagementInit() BitMask( DeviceEnergyManagement::Feature::kPowerAdjustment, DeviceEnergyManagement::Feature::kPowerForecastReporting, DeviceEnergyManagement::Feature::kStateForecastReporting, DeviceEnergyManagement::Feature::kStartTimeAdjustment, - DeviceEnergyManagement::Feature::kPausable, DeviceEnergyManagement::Feature::kForecastAdjustment, - DeviceEnergyManagement::Feature::kConstraintBasedAdjustment)); + DeviceEnergyManagement::Feature::kPausable)); if (!gDEMInstance) { @@ -207,7 +208,6 @@ CHIP_ERROR EVSEManufacturerInit() } /* Now create EVSEManufacturer */ - // TODO this takes just the EVSE Instance for now, but will need the DEM adding gEvseManufacturer = std::make_unique(gEvseInstance.get()); if (!gEvseManufacturer) { @@ -268,6 +268,9 @@ void ApplicationShutdown() EVSEManufacturerShutdown(); /* Free the EVSEManufacturer */ EnergyEvseShutdown(); /* Free the EnergyEvse */ DeviceEnergyManagementShutdown(); /* Free the DEM */ + + Clusters::DeviceEnergyManagementMode::Shutdown(); + Clusters::EnergyEvseMode::Shutdown(); } int main(int argc, char * argv[]) diff --git a/examples/light-switch-app/infineon/cyw30739/src/main.cpp b/examples/light-switch-app/infineon/cyw30739/src/main.cpp index dbfdb81b875b3f..483a475b51cee0 100644 --- a/examples/light-switch-app/infineon/cyw30739/src/main.cpp +++ b/examples/light-switch-app/infineon/cyw30739/src/main.cpp @@ -26,8 +26,9 @@ #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR #include #endif +#include #include -#include +#include #include #include #include @@ -192,10 +193,13 @@ void InitApp(intptr_t args) // Print QR Code URL PrintOnboardingCodes(chip::RendezvousInformationFlag(chip::RendezvousInformationFlag::kBLE)); /* Start CHIP datamodel server */ - static chip::OTATestEventTriggerDelegate testEventTriggerDelegate{ chip::ByteSpan(sTestEventTriggerEnableKey) }; + static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; gExampleDeviceInfoProvider.SetStorageDelegate(initParams.persistentStorageDelegate); chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); chip::Inet::EndPointStateOpenThread::OpenThreadEndpointInitParam nativeParams; diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.matter b/examples/light-switch-app/light-switch-common/light-switch-app.matter index 6aed1fec4b48ad..2a5819e69cf915 100644 --- a/examples/light-switch-app/light-switch-common/light-switch-app.matter +++ b/examples/light-switch-app/light-switch-common/light-switch-app.matter @@ -1959,9 +1959,6 @@ cluster IcdManagement = 70 { fabric_idx fabricIndex = 254; } - critical event OnTransitionToActiveMode = 0 { - } - readonly attribute int32u idleModeDuration = 0; readonly attribute int32u activeModeDuration = 1; readonly attribute int16u activeModeThreshold = 2; @@ -2008,7 +2005,7 @@ cluster IcdManagement = 70 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -2016,13 +2013,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -2044,14 +2034,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -2062,7 +2047,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -2082,7 +2067,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -2121,7 +2106,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -2135,34 +2120,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -2171,7 +2128,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -2191,12 +2148,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** Attributes and commands for controlling the color properties of a color-capable light. */ @@ -2529,7 +2482,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2942,7 +2895,7 @@ endpoint 1 { callback attribute clientList; callback attribute partsList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2977,7 +2930,7 @@ endpoint 2 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 43b138430d6eb9..58f5c72eb4578a 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 @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5027,10 +5027,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5697,10 +5697,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/light-switch-app/nrfconnect/main/AppTask.cpp b/examples/light-switch-app/nrfconnect/main/AppTask.cpp index a4b5ac5b47b318..06ac797f6a6899 100644 --- a/examples/light-switch-app/nrfconnect/main/AppTask.cpp +++ b/examples/light-switch-app/nrfconnect/main/AppTask.cpp @@ -24,8 +24,9 @@ #include "LightSwitch.h" #include +#include #include -#include +#include #include #include #include @@ -215,9 +216,12 @@ CHIP_ERROR AppTask::Init() #endif static CommonCaseDeviceServerInitParams initParams; - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams)); AppFabricTableDelegate::Init(); diff --git a/examples/light-switch-app/qpg/BUILD.gn b/examples/light-switch-app/qpg/BUILD.gn index a5488d27b33dbc..055cfd46f95abb 100644 --- a/examples/light-switch-app/qpg/BUILD.gn +++ b/examples/light-switch-app/qpg/BUILD.gn @@ -51,7 +51,7 @@ qpg_executable("light_switch_app") { output_name = "chip-${qpg_target_ic}-light-switch-example.out" sources = [ - "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerDelegate.cpp", + "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerHandler.cpp", "${examples_plat_dir}/app/main.cpp", "${examples_plat_dir}/ota/ota.cpp", "src/AppTask.cpp", @@ -102,6 +102,7 @@ qpg_executable("light_switch_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/qpg/lib/pw_rpc:pw_rpc", diff --git a/examples/light-switch-app/qpg/include/CHIPProjectConfig.h b/examples/light-switch-app/qpg/include/CHIPProjectConfig.h index 0cce04bad354c0..b6d7572839ec75 100644 --- a/examples/light-switch-app/qpg/include/CHIPProjectConfig.h +++ b/examples/light-switch-app/qpg/include/CHIPProjectConfig.h @@ -119,3 +119,9 @@ #ifndef CHIP_DEVICE_CONFIG_THREAD_FTD #define CHIP_DEVICE_CONFIG_THREAD_FTD 0 #endif + +#define CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC 1800 +#define CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS 10000 +#define CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS 5000 +#define CHIP_DEVICE_CONFIG_ICD_SLOW_POLL_INTERVAL chip::System::Clock::Milliseconds32(5000) +#define CHIP_DEVICE_CONFIG_ICD_FAST_POLL_INTERVAL chip::System::Clock::Milliseconds32(500) diff --git a/examples/light-switch-app/qpg/src/AppTask.cpp b/examples/light-switch-app/qpg/src/AppTask.cpp index 9f6662206f2e74..f02823b178220d 100644 --- a/examples/light-switch-app/qpg/src/AppTask.cpp +++ b/examples/light-switch-app/qpg/src/AppTask.cpp @@ -31,7 +31,8 @@ using namespace ::chip; #include -#include +#include +#include #include #include #include @@ -191,10 +192,13 @@ void AppTask::InitServer(intptr_t arg) nativeParams.openThreadInstancePtr = chip::DeviceLayer::ThreadStackMgrImpl().OTInstance(); initParams.endpointNativeParams = static_cast(&nativeParams); - // Use GenericFaultTestEventTriggerDelegate to inject faults - static GenericFaultTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + // Use GenericFaultTestEventTriggerHandler to inject faults + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static GenericFaultTestEventTriggerHandler sFaultTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sFaultTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; chip::Server::GetInstance().Init(initParams); diff --git a/examples/light-switch-app/qpg/zap/switch.matter b/examples/light-switch-app/qpg/zap/switch.matter index a25b24bd846a9d..035913b5487922 100644 --- a/examples/light-switch-app/qpg/zap/switch.matter +++ b/examples/light-switch-app/qpg/zap/switch.matter @@ -250,6 +250,131 @@ cluster OnOff = 6 { command OnWithTimedOff(OnWithTimedOffRequest): DefaultSuccess = 66; } +/** Attributes and commands for controlling devices that can be set to a level between fully 'On' and fully 'Off.' */ +cluster LevelControl = 8 { + revision 5; + + enum MoveModeEnum : enum8 { + kUp = 0; + kDown = 1; + } + + enum StepModeEnum : enum8 { + kUp = 0; + kDown = 1; + } + + bitmap Feature : bitmap32 { + kOnOff = 0x1; + kLighting = 0x2; + kFrequency = 0x4; + } + + bitmap OptionsBitmap : bitmap8 { + kExecuteIfOff = 0x1; + kCoupleColorTempToLevel = 0x2; + } + + readonly attribute nullable int8u currentLevel = 0; + readonly attribute optional int16u remainingTime = 1; + readonly attribute optional int8u minLevel = 2; + readonly attribute optional int8u maxLevel = 3; + readonly attribute optional int16u currentFrequency = 4; + readonly attribute optional int16u minFrequency = 5; + readonly attribute optional int16u maxFrequency = 6; + attribute OptionsBitmap options = 15; + attribute optional int16u onOffTransitionTime = 16; + attribute nullable int8u onLevel = 17; + attribute optional nullable int16u onTransitionTime = 18; + attribute optional nullable int16u offTransitionTime = 19; + attribute optional nullable int8u defaultMoveRate = 20; + attribute access(write: manage) optional nullable int8u startUpCurrentLevel = 16384; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct MoveToLevelRequest { + int8u level = 0; + nullable int16u transitionTime = 1; + OptionsBitmap optionsMask = 2; + OptionsBitmap optionsOverride = 3; + } + + request struct MoveRequest { + MoveModeEnum moveMode = 0; + nullable int8u rate = 1; + OptionsBitmap optionsMask = 2; + OptionsBitmap optionsOverride = 3; + } + + request struct StepRequest { + StepModeEnum stepMode = 0; + int8u stepSize = 1; + nullable int16u transitionTime = 2; + OptionsBitmap optionsMask = 3; + OptionsBitmap optionsOverride = 4; + } + + request struct StopRequest { + OptionsBitmap optionsMask = 0; + OptionsBitmap optionsOverride = 1; + } + + request struct MoveToLevelWithOnOffRequest { + int8u level = 0; + nullable int16u transitionTime = 1; + OptionsBitmap optionsMask = 2; + OptionsBitmap optionsOverride = 3; + } + + request struct MoveWithOnOffRequest { + MoveModeEnum moveMode = 0; + nullable int8u rate = 1; + OptionsBitmap optionsMask = 2; + OptionsBitmap optionsOverride = 3; + } + + request struct StepWithOnOffRequest { + StepModeEnum stepMode = 0; + int8u stepSize = 1; + nullable int16u transitionTime = 2; + OptionsBitmap optionsMask = 3; + OptionsBitmap optionsOverride = 4; + } + + request struct StopWithOnOffRequest { + OptionsBitmap optionsMask = 0; + OptionsBitmap optionsOverride = 1; + } + + request struct MoveToClosestFrequencyRequest { + int16u frequency = 0; + } + + /** Command description for MoveToLevel */ + command MoveToLevel(MoveToLevelRequest): DefaultSuccess = 0; + /** Command description for Move */ + command Move(MoveRequest): DefaultSuccess = 1; + /** Command description for Step */ + command Step(StepRequest): DefaultSuccess = 2; + /** Command description for Stop */ + command Stop(StopRequest): DefaultSuccess = 3; + /** Command description for MoveToLevelWithOnOff */ + command MoveToLevelWithOnOff(MoveToLevelWithOnOffRequest): DefaultSuccess = 4; + /** Command description for MoveWithOnOff */ + command MoveWithOnOff(MoveWithOnOffRequest): DefaultSuccess = 5; + /** Command description for StepWithOnOff */ + command StepWithOnOff(StepWithOnOffRequest): DefaultSuccess = 6; + /** Command description for StopWithOnOff */ + command StopWithOnOff(StopWithOnOffRequest): DefaultSuccess = 7; + /** Change the currrent frequency to the provided one, or a close + approximation if the exact provided one is not possible. */ + command MoveToClosestFrequency(MoveToClosestFrequencyRequest): DefaultSuccess = 8; +} + /** The Descriptor Cluster is meant to replace the support from the Zigbee Device Object (ZDO) for describing a node, its endpoints and clusters. */ cluster Descriptor = 29 { revision 2; @@ -1631,9 +1756,6 @@ cluster IcdManagement = 70 { fabric_idx fabricIndex = 254; } - critical event OnTransitionToActiveMode = 0 { - } - readonly attribute int32u idleModeDuration = 0; readonly attribute int32u activeModeDuration = 1; readonly attribute int16u activeModeThreshold = 2; @@ -1678,6 +1800,155 @@ cluster IcdManagement = 70 { command access(invoke: manage) StayActiveRequest(): StayActiveResponse = 3; } +/** Attributes and commands for scene configuration and manipulation. */ +provisional cluster ScenesManagement = 98 { + revision 1; + + bitmap CopyModeBitmap : bitmap8 { + kCopyAllScenes = 0x1; + } + + bitmap Feature : bitmap32 { + kSceneNames = 0x1; + } + + struct AttributeValuePair { + attrib_id attributeID = 0; + int32u attributeValue = 1; + } + + struct ExtensionFieldSet { + cluster_id clusterID = 0; + AttributeValuePair attributeValueList[] = 1; + } + + fabric_scoped struct SceneInfoStruct { + int8u sceneCount = 0; + fabric_sensitive int8u currentScene = 1; + fabric_sensitive group_id currentGroup = 2; + fabric_sensitive boolean sceneValid = 3; + int8u remainingCapacity = 4; + fabric_idx fabricIndex = 254; + } + + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; + + request struct AddSceneRequest { + group_id groupID = 0; + int8u sceneID = 1; + int32u transitionTime = 2; + char_string sceneName = 3; + ExtensionFieldSet extensionFieldSets[] = 4; + } + + response struct AddSceneResponse = 0 { + status status = 0; + group_id groupID = 1; + int8u sceneID = 2; + } + + request struct ViewSceneRequest { + group_id groupID = 0; + int8u sceneID = 1; + } + + response struct ViewSceneResponse = 1 { + status status = 0; + group_id groupID = 1; + int8u sceneID = 2; + optional int32u transitionTime = 3; + optional char_string sceneName = 4; + optional ExtensionFieldSet extensionFieldSets[] = 5; + } + + request struct RemoveSceneRequest { + group_id groupID = 0; + int8u sceneID = 1; + } + + response struct RemoveSceneResponse = 2 { + status status = 0; + group_id groupID = 1; + int8u sceneID = 2; + } + + request struct RemoveAllScenesRequest { + group_id groupID = 0; + } + + response struct RemoveAllScenesResponse = 3 { + status status = 0; + group_id groupID = 1; + } + + request struct StoreSceneRequest { + group_id groupID = 0; + int8u sceneID = 1; + } + + response struct StoreSceneResponse = 4 { + status status = 0; + group_id groupID = 1; + int8u sceneID = 2; + } + + request struct RecallSceneRequest { + group_id groupID = 0; + int8u sceneID = 1; + optional nullable int32u transitionTime = 2; + } + + request struct GetSceneMembershipRequest { + group_id groupID = 0; + } + + response struct GetSceneMembershipResponse = 6 { + status status = 0; + nullable int8u capacity = 1; + group_id groupID = 2; + optional int8u sceneList[] = 3; + } + + request struct CopySceneRequest { + CopyModeBitmap mode = 0; + group_id groupIdentifierFrom = 1; + int8u sceneIdentifierFrom = 2; + group_id groupIdentifierTo = 3; + int8u sceneIdentifierTo = 4; + } + + response struct CopySceneResponse = 64 { + status status = 0; + group_id groupIdentifierFrom = 1; + int8u sceneIdentifierFrom = 2; + } + + /** Add a scene to the scene table. Extension field sets are supported, and are inputed as '{"ClusterID": VALUE, "AttributeValueList":[{"AttributeId": VALUE, "AttributeValue": VALUE}]}' */ + fabric command access(invoke: manage) AddScene(AddSceneRequest): AddSceneResponse = 0; + /** Retrieves the requested scene entry from its Scene table. */ + fabric command ViewScene(ViewSceneRequest): ViewSceneResponse = 1; + /** Removes the requested scene entry, corresponding to the value of the GroupID field, from its Scene Table */ + fabric command access(invoke: manage) RemoveScene(RemoveSceneRequest): RemoveSceneResponse = 2; + /** Remove all scenes, corresponding to the value of the GroupID field, from its Scene Table */ + fabric command access(invoke: manage) RemoveAllScenes(RemoveAllScenesRequest): RemoveAllScenesResponse = 3; + /** Adds the scene entry into its Scene Table along with all extension field sets corresponding to the current state of other clusters on the same endpoint */ + fabric command access(invoke: manage) StoreScene(StoreSceneRequest): StoreSceneResponse = 4; + /** Set the attributes and corresponding state for each other cluster implemented on the endpoint accordingly to the resquested scene entry in the Scene Table */ + fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; + /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ + fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; + /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; +} + /** Attributes and commands for controlling the color properties of a color-capable light. */ cluster ColorControl = 768 { revision 6; @@ -2008,16 +2279,14 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + callback attribute featureMap; callback attribute clusterRevision; } - server cluster Binding { - callback attribute binding; - ram attribute featureMap default = 0; - ram attribute clusterRevision default = 1; - } - server cluster AccessControl { emits event AccessControlEntryChanged; emits event AccessControlExtensionChanged; @@ -2026,6 +2295,9 @@ endpoint 0 { callback attribute subjectsPerAccessControlEntry; callback attribute targetsPerAccessControlEntry; callback attribute accessControlEntriesPerFabric; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; ram attribute featureMap default = 0; callback attribute clusterRevision; @@ -2040,7 +2312,7 @@ endpoint 0 { callback attribute vendorID; callback attribute productName; callback attribute productID; - persist attribute nodeLabel; + ram attribute nodeLabel; callback attribute location; callback attribute hardwareVersion; callback attribute hardwareVersionString; @@ -2051,11 +2323,15 @@ endpoint 0 { callback attribute productURL; callback attribute productLabel; callback attribute serialNumber; - persist attribute localConfigDisabled default = 0; + ram attribute localConfigDisabled default = 0; callback attribute uniqueID; callback attribute capabilityMinima; callback attribute specificationVersion; callback attribute maxPathsPerInvoke; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 3; } @@ -2065,9 +2341,13 @@ endpoint 0 { emits event VersionApplied; emits event DownloadError; callback attribute defaultOTAProviders; - ram attribute updatePossible default = 1; + ram attribute updatePossible default = true; ram attribute updateState default = 0; ram attribute updateStateProgress default = 0; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; @@ -2080,6 +2360,10 @@ endpoint 0 { callback attribute regulatoryConfig; callback attribute locationCapability; callback attribute supportsConcurrentConnection; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; @@ -2100,6 +2384,10 @@ endpoint 0 { ram attribute lastNetworkingStatus; ram attribute lastNetworkID; ram attribute lastConnectErrorValue; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 2; ram attribute clusterRevision default = 1; @@ -2114,6 +2402,10 @@ endpoint 0 { } server cluster DiagnosticLogs { + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; @@ -2122,21 +2414,26 @@ endpoint 0 { } server cluster GeneralDiagnostics { + emits event HardwareFaultChange; + emits event RadioFaultChange; + emits event NetworkFaultChange; emits event BootReason; callback attribute networkInterfaces; callback attribute rebootCount; callback attribute upTime; - callback attribute totalOperationalHours; callback attribute bootReason; callback attribute activeHardwareFaults; callback attribute activeRadioFaults; callback attribute activeNetworkFaults; - callback attribute testEventTriggersEnabled default = false; + ram attribute testEventTriggersEnabled default = 0; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; - ram attribute clusterRevision default = 0x0002; + ram attribute clusterRevision default = 2; handle command TestEventTrigger; - handle command TimeSnapshot; } server cluster SoftwareDiagnostics { @@ -2144,6 +2441,10 @@ endpoint 0 { callback attribute currentHeapFree; callback attribute currentHeapUsed; callback attribute currentHeapHighWatermark; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; callback attribute featureMap; ram attribute clusterRevision default = 1; @@ -2211,6 +2512,10 @@ endpoint 0 { callback attribute channelPage0Mask; callback attribute operationalDatasetComponents; callback attribute activeNetworkFaultsList; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0x000F; ram attribute clusterRevision default = 1; @@ -2221,7 +2526,11 @@ endpoint 0 { callback attribute windowStatus; callback attribute adminFabricIndex; callback attribute adminVendorId; - ram attribute featureMap default = 0; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + ram attribute featureMap default = 1; ram attribute clusterRevision default = 1; handle command OpenCommissioningWindow; @@ -2236,6 +2545,10 @@ endpoint 0 { callback attribute commissionedFabrics; callback attribute trustedRootCertificates; callback attribute currentFabricIndex; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; @@ -2258,6 +2571,10 @@ endpoint 0 { callback attribute groupTable; callback attribute maxGroupsPerFabric; callback attribute maxGroupKeysPerFabric; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; callback attribute featureMap; callback attribute clusterRevision; @@ -2271,12 +2588,20 @@ endpoint 0 { server cluster FixedLabel { callback attribute labelList; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; } server cluster UserLabel { callback attribute labelList; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; } @@ -2285,20 +2610,42 @@ endpoint 0 { callback attribute idleModeDuration; callback attribute activeModeDuration; callback attribute activeModeThreshold; - ram attribute featureMap default = 0x0000; + callback attribute registeredClients; + callback attribute ICDCounter; + callback attribute clientsSupportedPerFabric; + ram attribute userActiveModeTriggerHint default = 0x100; + ram attribute userActiveModeTriggerInstruction default = "Reset the application"; + ram attribute operatingMode default = 1; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + ram attribute featureMap default = 0x0007; ram attribute clusterRevision default = 2; + + handle command RegisterClient; + handle command RegisterClientResponse; + handle command UnregisterClient; + handle command StayActiveRequest; + handle command StayActiveResponse; } } endpoint 1 { - device type ma_onofflightswitch = 259, version 1; + device type ma_colordimmerswitch = 261, version 1; binding cluster Identify; + binding cluster Groups; binding cluster OnOff; + binding cluster LevelControl; + binding cluster ScenesManagement; binding cluster ColorControl; server cluster Identify { - ram attribute identifyTime default = 0x0000; - ram attribute identifyType default = 0x0; + ram attribute identifyTime default = 0x0; + ram attribute identifyType default = 0x00; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 4; @@ -2307,35 +2654,25 @@ endpoint 1 { handle command TriggerEffect; } - server cluster Groups { - ram attribute nameSupport; - ram attribute featureMap default = 0; - ram attribute clusterRevision default = 4; - - handle command AddGroup; - handle command AddGroupResponse; - handle command ViewGroup; - handle command ViewGroupResponse; - handle command GetGroupMembership; - handle command GetGroupMembershipResponse; - handle command RemoveGroup; - handle command RemoveGroupResponse; - handle command RemoveAllGroups; - handle command AddGroupIfIdentifying; - } - server cluster Descriptor { callback attribute deviceTypeList; callback attribute serverList; callback attribute clientList; callback attribute partsList; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } server cluster Binding { callback attribute binding; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; ram attribute featureMap default = 0; ram attribute clusterRevision default = 1; } @@ -2346,12 +2683,13 @@ endpoint 2 { server cluster Identify { ram attribute identifyTime default = 0x0; - ram attribute identifyType default = 0x0; + ram attribute identifyType default = 0x00; callback attribute generatedCommandList; callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; ram attribute featureMap default = 0; - ram attribute clusterRevision default = 2; + ram attribute clusterRevision default = 4; handle command Identify; handle command TriggerEffect; @@ -2364,19 +2702,20 @@ endpoint 2 { callback attribute partsList; callback attribute generatedCommandList; callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } server cluster Switch { - emits event InitialPress; ram attribute numberOfPositions default = 2; ram attribute currentPosition default = 0; callback attribute generatedCommandList; callback attribute acceptedCommandList; + callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 2; + ram attribute featureMap default = 1; ram attribute clusterRevision default = 1; } } diff --git a/examples/light-switch-app/qpg/zap/switch.zap b/examples/light-switch-app/qpg/zap/switch.zap index 862f852508b306..c38a138daeb2a5 100644 --- a/examples/light-switch-app/qpg/zap/switch.zap +++ b/examples/light-switch-app/qpg/zap/switch.zap @@ -13,7 +13,7 @@ }, { "key": "manufacturerCodes", - "value": "0x1002" + "value": "0x10D0" } ], "package": [ @@ -133,27 +133,27 @@ "reportableChange": 0 }, { - "name": "FeatureMap", - "code": 65532, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", - "type": "bitmap32", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "ClusterRevision", - "code": 65533, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", - "type": "int16u", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -163,20 +163,26 @@ "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 - } - ] - }, - { - "name": "Binding", - "code": 30, - "mfgCode": null, - "define": "BINDING_CLUSTER", - "side": "server", - "enabled": 1, - "attributes": [ + }, { - "name": "Binding", - "code": 0, + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, "mfgCode": null, "side": "server", "type": "array", @@ -197,10 +203,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -213,10 +219,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -312,6 +318,54 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "AttributeList", "code": 65531, @@ -398,8 +452,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -414,8 +468,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -430,8 +484,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -446,8 +500,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -462,8 +516,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -473,13 +527,13 @@ "side": "server", "type": "char_string", "included": 1, - "storageOption": "NVM", + "storageOption": "RAM", "singleton": 1, "bounded": 0, "defaultValue": "", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -494,8 +548,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -510,8 +564,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -526,8 +580,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -542,8 +596,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -558,8 +612,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -574,8 +628,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -590,8 +644,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -606,8 +660,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -622,8 +676,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -638,8 +692,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -649,13 +703,13 @@ "side": "server", "type": "boolean", "included": 1, - "storageOption": "NVM", + "storageOption": "RAM", "singleton": 1, "bounded": 0, "defaultValue": "0", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -670,8 +724,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -682,7 +736,7 @@ "type": "CapabilityMinimaStruct", "included": 1, "storageOption": "External", - "singleton": 0, + "singleton": 1, "bounded": 0, "defaultValue": null, "reportable": 1, @@ -722,6 +776,70 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "GeneratedCommandList", + "code": 65528, + "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": "AcceptedCommandList", + "code": 65529, + "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": "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, + "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": "FeatureMap", "code": 65532, @@ -730,7 +848,7 @@ "type": "bitmap32", "included": 1, "storageOption": "RAM", - "singleton": 0, + "singleton": 1, "bounded": 0, "defaultValue": "0", "reportable": 1, @@ -750,8 +868,8 @@ "bounded": 0, "defaultValue": "3", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ], @@ -830,19 +948,35 @@ ], "attributes": [ { - "name": "ClusterRevision", - "code": 65533, + "name": "FeatureMap", + "code": 65532, "mfgCode": null, "side": "client", - "type": "int16u", + "type": "bitmap32", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": "0", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -891,10 +1025,10 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": "true", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -909,8 +1043,8 @@ "bounded": 0, "defaultValue": "0", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -929,6 +1063,70 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, @@ -957,8 +1155,8 @@ "bounded": 0, "defaultValue": "1", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ], @@ -1056,8 +1254,8 @@ "bounded": 0, "defaultValue": "0x0000000000000000", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1072,8 +1270,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1124,6 +1322,70 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, @@ -1152,8 +1414,8 @@ "bounded": 0, "defaultValue": "1", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -1360,6 +1622,70 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, @@ -1388,8 +1714,8 @@ "bounded": 0, "defaultValue": "1", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -1421,41 +1747,105 @@ ], "attributes": [ { - "name": "FeatureMap", - "code": 65532, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", - "type": "bitmap32", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "ClusterRevision", - "code": 65533, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", - "type": "int16u", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 - } - ] - }, - { - "name": "General Diagnostics", + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "General Diagnostics", "code": 51, "mfgCode": null, "define": "GENERAL_DIAGNOSTICS_CLUSTER", @@ -1469,14 +1859,6 @@ "source": "client", "isIncoming": 1, "isEnabled": 1 - }, - { - "name": "TimeSnapshot", - "code": 1, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 } ], "attributes": [ @@ -1492,8 +1874,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1508,8 +1890,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1529,11 +1911,11 @@ "reportableChange": 0 }, { - "name": "TotalOperationalHours", - "code": 3, + "name": "BootReason", + "code": 4, "mfgCode": null, "side": "server", - "type": "int32u", + "type": "BootReasonEnum", "included": 1, "storageOption": "External", "singleton": 0, @@ -1545,11 +1927,11 @@ "reportableChange": 0 }, { - "name": "BootReason", - "code": 4, + "name": "ActiveHardwareFaults", + "code": 5, "mfgCode": null, "side": "server", - "type": "BootReasonEnum", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -1561,8 +1943,8 @@ "reportableChange": 0 }, { - "name": "ActiveHardwareFaults", - "code": 5, + "name": "ActiveRadioFaults", + "code": 6, "mfgCode": null, "side": "server", "type": "array", @@ -1577,8 +1959,8 @@ "reportableChange": 0 }, { - "name": "ActiveRadioFaults", - "code": 6, + "name": "ActiveNetworkFaults", + "code": 7, "mfgCode": null, "side": "server", "type": "array", @@ -1593,8 +1975,24 @@ "reportableChange": 0 }, { - "name": "ActiveNetworkFaults", - "code": 7, + "name": "TestEventTriggersEnabled", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", "type": "array", @@ -1609,16 +2007,48 @@ "reportableChange": 0 }, { - "name": "TestEventTriggersEnabled", - "code": 8, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", - "type": "boolean", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "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": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "false", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -1650,14 +2080,35 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0x0002", + "defaultValue": "2", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ], "events": [ + { + "name": "HardwareFaultChange", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "RadioFaultChange", + "code": 1, + "mfgCode": null, + "side": "server", + "included": 1 + }, + { + "name": "NetworkFaultChange", + "code": 2, + "mfgCode": null, + "side": "server", + "included": 1 + }, { "name": "BootReason", "code": 3, @@ -1745,8 +2196,72 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1777,8 +2292,8 @@ "bounded": 0, "defaultValue": "1", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -1813,8 +2328,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1829,8 +2344,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1845,8 +2360,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1861,8 +2376,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1877,8 +2392,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1893,8 +2408,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1909,8 +2424,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1925,8 +2440,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1941,8 +2456,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1957,8 +2472,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1973,8 +2488,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -1989,8 +2504,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2005,8 +2520,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2021,8 +2536,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2037,8 +2552,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2053,8 +2568,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2069,8 +2584,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2085,8 +2600,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2101,8 +2616,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2117,8 +2632,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2133,8 +2648,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2149,8 +2664,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2165,8 +2680,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2181,8 +2696,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2197,8 +2712,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2213,8 +2728,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2229,8 +2744,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2245,8 +2760,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2261,8 +2776,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2277,8 +2792,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2293,8 +2808,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2309,8 +2824,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2325,8 +2840,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2341,8 +2856,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2357,8 +2872,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2373,8 +2888,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2389,8 +2904,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2405,8 +2920,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2421,8 +2936,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2437,8 +2952,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2453,8 +2968,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2469,8 +2984,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2485,8 +3000,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2501,8 +3016,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2517,8 +3032,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2533,8 +3048,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2549,8 +3064,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2565,8 +3080,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2581,8 +3096,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2597,8 +3112,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2613,8 +3128,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2629,8 +3144,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2645,8 +3160,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2661,8 +3176,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2677,8 +3192,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2693,8 +3208,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2709,8 +3224,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2725,8 +3240,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2741,8 +3256,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -2757,40 +3272,104 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { - "name": "FeatureMap", - "code": 65532, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", - "type": "bitmap32", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x000F", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "ClusterRevision", - "code": 65533, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", - "type": "int16u", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "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": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x000F", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -2877,6 +3456,70 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, @@ -2887,7 +3530,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2905,8 +3548,8 @@ "bounded": 0, "defaultValue": "1", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -3045,8 +3688,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -3061,8 +3704,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -3077,8 +3720,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -3093,8 +3736,8 @@ "bounded": 0, "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { @@ -3113,6 +3756,70 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "FeatureMap", "code": 65532, @@ -3141,8 +3848,8 @@ "bounded": 0, "defaultValue": "1", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -3270,11 +3977,11 @@ "reportableChange": 0 }, { - "name": "FeatureMap", - "code": 65532, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", - "type": "bitmap32", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -3286,11 +3993,11 @@ "reportableChange": 0 }, { - "name": "ClusterRevision", - "code": 65533, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", - "type": "int16u", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -3300,20 +4007,10 @@ "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 - } - ] - }, - { - "name": "Fixed Label", - "code": 64, - "mfgCode": null, - "define": "FIXED_LABEL_CLUSTER", - "side": "server", - "enabled": 1, - "attributes": [ + }, { - "name": "LabelList", - "code": 0, + "name": "EventList", + "code": 65530, "mfgCode": null, "side": "server", "type": "array", @@ -3328,32 +4025,48 @@ "reportableChange": 0 }, { - "name": "FeatureMap", - "code": 65532, + "name": "AttributeList", + "code": 65531, "mfgCode": null, "side": "server", - "type": "bitmap32", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "ClusterRevision", - "code": 65533, + "name": "FeatureMap", + "code": 65532, "mfgCode": null, "side": "server", - "type": "int16u", + "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3362,10 +4075,10 @@ ] }, { - "name": "User Label", - "code": 65, + "name": "Fixed Label", + "code": 64, "mfgCode": null, - "define": "USER_LABEL_CLUSTER", + "define": "FIXED_LABEL_CLUSTER", "side": "server", "enabled": 1, "attributes": [ @@ -3386,53 +4099,27 @@ "reportableChange": 0 }, { - "name": "FeatureMap", - "code": 65532, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", - "type": "bitmap32", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 }, { - "name": "ClusterRevision", - "code": 65533, - "mfgCode": null, - "side": "server", - "type": "int16u", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "1", - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - } - ] - }, - { - "name": "ICD Management", - "code": 70, - "mfgCode": null, - "define": "ICD_MANAGEMENT_CLUSTER", - "side": "server", - "enabled": 1, - "attributes": [ - { - "name": "IdleModeDuration", - "code": 0, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", - "type": "int32u", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -3444,11 +4131,11 @@ "reportableChange": 0 }, { - "name": "ActiveModeDuration", - "code": 1, + "name": "EventList", + "code": 65530, "mfgCode": null, "side": "server", - "type": "int32u", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -3460,11 +4147,11 @@ "reportableChange": 0 }, { - "name": "ActiveModeThreshold", - "code": 2, + "name": "AttributeList", + "code": 65531, "mfgCode": null, "side": "server", - "type": "int16u", + "type": "array", "included": 1, "storageOption": "External", "singleton": 0, @@ -3485,7 +4172,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": "0", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3501,122 +4188,81 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "2", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, "reportableChange": 0 } ] - } - ] - }, - { - "id": 2, - "name": "MA-onofflightswitch", - "deviceTypeRef": { - "code": 259, - "profileId": 259, - "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" - }, - "deviceTypes": [ - { - "code": 259, - "profileId": 259, - "label": "MA-onofflightswitch", - "name": "MA-onofflightswitch" - } - ], - "deviceVersions": [ - 1 - ], - "deviceIdentifiers": [ - 259 - ], - "deviceTypeName": "MA-onofflightswitch", - "deviceTypeCode": 259, - "deviceTypeProfileId": 259, - "clusters": [ + }, { - "name": "Identify", - "code": 3, + "name": "User Label", + "code": 65, "mfgCode": null, - "define": "IDENTIFY_CLUSTER", - "side": "client", + "define": "USER_LABEL_CLUSTER", + "side": "server", "enabled": 1, "attributes": [ { - "name": "ClusterRevision", - "code": 65533, + "name": "LabelList", + "code": 0, "mfgCode": null, - "side": "client", - "type": "int16u", + "side": "server", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 - } - ] - }, - { - "name": "Identify", - "code": 3, - "mfgCode": null, - "define": "IDENTIFY_CLUSTER", - "side": "server", - "enabled": 1, - "commands": [ - { - "name": "Identify", - "code": 0, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 }, { - "name": "TriggerEffect", - "code": 64, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - } - ], - "attributes": [ + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { - "name": "IdentifyTime", - "code": 0, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", - "type": "int16u", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0000", + "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 }, { - "name": "IdentifyType", - "code": 1, + "name": "EventList", + "code": 65530, "mfgCode": null, "side": "server", - "type": "IdentifyTypeEnum", + "type": "array", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0x0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3664,48 +4310,32 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "1", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] }, { - "name": "Groups", - "code": 4, + "name": "ICD Management", + "code": 70, "mfgCode": null, - "define": "GROUPS_CLUSTER", + "define": "ICD_MANAGEMENT_CLUSTER", "side": "server", "enabled": 1, "commands": [ { - "name": "AddGroup", - "code": 0, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "AddGroupResponse", + "name": "RegisterClient", "code": 0, "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, - { - "name": "ViewGroup", - "code": 1, - "mfgCode": null, "source": "client", "isIncoming": 1, "isEnabled": 1 }, { - "name": "ViewGroupResponse", + "name": "RegisterClientResponse", "code": 1, "mfgCode": null, "source": "server", @@ -3713,7 +4343,7 @@ "isEnabled": 1 }, { - "name": "GetGroupMembership", + "name": "UnregisterClient", "code": 2, "mfgCode": null, "source": "client", @@ -3721,15 +4351,7 @@ "isEnabled": 1 }, { - "name": "GetGroupMembershipResponse", - "code": 2, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, - { - "name": "RemoveGroup", + "name": "StayActiveRequest", "code": 3, "mfgCode": null, "source": "client", @@ -3737,52 +4359,597 @@ "isEnabled": 1 }, { - "name": "RemoveGroupResponse", - "code": 3, + "name": "StayActiveResponse", + "code": 4, "mfgCode": null, "source": "server", "isIncoming": 0, "isEnabled": 1 - }, - { - "name": "RemoveAllGroups", - "code": 4, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "AddGroupIfIdentifying", - "code": 5, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 } ], "attributes": [ { - "name": "NameSupport", + "name": "IdleModeDuration", "code": 0, "mfgCode": null, "side": "server", - "type": "NameSupportBitmap", + "type": "int32u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "", + "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveModeDuration", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ActiveModeThreshold", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "RegisteredClients", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ICDCounter", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int32u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClientsSupportedPerFabric", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UserActiveModeTriggerHint", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "UserActiveModeTriggerBitmap", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x100", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "UserActiveModeTriggerInstruction", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "Reset the application", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OperatingMode", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "OperatingModeEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0007", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "2", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + } + ] + }, + { + "id": 2, + "name": "MA-colordimmerswitch", + "deviceTypeRef": { + "code": 261, + "profileId": 259, + "label": "MA-colordimmerswitch", + "name": "MA-colordimmerswitch" + }, + "deviceTypes": [ + { + "code": 261, + "profileId": 259, + "label": "MA-colordimmerswitch", + "name": "MA-colordimmerswitch" + } + ], + "deviceVersions": [ + 1 + ], + "deviceIdentifiers": [ + 261 + ], + "deviceTypeName": "MA-colordimmerswitch", + "deviceTypeCode": 261, + "deviceTypeProfileId": 259, + "clusters": [ + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "Identify", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "TriggerEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "Identify", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "TriggerEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "IdentifyTime", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "IdentifyType", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "IdentifyTypeEnum", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "4", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Groups", + "code": 4, + "mfgCode": null, + "define": "GROUPS_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "AddGroup", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "AddGroupResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ViewGroup", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ViewGroupResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetGroupMembership", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetGroupMembershipResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveGroup", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveGroupResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveAllGroups", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 }, + { + "name": "AddGroupIfIdentifying", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ { "name": "FeatureMap", "code": 65532, "mfgCode": null, - "side": "server", + "side": "client", "type": "bitmap32", "included": 1, "storageOption": "RAM", @@ -3798,7 +4965,7 @@ "name": "ClusterRevision", "code": 65533, "mfgCode": null, - "side": "server", + "side": "client", "type": "int16u", "included": 1, "storageOption": "RAM", @@ -3806,9 +4973,9 @@ "bounded": 0, "defaultValue": "4", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": null } ] }, @@ -3820,44 +4987,298 @@ "side": "client", "enabled": 1, "commands": [ + { + "name": "Off", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "On", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, { "name": "Toggle", "code": 2, "mfgCode": null, - "source": "client", - "isIncoming": 0, - "isEnabled": 1 - } - ], - "attributes": [ + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "6", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Level Control", + "code": 8, + "mfgCode": null, + "define": "LEVEL_CONTROL_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "MoveToLevel", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Descriptor", + "code": 29, + "mfgCode": null, + "define": "DESCRIPTOR_CLUSTER", + "side": "server", + "enabled": 1, + "attributes": [ + { + "name": "DeviceTypeList", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ServerList", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClientList", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "PartsList", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, "mfgCode": null, - "side": "client", + "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": null, "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] }, { - "name": "Descriptor", - "code": 29, + "name": "Binding", + "code": 30, "mfgCode": null, - "define": "DESCRIPTOR_CLUSTER", + "define": "BINDING_CLUSTER", "side": "server", "enabled": 1, "attributes": [ { - "name": "DeviceTypeList", + "name": "Binding", "code": 0, "mfgCode": null, "side": "server", @@ -3873,8 +5294,8 @@ "reportableChange": 0 }, { - "name": "ServerList", - "code": 1, + "name": "GeneratedCommandList", + "code": 65528, "mfgCode": null, "side": "server", "type": "array", @@ -3889,8 +5310,8 @@ "reportableChange": 0 }, { - "name": "ClientList", - "code": 2, + "name": "AcceptedCommandList", + "code": 65529, "mfgCode": null, "side": "server", "type": "array", @@ -3905,8 +5326,8 @@ "reportableChange": 0 }, { - "name": "PartsList", - "code": 3, + "name": "EventList", + "code": 65530, "mfgCode": null, "side": "server", "type": "array", @@ -3959,10 +5380,10 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "External", + "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": null, + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3971,59 +5392,134 @@ ] }, { - "name": "Binding", - "code": 30, + "name": "Scenes Management", + "code": 98, "mfgCode": null, - "define": "BINDING_CLUSTER", - "side": "server", + "define": "SCENES_CLUSTER", + "side": "client", "enabled": 1, - "attributes": [ + "apiMaturity": "provisional", + "commands": [ { - "name": "Binding", + "name": "AddScene", "code": 0, "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 + "source": "client", + "isIncoming": 0, + "isEnabled": 1 }, { - "name": "FeatureMap", - "code": 65532, + "name": "AddSceneResponse", + "code": 0, "mfgCode": null, - "side": "server", - "type": "bitmap32", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0", - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ViewScene", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ViewSceneResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveScene", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveSceneResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveAllScenes", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveAllScenesResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StoreScene", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "StoreSceneResponse", + "code": 4, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RecallScene", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetSceneMembership", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 }, + { + "name": "GetSceneMembershipResponse", + "code": 6, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ { "name": "ClusterRevision", "code": 65533, "mfgCode": null, - "side": "server", + "side": "client", "type": "int16u", "included": 1, "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "1", + "defaultValue": "6", "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, + "minInterval": 0, + "maxInterval": 65344, "reportableChange": 0 } ] @@ -4046,6 +5542,22 @@ } ], "attributes": [ + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "client", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "ClusterRevision", "code": 65533, @@ -4058,8 +5570,8 @@ "bounded": 0, "defaultValue": "6", "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, + "minInterval": 1, + "maxInterval": 65534, "reportableChange": 0 } ] @@ -4145,7 +5657,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0x0", + "defaultValue": "0x00", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4183,6 +5695,22 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "AttributeList", "code": 65531, @@ -4225,7 +5753,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "2", + "defaultValue": "4", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4337,6 +5865,22 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "AttributeList", "code": 65531, @@ -4360,10 +5904,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4459,6 +6003,22 @@ "maxInterval": 65534, "reportableChange": 0 }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, { "name": "AttributeList", "code": 65531, @@ -4485,7 +6045,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "2", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4507,15 +6067,6 @@ "maxInterval": 65534, "reportableChange": 0 } - ], - "events": [ - { - "name": "InitialPress", - "code": 1, - "mfgCode": null, - "side": "server", - "included": 1 - } ] } ] @@ -4530,7 +6081,7 @@ "networkId": 0 }, { - "endpointTypeName": "MA-onofflightswitch", + "endpointTypeName": "MA-colordimmerswitch", "endpointTypeIndex": 1, "profileId": 259, "endpointId": 1, diff --git a/examples/light-switch-app/silabs/BUILD.gn b/examples/light-switch-app/silabs/BUILD.gn index fc52c0b96b03b7..f302a1593facce 100644 --- a/examples/light-switch-app/silabs/BUILD.gn +++ b/examples/light-switch-app/silabs/BUILD.gn @@ -157,6 +157,7 @@ silabs_executable("light_switch_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/efr32/lib/pw_rpc:pw_rpc", diff --git a/examples/light-switch-app/silabs/README.md b/examples/light-switch-app/silabs/README.md index a7e19ba18b2e98..615b27c7bc3cd9 100644 --- a/examples/light-switch-app/silabs/README.md +++ b/examples/light-switch-app/silabs/README.md @@ -59,8 +59,9 @@ Silicon Labs platform. (For Mac OS X, `commander` is located inside `Commander.app/Contents/MacOS/`.) -- Download and install a suitable ARM gcc tool chain: - [GNU Arm Embedded Toolchain 9-2019-q4-major](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) +- Download and install a suitable ARM gcc tool chain (For most Host, the + bootstrap already installs the toolchain): + [GNU Arm Embedded Toolchain 12.2 Rel1](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - Install some additional tools(likely already present for CHIP developers): diff --git a/examples/light-switch-app/telink/CMakeLists.txt b/examples/light-switch-app/telink/CMakeLists.txt index 5dd8720ce8d59f..451727b9fe20ae 100755 --- a/examples/light-switch-app/telink/CMakeLists.txt +++ b/examples/light-switch-app/telink/CMakeLists.txt @@ -235,7 +235,6 @@ target_link_libraries(app PRIVATE thread_service.nanopb_rpc pw_checksum pw_hdlc - pw_hdlc.pw_rpc pw_log pw_rpc.server pw_sys_io diff --git a/examples/lighting-app/bouffalolab/bl602/BUILD.gn b/examples/lighting-app/bouffalolab/bl602/BUILD.gn index b24c8731b08efe..ab89ae3f3bdb63 100644 --- a/examples/lighting-app/bouffalolab/bl602/BUILD.gn +++ b/examples/lighting-app/bouffalolab/bl602/BUILD.gn @@ -182,6 +182,7 @@ bouffalolab_executable("lighting_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_kvs:crc16", "$dir_pw_log", diff --git a/examples/lighting-app/bouffalolab/bl702/BUILD.gn b/examples/lighting-app/bouffalolab/bl702/BUILD.gn index fa863ceaf699d3..f923e3bad6ffe9 100644 --- a/examples/lighting-app/bouffalolab/bl702/BUILD.gn +++ b/examples/lighting-app/bouffalolab/bl702/BUILD.gn @@ -252,6 +252,7 @@ bouffalolab_executable("lighting_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", diff --git a/examples/lighting-app/bouffalolab/bl702l/BUILD.gn b/examples/lighting-app/bouffalolab/bl702l/BUILD.gn index b3e6f809b6ba38..24fad9ffa1897d 100644 --- a/examples/lighting-app/bouffalolab/bl702l/BUILD.gn +++ b/examples/lighting-app/bouffalolab/bl702l/BUILD.gn @@ -214,6 +214,7 @@ bouffalolab_executable("lighting_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter b/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter index 8a539d61c51aba..ad6f111938127d 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter @@ -2162,7 +2162,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 8e9a98042f426b..d8848ce3f5234d 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.zap +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.zap @@ -3460,10 +3460,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter b/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter index b84d9b2b2774f3..78048d0b457bbf 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter @@ -1980,7 +1980,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2348,7 +2348,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 f9491931a681af..1a410c2d751a7c 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.zap +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4436,10 +4436,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter b/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter index e5dc83b4a1a781..5b77ecb961222f 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter @@ -1891,7 +1891,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2211,7 +2211,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 31780199b9dace..94a906a3f532a5 100644 --- a/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.zap +++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3643,10 +3643,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lighting-app/esp32/sdkconfig.defaults.esp32c6 b/examples/lighting-app/esp32/sdkconfig.defaults.esp32c6 index 4947bd2fdf276f..104777a72bb735 100644 --- a/examples/lighting-app/esp32/sdkconfig.defaults.esp32c6 +++ b/examples/lighting-app/esp32/sdkconfig.defaults.esp32c6 @@ -19,13 +19,13 @@ CONFIG_BT_ENABLED=y CONFIG_BT_NIMBLE_ENABLED=y CONFIG_BT_NIMBLE_EXT_ADV=n CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 -CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=n +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=y # Disable OpenThread CONFIG_OPENTHREAD_ENABLED=n # Disable lwip ipv6 autoconfig -CONFIG_LWIP_IPV6_AUTOCONFIG=n +CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y diff --git a/examples/lighting-app/infineon/cyw30739/src/main.cpp b/examples/lighting-app/infineon/cyw30739/src/main.cpp index 14730252de08b3..f851e2e8819664 100644 --- a/examples/lighting-app/infineon/cyw30739/src/main.cpp +++ b/examples/lighting-app/infineon/cyw30739/src/main.cpp @@ -26,8 +26,9 @@ #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR #include #endif +#include #include -#include +#include #include #include #include @@ -191,10 +192,13 @@ void InitApp(intptr_t args) // Print QR Code URL PrintOnboardingCodes(chip::RendezvousInformationFlag(chip::RendezvousInformationFlag::kBLE)); /* Start CHIP datamodel server */ - static chip::OTATestEventTriggerDelegate testEventTriggerDelegate{ chip::ByteSpan(sTestEventTriggerEnableKey) }; + static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; gExampleDeviceInfoProvider.SetStorageDelegate(initParams.persistentStorageDelegate); chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); chip::Inet::EndPointStateOpenThread::OpenThreadEndpointInitParam nativeParams; diff --git a/examples/lighting-app/lighting-common/lighting-app.matter b/examples/lighting-app/lighting-common/lighting-app.matter index 6d92c5e339275f..f8996d1353ca8a 100644 --- a/examples/lighting-app/lighting-common/lighting-app.matter +++ b/examples/lighting-app/lighting-common/lighting-app.matter @@ -1826,7 +1826,7 @@ cluster UserLabel = 65 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -1834,13 +1834,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -1862,14 +1855,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1880,7 +1868,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -1900,7 +1888,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -1939,7 +1927,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -1953,34 +1941,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -1989,7 +1949,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -2009,12 +1969,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** Attributes and commands for controlling the color properties of a color-capable light. */ @@ -2388,7 +2344,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2805,20 +2761,19 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } server cluster ScenesManagement { - ram attribute nameSupport default = 0x80; ram attribute lastConfiguredBy; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; @@ -2833,8 +2788,6 @@ endpoint 1 { handle command RecallScene; handle command GetSceneMembership; handle command GetSceneMembershipResponse; - handle command EnhancedAddScene; - handle command EnhancedViewScene; handle command CopyScene; } diff --git a/examples/lighting-app/lighting-common/lighting-app.zap b/examples/lighting-app/lighting-common/lighting-app.zap index e5fc739d1ac6f8..870f5f430d7704 100644 --- a/examples/lighting-app/lighting-common/lighting-app.zap +++ b/examples/lighting-app/lighting-common/lighting-app.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5008,10 +5008,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5148,25 +5148,9 @@ "isIncoming": 0, "isEnabled": 1 }, - { - "name": "EnhancedAddScene", - "code": 64, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedViewScene", - "code": 65, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, { "name": "CopyScene", - "code": 66, + "code": 64, "mfgCode": null, "source": "client", "isIncoming": 1, @@ -5174,25 +5158,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x80", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "LastConfiguredBy", - "code": 5, + "code": 0, "mfgCode": null, "side": "server", "type": "node_id", @@ -5208,7 +5176,7 @@ }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -5224,7 +5192,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -5296,7 +5264,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5312,7 +5280,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, diff --git a/examples/lighting-app/linux/BUILD.gn b/examples/lighting-app/linux/BUILD.gn index aac02352bacf40..47b2b7e34cd48a 100644 --- a/examples/lighting-app/linux/BUILD.gn +++ b/examples/lighting-app/linux/BUILD.gn @@ -77,7 +77,7 @@ executable("chip-lighting-app") { ] deps += [ - "$dir_pw_hdlc:pw_rpc", + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_log", "$dir_pw_rpc:server", diff --git a/examples/lighting-app/nrfconnect/CMakeLists.txt b/examples/lighting-app/nrfconnect/CMakeLists.txt index a4480b43f0afc6..04dacfac4af308 100644 --- a/examples/lighting-app/nrfconnect/CMakeLists.txt +++ b/examples/lighting-app/nrfconnect/CMakeLists.txt @@ -218,7 +218,6 @@ target_link_libraries(app PRIVATE thread_service.nanopb_rpc pw_checksum pw_hdlc - pw_hdlc.pw_rpc pw_log pw_rpc.server pw_sys_io diff --git a/examples/lighting-app/nrfconnect/main/AppTask.cpp b/examples/lighting-app/nrfconnect/main/AppTask.cpp index 03632106fc8667..494095e04de9dc 100644 --- a/examples/lighting-app/nrfconnect/main/AppTask.cpp +++ b/examples/lighting-app/nrfconnect/main/AppTask.cpp @@ -27,8 +27,9 @@ #include #include #include +#include #include -#include +#include #include #include #include @@ -243,9 +244,12 @@ CHIP_ERROR AppTask::Init() #endif static CommonCaseDeviceServerInitParams initParams; - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams)); AppFabricTableDelegate::Init(); diff --git a/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp b/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp index 557293f6bac2aa..b1fc51c7c29360 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp +++ b/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp @@ -286,8 +286,8 @@ void AppTask::InitServer(intptr_t arg) chip::DeviceLayer::SetDeviceInfoProvider(&infoProvider); // Init ZCL Data Model and start server - static DefaultTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + static DefaultTestEventTriggerDelegate sTestEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; chip::Inet::EndPointStateOpenThread::OpenThreadEndpointInitParam nativeParams; nativeParams.lockCb = LockOpenThreadTask; nativeParams.unlockCb = UnlockOpenThreadTask; diff --git a/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp b/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp index 66eee725c581c2..7150003f599588 100644 --- a/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp +++ b/examples/lighting-app/nxp/k32w/k32w1/main/AppTask.cpp @@ -214,8 +214,8 @@ void AppTask::InitServer(intptr_t arg) #endif // Init ZCL Data Model and start server - static DefaultTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + static DefaultTestEventTriggerDelegate sTestEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; chip::Inet::EndPointStateOpenThread::OpenThreadEndpointInitParam nativeParams; nativeParams.lockCb = LockOpenThreadTask; nativeParams.unlockCb = UnlockOpenThreadTask; diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.matter b/examples/lighting-app/nxp/zap/lighting-on-off.matter index 7886980bc9f6c1..048b8f4748d326 100644 --- a/examples/lighting-app/nxp/zap/lighting-on-off.matter +++ b/examples/lighting-app/nxp/zap/lighting-on-off.matter @@ -1515,7 +1515,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1838,7 +1838,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.zap b/examples/lighting-app/nxp/zap/lighting-on-off.zap index 5be21734eee409..e7f1d48c378d29 100644 --- a/examples/lighting-app/nxp/zap/lighting-on-off.zap +++ b/examples/lighting-app/nxp/zap/lighting-on-off.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3949,10 +3949,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lighting-app/qpg/BUILD.gn b/examples/lighting-app/qpg/BUILD.gn index 981e7405150cb5..c835e0bf3cdaed 100644 --- a/examples/lighting-app/qpg/BUILD.gn +++ b/examples/lighting-app/qpg/BUILD.gn @@ -51,7 +51,7 @@ qpg_executable("lighting_app") { output_name = "chip-${qpg_target_ic}-lighting-example.out" sources = [ - "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerDelegate.cpp", + "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerHandler.cpp", "${examples_plat_dir}/app/main.cpp", "${examples_plat_dir}/ota/ota.cpp", "${examples_plat_dir}/powercycle_counting.c", @@ -105,6 +105,7 @@ qpg_executable("lighting_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/qpg/lib/pw_rpc:pw_rpc", diff --git a/examples/lighting-app/qpg/src/AppTask.cpp b/examples/lighting-app/qpg/src/AppTask.cpp index 5781e4069ad1eb..4dafde6ac41960 100644 --- a/examples/lighting-app/qpg/src/AppTask.cpp +++ b/examples/lighting-app/qpg/src/AppTask.cpp @@ -33,7 +33,8 @@ #include #include -#include +#include +#include #include #include #include @@ -43,6 +44,7 @@ #include #include +#include #include #include @@ -72,6 +74,7 @@ using namespace ::chip::DeviceLayer; static uint8_t countdown = 0; namespace { +constexpr EndpointId kLightEndpointId = 1; TaskHandle_t sAppTaskHandle; QueueHandle_t sAppEventQueue; @@ -93,6 +96,25 @@ StaticTask_t appTaskStruct; Clusters::Identify::EffectIdentifierEnum sIdentifyEffect = Clusters::Identify::EffectIdentifierEnum::kStopEffect; chip::DeviceLayer::DeviceInfoProviderImpl gExampleDeviceInfoProvider; +// Define a custom attribute persister which makes actual write of the attribute value +// to the non-volatile storage only when it has remained constant for 5 seconds. This is to reduce +// the flash wearout when the attribute changes frequently as a result of commands. +// DeferredAttribute object describes a deferred attribute, but also holds a buffer with a value to +// be written, so it must live so long as the DeferredAttributePersistenceProvider object. +// +DeferredAttribute gPersisters[] = { DeferredAttribute(ConcreteAttributePath(kLightEndpointId, Clusters::ColorControl::Id, + Clusters::ColorControl::Attributes::CurrentX::Id)), + DeferredAttribute(ConcreteAttributePath(kLightEndpointId, Clusters::ColorControl::Id, + Clusters::ColorControl::Attributes::CurrentY::Id)), + DeferredAttribute(ConcreteAttributePath(kLightEndpointId, Clusters::LevelControl::Id, + Clusters::LevelControl::Attributes::CurrentLevel::Id)) + +}; + +DeferredAttributePersistenceProvider gDeferredAttributePersister(Server::GetInstance().GetDefaultAttributePersister(), + Span(gPersisters, 3), + System::Clock::Milliseconds32(5000)); + /********************************************************** * Identify Callbacks *********************************************************/ @@ -243,13 +265,18 @@ void AppTask::InitServer(intptr_t arg) nativeParams.openThreadInstancePtr = chip::DeviceLayer::ThreadStackMgrImpl().OTInstance(); initParams.endpointNativeParams = static_cast(&nativeParams); - // Use GenericFaultTestEventTriggerDelegate to inject faults - static GenericFaultTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + // Use GenericFaultTestEventTriggerHandler to inject faults + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static GenericFaultTestEventTriggerHandler sFaultTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sFaultTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; chip::Server::GetInstance().Init(initParams); + app::SetAttributePersistenceProvider(&gDeferredAttributePersister); + #if CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY chip::app::DnssdServer::Instance().SetExtendedDiscoveryTimeoutSecs(extDiscTimeoutSecs); #endif diff --git a/examples/lighting-app/qpg/src/ZclCallbacks.cpp b/examples/lighting-app/qpg/src/ZclCallbacks.cpp index fce10c0d60f1d1..0b75837a64a8cc 100644 --- a/examples/lighting-app/qpg/src/ZclCallbacks.cpp +++ b/examples/lighting-app/qpg/src/ZclCallbacks.cpp @@ -160,13 +160,41 @@ void MatterPostAttributeChangeCallback(const chip::app::ConcreteAttributePath & */ void emberAfOnOffClusterInitCallback(EndpointId endpoint) { + uint8_t levelValue; + XyColor_t xy; bool onOffValue = false; + app::DataModel::Nullable currentLevel; + EmberAfStatus status; - EmberAfStatus status = OnOff::Attributes::OnOff::Get(1, &onOffValue); + status = OnOff::Attributes::OnOff::Get(1, &onOffValue); if (status == EMBER_ZCL_STATUS_SUCCESS) { LightingMgr().InitiateAction(onOffValue ? LightingManager::ON_ACTION : LightingManager::OFF_ACTION, 0, 1, (uint8_t *) onOffValue); } + + /* restore values saved by DeferredAttributePersistenceProvider */ + status = LevelControl::Attributes::CurrentLevel::Get(endpoint, currentLevel); + if (status != EMBER_ZCL_STATUS_SUCCESS || currentLevel.IsNull()) + { + return; + } + + levelValue = currentLevel.Value(); + + status = ColorControl::Attributes::CurrentY::Get(endpoint, &xy.y); + if (status != EMBER_ZCL_STATUS_SUCCESS) + { + return; + } + status = ColorControl::Attributes::CurrentX::Get(endpoint, &xy.x); + if (status != EMBER_ZCL_STATUS_SUCCESS) + { + return; + } + ChipLogProgress(Zcl, "restore level: %u", levelValue); + LightingMgr().InitiateAction(LightingManager::LEVEL_ACTION, 0, 1, &levelValue); + ChipLogProgress(Zcl, "restore XY color: %u|%u", xy.x, xy.y); + LightingMgr().InitiateAction(LightingManager::COLOR_ACTION_XY, 0, sizeof(xy), (uint8_t *) &xy); } diff --git a/examples/lighting-app/qpg/zap/light.matter b/examples/lighting-app/qpg/zap/light.matter index 40bde659477d8a..bef48495ad23e8 100644 --- a/examples/lighting-app/qpg/zap/light.matter +++ b/examples/lighting-app/qpg/zap/light.matter @@ -1922,7 +1922,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2322,7 +2322,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2330,8 +2330,8 @@ endpoint 1 { ram attribute currentHue default = 0x00; ram attribute currentSaturation default = 0x00; ram attribute remainingTime default = 0x0000; - ram attribute currentX default = 0x616B; - ram attribute currentY default = 0x607D; + persist attribute currentX default = 0x616B; + persist attribute currentY default = 0x607D; ram attribute colorTemperatureMireds default = 0x00FA; ram attribute colorMode default = 0x01; ram attribute options default = 0x00; diff --git a/examples/lighting-app/qpg/zap/light.zap b/examples/lighting-app/qpg/zap/light.zap index 2c881ce56c2e37..c328c070b45a68 100644 --- a/examples/lighting-app/qpg/zap/light.zap +++ b/examples/lighting-app/qpg/zap/light.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5066,10 +5066,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5310,7 +5310,7 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "NVM", "singleton": 0, "bounded": 0, "defaultValue": "0x616B", @@ -5326,7 +5326,7 @@ "side": "server", "type": "int16u", "included": 1, - "storageOption": "RAM", + "storageOption": "NVM", "singleton": 0, "bounded": 0, "defaultValue": "0x607D", diff --git a/examples/lighting-app/silabs/BUILD.gn b/examples/lighting-app/silabs/BUILD.gn index 9c314b025f63fd..4ca705caac2cef 100644 --- a/examples/lighting-app/silabs/BUILD.gn +++ b/examples/lighting-app/silabs/BUILD.gn @@ -173,6 +173,7 @@ silabs_executable("lighting_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "$dir_pw_trace", diff --git a/examples/lighting-app/silabs/README.md b/examples/lighting-app/silabs/README.md index 639afd163fe7ef..08db63d9d3f0ea 100644 --- a/examples/lighting-app/silabs/README.md +++ b/examples/lighting-app/silabs/README.md @@ -57,8 +57,9 @@ Silicon Labs platform. (For Mac OS X, `commander` is located inside `Commander.app/Contents/MacOS/`.) -- Download and install a suitable ARM gcc tool chain: - [GNU Arm Embedded Toolchain 9-2019-q4-major](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) +- Download and install a suitable ARM gcc tool chain (For most Host, the + bootstrap already installs the toolchain): + [GNU Arm Embedded Toolchain 12.2 Rel1](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - Install some additional tools (likely already present for CHIP developers): diff --git a/examples/lighting-app/silabs/data_model/lighting-thread-app.matter b/examples/lighting-app/silabs/data_model/lighting-thread-app.matter index fb3253218f4a1a..86db7ac353c727 100644 --- a/examples/lighting-app/silabs/data_model/lighting-thread-app.matter +++ b/examples/lighting-app/silabs/data_model/lighting-thread-app.matter @@ -1911,7 +1911,7 @@ cluster UserLabel = 65 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -1919,13 +1919,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -1947,14 +1940,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1965,7 +1953,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -1985,7 +1973,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -2024,7 +2012,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -2038,34 +2026,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -2074,7 +2034,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -2094,12 +2054,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** Attributes and commands for controlling the color properties of a color-capable light. */ @@ -2432,7 +2388,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2766,7 +2722,7 @@ endpoint 1 { callback attribute eventList; callback attribute attributeList; ram attribute featureMap default = 1; - ram attribute clusterRevision default = 5; + ram attribute clusterRevision default = 6; handle command Off; handle command On; @@ -2796,7 +2752,7 @@ endpoint 1 { callback attribute eventList; callback attribute attributeList; ram attribute featureMap default = 3; - ram attribute clusterRevision default = 5; + ram attribute clusterRevision default = 6; handle command MoveToLevel; handle command Move; @@ -2817,7 +2773,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2842,7 +2798,6 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport default = 0x80; ram attribute lastConfiguredBy; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; @@ -2850,8 +2805,8 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; @@ -2866,12 +2821,6 @@ endpoint 1 { handle command RecallScene; handle command GetSceneMembership; handle command GetSceneMembershipResponse; - handle command EnhancedAddScene; - handle command EnhancedAddSceneResponse; - handle command EnhancedViewScene; - handle command EnhancedViewSceneResponse; - handle command CopyScene; - handle command CopySceneResponse; } server cluster ColorControl { 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 af7be3ec57cc1c..55b06213c5794b 100644 --- a/examples/lighting-app/silabs/data_model/lighting-thread-app.zap +++ b/examples/lighting-app/silabs/data_model/lighting-thread-app.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4201,7 +4201,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "6", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -4597,7 +4597,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "6", "reportable": 1, "minInterval": 0, "maxInterval": 65344, @@ -4748,10 +4748,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5169,76 +5169,12 @@ "source": "server", "isIncoming": 0, "isEnabled": 1 - }, - { - "name": "EnhancedAddScene", - "code": 64, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedAddSceneResponse", - "code": 64, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, - { - "name": "EnhancedViewScene", - "code": 65, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedViewSceneResponse", - "code": 65, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 - }, - { - "name": "CopyScene", - "code": 66, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "CopySceneResponse", - "code": 66, - "mfgCode": null, - "source": "server", - "isIncoming": 0, - "isEnabled": 1 } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x80", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "LastConfiguredBy", - "code": 5, + "code": 0, "mfgCode": null, "side": "server", "type": "node_id", @@ -5254,7 +5190,7 @@ }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -5270,7 +5206,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -5358,7 +5294,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5374,7 +5310,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, diff --git a/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter b/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter index 41e79a344f7d9b..b52944de7a3f8c 100644 --- a/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter +++ b/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter @@ -1822,7 +1822,7 @@ cluster UserLabel = 65 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -1830,13 +1830,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -1858,14 +1851,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1876,7 +1864,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -1896,7 +1884,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -1935,7 +1923,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -1949,34 +1937,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -1985,7 +1945,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -2005,12 +1965,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** Attributes and commands for controlling the color properties of a color-capable light. */ @@ -2343,7 +2299,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2677,7 +2633,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2702,7 +2658,6 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport default = 0x80; ram attribute lastConfiguredBy; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; @@ -2710,8 +2665,8 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; @@ -2726,8 +2681,6 @@ endpoint 1 { handle command RecallScene; handle command GetSceneMembership; handle command GetSceneMembershipResponse; - handle command EnhancedAddScene; - handle command EnhancedViewScene; handle command CopyScene; } 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 e0091956b2daed..3cf074afc1b0b6 100644 --- a/examples/lighting-app/silabs/data_model/lighting-wifi-app.zap +++ b/examples/lighting-app/silabs/data_model/lighting-wifi-app.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3932,10 +3932,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4354,25 +4354,9 @@ "isIncoming": 0, "isEnabled": 1 }, - { - "name": "EnhancedAddScene", - "code": 64, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, - { - "name": "EnhancedViewScene", - "code": 65, - "mfgCode": null, - "source": "client", - "isIncoming": 1, - "isEnabled": 1 - }, { "name": "CopyScene", - "code": 66, + "code": 64, "mfgCode": null, "source": "client", "isIncoming": 1, @@ -4380,25 +4364,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "0x80", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "LastConfiguredBy", - "code": 5, + "code": 0, "mfgCode": null, "side": "server", "type": "node_id", @@ -4414,7 +4382,7 @@ }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -4430,7 +4398,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -4518,7 +4486,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4534,7 +4502,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, diff --git a/examples/lighting-app/telink/CMakeLists.txt b/examples/lighting-app/telink/CMakeLists.txt index 2017d797558eb6..9620a00e1127e5 100644 --- a/examples/lighting-app/telink/CMakeLists.txt +++ b/examples/lighting-app/telink/CMakeLists.txt @@ -268,7 +268,6 @@ target_link_libraries(app PRIVATE thread_service.nanopb_rpc pw_checksum pw_hdlc - pw_hdlc.pw_rpc pw_log pw_rpc.server pw_sys_io diff --git a/examples/lit-icd-app/linux/args.gni b/examples/lit-icd-app/linux/args.gni index 5630bb4e1ccb25..c1421b0c721f9b 100644 --- a/examples/lit-icd-app/linux/args.gni +++ b/examples/lit-icd-app/linux/args.gni @@ -29,3 +29,4 @@ matter_enable_tracing_support = true # ICD configurations chip_enable_icd_server = true chip_subscription_timeout_resumption = false +chip_icd_report_on_active_mode = true diff --git a/examples/lit-icd-app/linux/include/CHIPProjectAppConfig.h b/examples/lit-icd-app/linux/include/CHIPProjectAppConfig.h index 60cf9dfd7324b5..dd77b121fb4e3a 100644 --- a/examples/lit-icd-app/linux/include/CHIPProjectAppConfig.h +++ b/examples/lit-icd-app/linux/include/CHIPProjectAppConfig.h @@ -39,4 +39,4 @@ // ICD configurations #define CHIP_CONFIG_ICD_IDLE_MODE_DURATION_SEC 3600 #define CHIP_CONFIG_ICD_ACTIVE_MODE_DURATION_MS 10000 -#define CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS 1000 +#define CHIP_CONFIG_ICD_ACTIVE_MODE_THRESHOLD_MS 5000 diff --git a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter index 4722e35016c3a4..17d36e26ceeff5 100644 --- a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter +++ b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter @@ -1417,9 +1417,6 @@ cluster IcdManagement = 70 { fabric_idx fabricIndex = 254; } - critical event OnTransitionToActiveMode = 0 { - } - readonly attribute int32u idleModeDuration = 0; readonly attribute int32u activeModeDuration = 1; readonly attribute int16u activeModeThreshold = 2; @@ -1488,7 +1485,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1743,7 +1740,6 @@ endpoint 0 { } server cluster IcdManagement { - emits event OnTransitionToActiveMode; callback attribute idleModeDuration; callback attribute activeModeDuration; callback attribute activeModeThreshold; 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 14f5e80526c979..d288636d7ea5e6 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 @@ -295,10 +295,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3615,15 +3615,6 @@ "maxInterval": 65534, "reportableChange": 0 } - ], - "events": [ - { - "name": "OnTransitionToActiveMode", - "code": 0, - "mfgCode": null, - "side": "server", - "included": 1 - } ] } ] diff --git a/examples/lit-icd-app/silabs/BUILD.gn b/examples/lit-icd-app/silabs/BUILD.gn index d547ddec637678..d0956cc9a7a2e3 100644 --- a/examples/lit-icd-app/silabs/BUILD.gn +++ b/examples/lit-icd-app/silabs/BUILD.gn @@ -156,6 +156,7 @@ silabs_executable("lit_icd_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/efr32/lib/pw_rpc:pw_rpc", diff --git a/examples/lit-icd-app/silabs/README.md b/examples/lit-icd-app/silabs/README.md index 4a5b6b35851581..f359eacbd23cf4 100644 --- a/examples/lit-icd-app/silabs/README.md +++ b/examples/lit-icd-app/silabs/README.md @@ -59,8 +59,9 @@ Labs platform. (For Mac OS X, `commander` is located inside `Commander.app/Contents/MacOS/`.) -- Download and install a suitable ARM gcc tool chain: - [GNU Arm Embedded Toolchain 9-2019-q4-major](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) +- Download and install a suitable ARM gcc tool chain (For most Host, the + bootstrap already installs the toolchain): + [GNU Arm Embedded Toolchain 12.2 Rel1](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - Install some additional tools(likely already present for CHIP developers): diff --git a/examples/lit-icd-app/silabs/openthread.gni b/examples/lit-icd-app/silabs/openthread.gni index 8bebcdea95e283..69bd7b88e6bdc6 100644 --- a/examples/lit-icd-app/silabs/openthread.gni +++ b/examples/lit-icd-app/silabs/openthread.gni @@ -31,6 +31,7 @@ chip_enable_icd_server = true chip_subscription_timeout_resumption = false sl_use_subscription_synching = true icd_enforce_sit_slow_poll_limit = true +chip_icd_report_on_active_mode = true # Openthread Configuration flags sl_ot_idle_interval_ms = 3600000 # 60mins Idle Polling Interval @@ -39,4 +40,4 @@ sl_ot_active_interval_ms = 1000 # 1000ms Active Polling Interval # ICD Matter Configuration flags sl_idle_mode_interval_s = 3600 # 60min Idle Mode Interval sl_active_mode_interval_ms = 0 # 0 Active Mode Interval -sl_active_mode_threshold_ms = 30000 # 30s Active Mode Threshold +sl_active_mode_threshold_ms = 5000 # 5s Active Mode Threshold diff --git a/examples/lock-app/esp32/main/Button.cpp b/examples/lock-app/esp32/main/Button.cpp index b80e124523f893..2e3aafa4db2116 100644 --- a/examples/lock-app/esp32/main/Button.cpp +++ b/examples/lock-app/esp32/main/Button.cpp @@ -27,6 +27,14 @@ esp_err_t Button::Init(gpio_num_t gpioNum, uint16_t debouncePeriod) mState = false; mLastPolledState = false; + gpio_config_t io_conf = {}; + io_conf.intr_type = GPIO_INTR_NEGEDGE; + io_conf.pin_bit_mask = 1ULL << gpioNum; + io_conf.mode = GPIO_MODE_INPUT; + io_conf.pull_down_en = GPIO_PULLDOWN_ENABLE; + + gpio_config(&io_conf); + return gpio_set_direction(gpioNum, GPIO_MODE_INPUT); } diff --git a/examples/lock-app/esp32/sdkconfig.defaults.esp32c6 b/examples/lock-app/esp32/sdkconfig.defaults.esp32c6 index b8d458e24fc0f9..8e941f423d0a22 100644 --- a/examples/lock-app/esp32/sdkconfig.defaults.esp32c6 +++ b/examples/lock-app/esp32/sdkconfig.defaults.esp32c6 @@ -18,13 +18,13 @@ CONFIG_BT_ENABLED=y CONFIG_BT_NIMBLE_ENABLED=y CONFIG_BT_NIMBLE_EXT_ADV=n CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70 -CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=n +CONFIG_USE_BLE_ONLY_FOR_COMMISSIONING=y # Disable OpenThread CONFIG_OPENTHREAD_ENABLED=n # Disable lwip ipv6 autoconfig -CONFIG_LWIP_IPV6_AUTOCONFIG=n +CONFIG_LWIP_IPV6_AUTOCONFIG=y # Use a custom partition table CONFIG_PARTITION_TABLE_CUSTOM=y diff --git a/examples/lock-app/infineon/cyw30739/src/main.cpp b/examples/lock-app/infineon/cyw30739/src/main.cpp index 76fa8484ce74eb..a0a92487a807bc 100644 --- a/examples/lock-app/infineon/cyw30739/src/main.cpp +++ b/examples/lock-app/infineon/cyw30739/src/main.cpp @@ -28,9 +28,10 @@ #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR #include #endif +#include #include #include -#include +#include #include #include #include @@ -191,10 +192,13 @@ void InitApp(intptr_t args) // Print QR Code URL PrintOnboardingCodes(chip::RendezvousInformationFlag(chip::RendezvousInformationFlag::kBLE)); /* Start CHIP datamodel server */ - static chip::OTATestEventTriggerDelegate testEventTriggerDelegate{ chip::ByteSpan(sTestEventTriggerEnableKey) }; + static chip::SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static chip::OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(chip::ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; gExampleDeviceInfoProvider.SetStorageDelegate(initParams.persistentStorageDelegate); chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); chip::Inet::EndPointStateOpenThread::OpenThreadEndpointInitParam nativeParams; diff --git a/examples/lock-app/lock-common/lock-app.matter b/examples/lock-app/lock-common/lock-app.matter index da3227a62464ce..6a3aad2cf8e382 100644 --- a/examples/lock-app/lock-common/lock-app.matter +++ b/examples/lock-app/lock-common/lock-app.matter @@ -1777,9 +1777,6 @@ cluster IcdManagement = 70 { fabric_idx fabricIndex = 254; } - critical event OnTransitionToActiveMode = 0 { - } - readonly attribute int32u idleModeDuration = 0; readonly attribute int32u activeModeDuration = 1; readonly attribute int16u activeModeThreshold = 2; @@ -2490,7 +2487,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2905,7 +2902,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/lock-app/lock-common/lock-app.zap b/examples/lock-app/lock-common/lock-app.zap index ef58c8006cb198..c5201e7a6fbb0c 100644 --- a/examples/lock-app/lock-common/lock-app.zap +++ b/examples/lock-app/lock-common/lock-app.zap @@ -211,10 +211,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -5358,10 +5358,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lock-app/nrfconnect/main/AppTask.cpp b/examples/lock-app/nrfconnect/main/AppTask.cpp index d64a4950ace777..07a96b6d6c29b2 100644 --- a/examples/lock-app/nrfconnect/main/AppTask.cpp +++ b/examples/lock-app/nrfconnect/main/AppTask.cpp @@ -25,9 +25,10 @@ #include #include +#include #include #include -#include +#include #include #include #include @@ -209,9 +210,12 @@ CHIP_ERROR AppTask::Init() #endif static CommonCaseDeviceServerInitParams initParams; - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams)); AppFabricTableDelegate::Init(); diff --git a/examples/lock-app/nxp/zap/lock-app.matter b/examples/lock-app/nxp/zap/lock-app.matter index ea056faf9147ea..add41c8ba65225 100644 --- a/examples/lock-app/nxp/zap/lock-app.matter +++ b/examples/lock-app/nxp/zap/lock-app.matter @@ -1737,7 +1737,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1982,7 +1982,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/lock-app/nxp/zap/lock-app.zap b/examples/lock-app/nxp/zap/lock-app.zap index bdb78c5307b26c..e6683cf3147e1b 100644 --- a/examples/lock-app/nxp/zap/lock-app.zap +++ b/examples/lock-app/nxp/zap/lock-app.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3066,10 +3066,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lock-app/qpg/BUILD.gn b/examples/lock-app/qpg/BUILD.gn index 1023e9f2751ce2..30794878fd1ae8 100644 --- a/examples/lock-app/qpg/BUILD.gn +++ b/examples/lock-app/qpg/BUILD.gn @@ -51,7 +51,7 @@ qpg_executable("lock_app") { output_name = "chip-${qpg_target_ic}-lock-example.out" sources = [ - "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerDelegate.cpp", + "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerHandler.cpp", "${examples_plat_dir}/app/main.cpp", "${examples_plat_dir}/ota/ota.cpp", "src/AppTask.cpp", @@ -102,6 +102,7 @@ qpg_executable("lock_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/qpg/lib/pw_rpc:pw_rpc", diff --git a/examples/lock-app/qpg/src/AppTask.cpp b/examples/lock-app/qpg/src/AppTask.cpp index 8bbd6b7ce19a8a..54a4b2a5d2a3f3 100644 --- a/examples/lock-app/qpg/src/AppTask.cpp +++ b/examples/lock-app/qpg/src/AppTask.cpp @@ -26,7 +26,8 @@ #include #include -#include +#include +#include #include #include #include @@ -189,10 +190,13 @@ void AppTask::InitServer(intptr_t arg) nativeParams.openThreadInstancePtr = chip::DeviceLayer::ThreadStackMgrImpl().OTInstance(); initParams.endpointNativeParams = static_cast(&nativeParams); - // Use GenericFaultTestEventTriggerDelegate to inject faults - static GenericFaultTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + // Use GenericFaultTestEventTriggerHandler to inject faults + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static GenericFaultTestEventTriggerHandler sFaultTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sFaultTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; chip::Server::GetInstance().Init(initParams); diff --git a/examples/lock-app/qpg/zap/lock.matter b/examples/lock-app/qpg/zap/lock.matter index 18934e075afec3..e5546521e7343b 100644 --- a/examples/lock-app/qpg/zap/lock.matter +++ b/examples/lock-app/qpg/zap/lock.matter @@ -1433,9 +1433,6 @@ cluster IcdManagement = 70 { fabric_idx fabricIndex = 254; } - critical event OnTransitionToActiveMode = 0 { - } - readonly attribute int32u idleModeDuration = 0; readonly attribute int32u activeModeDuration = 1; readonly attribute int16u activeModeThreshold = 2; @@ -2144,7 +2141,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2512,7 +2509,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/lock-app/qpg/zap/lock.zap b/examples/lock-app/qpg/zap/lock.zap index d0489afe5c9b4b..f2bbe61b05b876 100644 --- a/examples/lock-app/qpg/zap/lock.zap +++ b/examples/lock-app/qpg/zap/lock.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4732,10 +4732,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/lock-app/silabs/BUILD.gn b/examples/lock-app/silabs/BUILD.gn index f5d00f7d48ab63..fe2abc95512c20 100644 --- a/examples/lock-app/silabs/BUILD.gn +++ b/examples/lock-app/silabs/BUILD.gn @@ -157,6 +157,7 @@ silabs_executable("lock_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/efr32/lib/pw_rpc:pw_rpc", diff --git a/examples/lock-app/silabs/README.md b/examples/lock-app/silabs/README.md index 7d8d576c68492c..1bce8c431bee54 100644 --- a/examples/lock-app/silabs/README.md +++ b/examples/lock-app/silabs/README.md @@ -54,8 +54,9 @@ Labs platform. (For Mac OS X, `commander` is located inside `Commander.app/Contents/MacOS/`.) -- Download and install a suitable ARM gcc tool chain: - [GNU Arm Embedded Toolchain 9-2019-q4-major](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) +- Download and install a suitable ARM gcc tool chain (For most Host, the + bootstrap already installs the toolchain): + [GNU Arm Embedded Toolchain 12.2 Rel1](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - Install some additional tools(likely already present for CHIP developers): 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 70d2b496e213fa..eada9b169c8f8b 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 @@ -1151,7 +1151,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1391,7 +1391,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 a74585718bb424..f82d87620b104c 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 @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2988,10 +2988,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/minimal-mdns/README.md b/examples/minimal-mdns/README.md index 391b7f0adb5bfe..9e74f40701f016 100644 --- a/examples/minimal-mdns/README.md +++ b/examples/minimal-mdns/README.md @@ -36,7 +36,7 @@ unicast queries. Example run: ```sh -./out/minimal_mdns/minimal-mdns-client -4 +./out/minimal_mdns/minimal-mdns-client ``` which is likely to list a lot of answers. @@ -44,7 +44,7 @@ which is likely to list a lot of answers. You can customize the queries run: ```sh -/out/minimal_mdns/minimal-mdns-client -4 -q chip-mdns-demo._matter._tcp.local +./out/minimal_mdns/minimal-mdns-client -q chip-mdns-demo._matter._tcp.local ``` see diff --git a/examples/network-manager-app/network-manager-common/network-manager-app.matter b/examples/network-manager-app/network-manager-common/network-manager-app.matter index 1e754d83f02d35..fdc906d0ad60b9 100644 --- a/examples/network-manager-app/network-manager-common/network-manager-app.matter +++ b/examples/network-manager-app/network-manager-common/network-manager-app.matter @@ -1181,7 +1181,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1421,7 +1421,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } 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 638a5ff605f36e..0ba225536e56e5 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 @@ -279,10 +279,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3182,10 +3182,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter b/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter index 2bb839cefd3d0c..9f8d7049b5b172 100644 --- a/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter +++ b/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter @@ -1086,7 +1086,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 23becbb30ac9ed..dd859506a8d391 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 @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter index 6b0a43538b4b8e..aa72684ff1f68a 100644 --- a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter +++ b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter @@ -1285,7 +1285,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1539,7 +1539,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } @@ -1556,7 +1556,7 @@ endpoint 65534 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.zap index 37fb1e55071267..e2866c1995299d 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 @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2913,10 +2913,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3112,10 +3112,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/placeholder/linux/apps/app1/config.matter b/examples/placeholder/linux/apps/app1/config.matter index 3a1cbd1c932376..935a665fcde9f5 100644 --- a/examples/placeholder/linux/apps/app1/config.matter +++ b/examples/placeholder/linux/apps/app1/config.matter @@ -2992,7 +2992,7 @@ cluster ModeSelect = 80 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -3000,13 +3000,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -3028,14 +3021,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -3046,7 +3034,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -3066,7 +3054,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -3105,7 +3093,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -3119,34 +3107,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -3155,7 +3115,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -3175,12 +3135,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** An interface to a generic way to secure a door */ @@ -6382,12 +6338,13 @@ cluster OccupancySensing = 1030 { /** This cluster provides an interface for controlling the current Channel on a device. */ cluster Channel = 1284 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum ChannelTypeEnum : enum8 { kSatellite = 0; kCable = 1; kTerrestrial = 2; + kOTT = 3; } enum LineupInfoTypeEnum : enum8 { @@ -6403,14 +6360,14 @@ cluster Channel = 1284 { bitmap Feature : bitmap32 { kChannelList = 0x1; kLineupInfo = 0x2; - kElectronicGuide = 0x3; - kRecordProgram = 0x4; + kElectronicGuide = 0x4; + kRecordProgram = 0x8; } bitmap RecordingFlagBitmap : bitmap32 { kScheduled = 0x1; kRecordSeries = 0x2; - kRecorded = 0x3; + kRecorded = 0x4; } struct ProgramCastStruct { @@ -6556,12 +6513,13 @@ cluster Channel = 1284 { /** This cluster provides an interface for controlling the current Channel on a device. */ cluster Channel = 1284 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum ChannelTypeEnum : enum8 { kSatellite = 0; kCable = 1; kTerrestrial = 2; + kOTT = 3; } enum LineupInfoTypeEnum : enum8 { @@ -6577,14 +6535,14 @@ cluster Channel = 1284 { bitmap Feature : bitmap32 { kChannelList = 0x1; kLineupInfo = 0x2; - kElectronicGuide = 0x3; - kRecordProgram = 0x4; + kElectronicGuide = 0x4; + kRecordProgram = 0x8; } bitmap RecordingFlagBitmap : bitmap32 { kScheduled = 0x1; kRecordSeries = 0x2; - kRecorded = 0x3; + kRecorded = 0x4; } struct ProgramCastStruct { @@ -6730,7 +6688,7 @@ cluster Channel = 1284 { /** This cluster provides an interface for UX navigation within a set of targets on a device or endpoint. */ cluster TargetNavigator = 1285 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum StatusEnum : enum8 { kSuccess = 0; @@ -6774,7 +6732,7 @@ cluster TargetNavigator = 1285 { /** This cluster provides an interface for UX navigation within a set of targets on a device or endpoint. */ cluster TargetNavigator = 1285 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum StatusEnum : enum8 { kSuccess = 0; @@ -6818,7 +6776,7 @@ cluster TargetNavigator = 1285 { /** This cluster provides an interface for controlling Media Playback (PLAY, PAUSE, etc) on a media device such as a TV or Speaker. */ cluster MediaPlayback = 1286 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum CharacteristicEnum : enum8 { kForcedSubtitles = 0; @@ -6860,9 +6818,9 @@ cluster MediaPlayback = 1286 { bitmap Feature : bitmap32 { kAdvancedSeek = 0x1; kVariableSpeed = 0x2; - kTextTracks = 0x3; - kAudioTracks = 0x4; - kAudioAdvance = 0x5; + kTextTracks = 0x4; + kAudioTracks = 0x8; + kAudioAdvance = 0x10; } struct TrackAttributesStruct { @@ -6976,7 +6934,7 @@ cluster MediaPlayback = 1286 { /** This cluster provides an interface for controlling Media Playback (PLAY, PAUSE, etc) on a media device such as a TV or Speaker. */ cluster MediaPlayback = 1286 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum CharacteristicEnum : enum8 { kForcedSubtitles = 0; @@ -7018,9 +6976,9 @@ cluster MediaPlayback = 1286 { bitmap Feature : bitmap32 { kAdvancedSeek = 0x1; kVariableSpeed = 0x2; - kTextTracks = 0x3; - kAudioTracks = 0x4; - kAudioAdvance = 0x5; + kTextTracks = 0x4; + kAudioTracks = 0x8; + kAudioAdvance = 0x10; } struct TrackAttributesStruct { @@ -8097,7 +8055,7 @@ cluster ApplicationBasic = 1293 { /** This cluster provides commands that facilitate user account login on a Content App or a node. For example, a Content App running on a Video Player device, which is represented as an endpoint (see [TV Architecture]), can use this cluster to help make the user account on the Content App match the user account on the Client. */ cluster AccountLogin = 1294 { - revision 1; // NOTE: Default/not specifically set + revision 2; critical event LoggedOut = 0 { optional node_id node = 0; @@ -8138,7 +8096,7 @@ cluster AccountLogin = 1294 { /** This cluster provides commands that facilitate user account login on a Content App or a node. For example, a Content App running on a Video Player device, which is represented as an endpoint (see [TV Architecture]), can use this cluster to help make the user account on the Content App match the user account on the Client. */ cluster AccountLogin = 1294 { - revision 1; // NOTE: Default/not specifically set + revision 2; critical event LoggedOut = 0 { optional node_id node = 0; @@ -8212,7 +8170,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -9107,7 +9065,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -9161,14 +9119,13 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport; ram attribute sceneTableSize default = 16; callback attribute fabricSceneInfo; callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; diff --git a/examples/placeholder/linux/apps/app1/config.zap b/examples/placeholder/linux/apps/app1/config.zap index 230c520b1e7373..79c6b06618944f 100644 --- a/examples/placeholder/linux/apps/app1/config.zap +++ b/examples/placeholder/linux/apps/app1/config.zap @@ -211,10 +211,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -12721,10 +12721,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -13551,25 +13551,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -13585,7 +13569,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -13657,7 +13641,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -13673,7 +13657,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/placeholder/linux/apps/app2/config.matter b/examples/placeholder/linux/apps/app2/config.matter index 05feee108add0a..83657fd83849d5 100644 --- a/examples/placeholder/linux/apps/app2/config.matter +++ b/examples/placeholder/linux/apps/app2/config.matter @@ -2949,7 +2949,7 @@ cluster ModeSelect = 80 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -2957,13 +2957,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -2985,14 +2978,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -3003,7 +2991,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -3023,7 +3011,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -3062,7 +3050,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -3076,34 +3064,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -3112,7 +3072,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -3132,12 +3092,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** An interface to a generic way to secure a door */ @@ -6339,12 +6295,13 @@ cluster OccupancySensing = 1030 { /** This cluster provides an interface for controlling the current Channel on a device. */ cluster Channel = 1284 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum ChannelTypeEnum : enum8 { kSatellite = 0; kCable = 1; kTerrestrial = 2; + kOTT = 3; } enum LineupInfoTypeEnum : enum8 { @@ -6360,14 +6317,14 @@ cluster Channel = 1284 { bitmap Feature : bitmap32 { kChannelList = 0x1; kLineupInfo = 0x2; - kElectronicGuide = 0x3; - kRecordProgram = 0x4; + kElectronicGuide = 0x4; + kRecordProgram = 0x8; } bitmap RecordingFlagBitmap : bitmap32 { kScheduled = 0x1; kRecordSeries = 0x2; - kRecorded = 0x3; + kRecorded = 0x4; } struct ProgramCastStruct { @@ -6513,12 +6470,13 @@ cluster Channel = 1284 { /** This cluster provides an interface for controlling the current Channel on a device. */ cluster Channel = 1284 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum ChannelTypeEnum : enum8 { kSatellite = 0; kCable = 1; kTerrestrial = 2; + kOTT = 3; } enum LineupInfoTypeEnum : enum8 { @@ -6534,14 +6492,14 @@ cluster Channel = 1284 { bitmap Feature : bitmap32 { kChannelList = 0x1; kLineupInfo = 0x2; - kElectronicGuide = 0x3; - kRecordProgram = 0x4; + kElectronicGuide = 0x4; + kRecordProgram = 0x8; } bitmap RecordingFlagBitmap : bitmap32 { kScheduled = 0x1; kRecordSeries = 0x2; - kRecorded = 0x3; + kRecorded = 0x4; } struct ProgramCastStruct { @@ -6687,7 +6645,7 @@ cluster Channel = 1284 { /** This cluster provides an interface for UX navigation within a set of targets on a device or endpoint. */ cluster TargetNavigator = 1285 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum StatusEnum : enum8 { kSuccess = 0; @@ -6731,7 +6689,7 @@ cluster TargetNavigator = 1285 { /** This cluster provides an interface for UX navigation within a set of targets on a device or endpoint. */ cluster TargetNavigator = 1285 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum StatusEnum : enum8 { kSuccess = 0; @@ -6775,7 +6733,7 @@ cluster TargetNavigator = 1285 { /** This cluster provides an interface for controlling Media Playback (PLAY, PAUSE, etc) on a media device such as a TV or Speaker. */ cluster MediaPlayback = 1286 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum CharacteristicEnum : enum8 { kForcedSubtitles = 0; @@ -6817,9 +6775,9 @@ cluster MediaPlayback = 1286 { bitmap Feature : bitmap32 { kAdvancedSeek = 0x1; kVariableSpeed = 0x2; - kTextTracks = 0x3; - kAudioTracks = 0x4; - kAudioAdvance = 0x5; + kTextTracks = 0x4; + kAudioTracks = 0x8; + kAudioAdvance = 0x10; } struct TrackAttributesStruct { @@ -6933,7 +6891,7 @@ cluster MediaPlayback = 1286 { /** This cluster provides an interface for controlling Media Playback (PLAY, PAUSE, etc) on a media device such as a TV or Speaker. */ cluster MediaPlayback = 1286 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum CharacteristicEnum : enum8 { kForcedSubtitles = 0; @@ -6975,9 +6933,9 @@ cluster MediaPlayback = 1286 { bitmap Feature : bitmap32 { kAdvancedSeek = 0x1; kVariableSpeed = 0x2; - kTextTracks = 0x3; - kAudioTracks = 0x4; - kAudioAdvance = 0x5; + kTextTracks = 0x4; + kAudioTracks = 0x8; + kAudioAdvance = 0x10; } struct TrackAttributesStruct { @@ -8054,7 +8012,7 @@ cluster ApplicationBasic = 1293 { /** This cluster provides commands that facilitate user account login on a Content App or a node. For example, a Content App running on a Video Player device, which is represented as an endpoint (see [TV Architecture]), can use this cluster to help make the user account on the Content App match the user account on the Client. */ cluster AccountLogin = 1294 { - revision 1; // NOTE: Default/not specifically set + revision 2; critical event LoggedOut = 0 { optional node_id node = 0; @@ -8095,7 +8053,7 @@ cluster AccountLogin = 1294 { /** This cluster provides commands that facilitate user account login on a Content App or a node. For example, a Content App running on a Video Player device, which is represented as an endpoint (see [TV Architecture]), can use this cluster to help make the user account on the Content App match the user account on the Client. */ cluster AccountLogin = 1294 { - revision 1; // NOTE: Default/not specifically set + revision 2; critical event LoggedOut = 0 { optional node_id node = 0; @@ -8169,7 +8127,7 @@ endpoint 0 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -9067,7 +9025,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -9102,14 +9060,11 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport; - ram attribute sceneTableSize default = 16; - callback attribute fabricSceneInfo; callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 5; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; diff --git a/examples/placeholder/linux/apps/app2/config.zap b/examples/placeholder/linux/apps/app2/config.zap index 123c98df9d5881..87f25fcac3ef37 100644 --- a/examples/placeholder/linux/apps/app2/config.zap +++ b/examples/placeholder/linux/apps/app2/config.zap @@ -211,10 +211,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -12771,10 +12771,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -13343,54 +13343,6 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, - { - "name": "SceneTableSize", - "code": 6, - "mfgCode": null, - "side": "server", - "type": "int16u", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "16", - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, - { - "name": "FabricSceneInfo", - "code": 7, - "mfgCode": null, - "side": "server", - "type": "array", - "included": 1, - "storageOption": "External", - "singleton": 0, - "bounded": 0, - "defaultValue": null, - "reportable": 1, - "minInterval": 1, - "maxInterval": 65534, - "reportableChange": 0 - }, { "name": "GeneratedCommandList", "code": 65528, @@ -13449,7 +13401,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -13465,7 +13417,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "5", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp index 9cfddd6f3de9fa..8bbae5e1978097 100644 --- a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp +++ b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.cpp @@ -28,10 +28,4 @@ bool AmebaTestEventTriggerDelegate::DoesEnableKeyMatch(const ByteSpan & enableKe return !mEnableKey.empty() && mEnableKey.data_equal(enableKey); } -CHIP_ERROR AmebaTestEventTriggerDelegate::HandleEventTrigger(uint64_t eventTrigger) -{ - bool success = emberAfHandleEventTrigger(eventTrigger); - return success ? CHIP_NO_ERROR : CHIP_ERROR_INVALID_ARGUMENT; -} - } // namespace chip diff --git a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h index d461194de9b642..9e770406303645 100644 --- a/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h +++ b/examples/platform/ameba/test_event_trigger/AmebaTestEventTriggerDelegate.h @@ -18,15 +18,38 @@ #pragma once -#include "SmokeCOAlarmManager.h" +#include + #include +#include +#include +#include + +/** + * @brief User handler for handling the test event trigger + * + * @note If TestEventTrigger is enabled, it needs to be implemented in the app + * + * @param eventTrigger Event trigger to handle + * + * @warning *** DO NOT USE FOR STANDARD CLUSTER EVENT TRIGGERS *** + * + * TODO(#31723): Rename `emberAfHandleEventTrigger` to `AmebaHandleGlobalTestEventTrigger` + * + * @retval true on success + * @retval false if error happened + */ +bool emberAfHandleEventTrigger(uint64_t eventTrigger); namespace chip { -class AmebaTestEventTriggerDelegate : public TestEventTriggerDelegate +class AmebaTestEventTriggerDelegate : public TestEventTriggerDelegate, TestEventTriggerHandler { public: - explicit AmebaTestEventTriggerDelegate(const ByteSpan & enableKey) : mEnableKey(enableKey) {} + explicit AmebaTestEventTriggerDelegate(const ByteSpan & enableKey) : mEnableKey(enableKey) + { + VerifyOrDie(AddHandler(this) == CHIP_NO_ERROR); + } /** * @brief Checks to see if `enableKey` provided matches value chosen by the manufacturer. @@ -35,27 +58,14 @@ class AmebaTestEventTriggerDelegate : public TestEventTriggerDelegate */ bool DoesEnableKeyMatch(const ByteSpan & enableKey) const override; - /** - * @brief User handler for handling the test event trigger based on `eventTrigger` provided. - * @param eventTrigger Event trigger to handle. - * @return CHIP_NO_ERROR on success or CHIP_ERROR_INVALID_ARGUMENT on failure. - */ - CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override; + CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override + { + // WARNING: LEGACY SUPPORT ONLY, DO NOT EXTEND FOR STANDARD CLUSTERS + return (emberAfHandleEventTrigger(eventTrigger)) ? CHIP_NO_ERROR : CHIP_ERROR_INVALID_ARGUMENT; + } private: ByteSpan mEnableKey; }; } // namespace chip - -/** - * @brief User handler for handling the test event trigger - * - * @note If TestEventTrigger is enabled, it needs to be implemented in the app - * - * @param eventTrigger Event trigger to handle - * - * @retval true on success - * @retval false if error happened - */ -bool emberAfHandleEventTrigger(uint64_t eventTrigger); diff --git a/examples/platform/esp32/Rpc.cpp b/examples/platform/esp32/Rpc.cpp index 57f01b8f60b2ae..61efb842f089b7 100644 --- a/examples/platform/esp32/Rpc.cpp +++ b/examples/platform/esp32/Rpc.cpp @@ -33,6 +33,10 @@ #include "pigweed/rpc_services/Attributes.h" #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE +#include "pigweed/rpc_services/BooleanState.h" +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE #if CONFIG_DEVICE_TYPE_M5STACK #include "ScreenManager.h" @@ -275,6 +279,10 @@ StackType_t sRpcTaskStack[RPC_TASK_STACK_SIZE]; Attributes attributes_service; #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE +BooleanState boolean_state_service; +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE Esp32Button button_service; #endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE @@ -309,6 +317,10 @@ void RegisterServices(pw::rpc::Server & server) server.RegisterService(attributes_service); #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + server.RegisterService(boolean_state_service); +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE server.RegisterService(button_service); #endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE diff --git a/examples/platform/esp32/common/Esp32AppServer.cpp b/examples/platform/esp32/common/Esp32AppServer.cpp index 8baafcb458a2d7..b60685d34debca 100644 --- a/examples/platform/esp32/common/Esp32AppServer.cpp +++ b/examples/platform/esp32/common/Esp32AppServer.cpp @@ -19,8 +19,9 @@ #include "Esp32AppServer.h" #include "CHIPDeviceManager.h" #include +#include #include -#include +#include #include #include #include @@ -141,7 +142,8 @@ void Esp32AppServer::DeInitBLEIfCommissioned(void) #if CONFIG_IDF_TARGET_ESP32 err |= esp_bt_mem_release(ESP_BT_MODE_BTDM); -#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32H2 +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32H2 || \ + CONFIG_IDF_TARGET_ESP32C6 err |= esp_bt_mem_release(ESP_BT_MODE_BLE); #endif @@ -168,8 +170,11 @@ void Esp32AppServer::Init(AppDelegate * sAppDelegate) ESP_LOGE(TAG, "Failed to convert the EnableKey string to octstr type value"); memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; #endif // CONFIG_TEST_EVENT_TRIGGER_ENABLED (void) initParams.InitializeStaticResourcesBeforeServerInit(); if (sAppDelegate != nullptr) diff --git a/examples/platform/linux/AppMain.cpp b/examples/platform/linux/AppMain.cpp index 56098c7c490548..061d7b66c5e4c6 100644 --- a/examples/platform/linux/AppMain.cpp +++ b/examples/platform/linux/AppMain.cpp @@ -75,16 +75,19 @@ #endif #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR -#include +#include #endif #if CHIP_DEVICE_CONFIG_ENABLE_SMOKE_CO_TRIGGER -#include +#include #endif #if CHIP_DEVICE_CONFIG_ENABLE_BOOLEAN_STATE_CONFIGURATION_TRIGGER -#include +#include #endif #if CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER -#include +#include +#endif +#if CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER +#include #endif #include @@ -193,23 +196,24 @@ void InitNetworkCommissioning() emberAfEndpointEnableDisable(sSecondaryNetworkCommissioningEndpoint.Value(), false); } - const bool kThreadEnabled = { + bool isThreadEnabled = false; #if CHIP_APP_MAIN_HAS_THREAD_DRIVER - LinuxDeviceOptions::GetInstance().mThread -#else - false -#endif - }; + isThreadEnabled = LinuxDeviceOptions::GetInstance().mThread; +#endif // CHIP_APP_MAIN_HAS_THREAD_DRIVER - const bool kWiFiEnabled = { + bool isWiFiEnabled = false; #if CHIP_APP_MAIN_HAS_WIFI_DRIVER - LinuxDeviceOptions::GetInstance().mWiFi -#else - false -#endif - }; + isWiFiEnabled = LinuxDeviceOptions::GetInstance().mWiFi; - if (kThreadEnabled && kWiFiEnabled) + // On Linux, command-line indicates whether Wi-Fi is supported since determining it from + // the OS level is not easily portable. +#if CHIP_DEVICE_LAYER_TARGET_LINUX + sWiFiDriver.Set5gSupport(LinuxDeviceOptions::GetInstance().wifiSupports5g); +#endif // CHIP_DEVICE_LAYER_TARGET_LINUX + +#endif // CHIP_APP_MAIN_HAS_WIFI_DRIVER + + if (isThreadEnabled && isWiFiEnabled) { if (sSecondaryNetworkCommissioningEndpoint.HasValue()) { @@ -224,11 +228,11 @@ void InitNetworkCommissioning() EnableThreadNetworkCommissioning(); } } - else if (kThreadEnabled) + else if (isThreadEnabled) { EnableThreadNetworkCommissioning(); } - else if (kWiFiEnabled) + else if (isWiFiEnabled) { EnableWiFiNetworkCommissioning(kRootEndpointId); } @@ -327,34 +331,13 @@ static bool EnsureWiFiIsStarted() } #endif -class SampleTestEventTriggerDelegate : public TestEventTriggerDelegate +class SampleTestEventTriggerHandler : public TestEventTriggerHandler { -public: - /// NOTE: If you copy this, please use the reserved range FFFF_FFFF__xxxx for your trigger codes. + /// NOTE: If you copy this for NON-STANDARD CLUSTERS OR USAGES, please use the reserved range FFFF_FFFF__xxxx for your + /// trigger codes. NOTE: Standard codes are _xxxx_xxxx_xxxx. static constexpr uint64_t kSampleTestEventTriggerAlwaysSuccess = static_cast(0xFFFF'FFFF'FFF1'0000ull); - SampleTestEventTriggerDelegate() { memset(&mEnableKey[0], 0, sizeof(mEnableKey)); } - - /** - * @brief Initialize the delegate with a key and an optional other handler - * - * The `otherDelegate` will be called if there is no match of the eventTrigger - * when HandleEventTrigger is called, if it is non-null. - * - * @param enableKey - EnableKey to use for this instance. - * @param otherDelegate - Other delegate (e.g. OTA delegate) where defer trigger. Can be nullptr - * @return CHIP_NO_ERROR on success, CHIP_ERROR_INVALID_ARGUMENT if enableKey is wrong size. - */ - CHIP_ERROR Init(ByteSpan enableKey, TestEventTriggerDelegate * otherDelegate) - { - VerifyOrReturnError(enableKey.size() == sizeof(mEnableKey), CHIP_ERROR_INVALID_ARGUMENT); - mOtherDelegate = otherDelegate; - MutableByteSpan ourEnableKeySpan(mEnableKey); - return CopySpanToMutableSpan(enableKey, ourEnableKeySpan); - } - - bool DoesEnableKeyMatch(const ByteSpan & enableKey) const override { return enableKey.data_equal(ByteSpan(mEnableKey)); } - +public: CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override { ChipLogProgress(Support, "Saw TestEventTrigger: " ChipLogFormatX64, ChipLogValueX64(eventTrigger)); @@ -366,12 +349,8 @@ class SampleTestEventTriggerDelegate : public TestEventTriggerDelegate return CHIP_NO_ERROR; } - return (mOtherDelegate != nullptr) ? mOtherDelegate->HandleEventTrigger(eventTrigger) : CHIP_ERROR_INVALID_ARGUMENT; + return CHIP_ERROR_INVALID_ARGUMENT; } - -private: - uint8_t mEnableKey[TestEventTriggerDelegate::kEnableKeyLength]; - TestEventTriggerDelegate * mOtherDelegate = nullptr; }; int ChipLinuxAppInit(int argc, char * const argv[], OptionSet * customOptions, @@ -545,38 +524,36 @@ void ChipLinuxAppMainLoop(AppMainLoopImplementation * impl) initParams.operationalKeystore = &LinuxDeviceOptions::GetInstance().mCSRResponseOptions.badCsrOperationalKeyStoreForTest; } - TestEventTriggerDelegate * otherDelegate = nullptr; + // For general testing of TestEventTrigger, we have a common "core" event trigger delegate. + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate; + static SampleTestEventTriggerHandler sTestEventTriggerHandler; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey)) == + CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sTestEventTriggerHandler) == CHIP_NO_ERROR); + #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR // We want to allow triggering OTA queries if OTA requestor is enabled - static OTATestEventTriggerDelegate otaTestEventTriggerDelegate{ ByteSpan( - LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey) }; - otherDelegate = &otaTestEventTriggerDelegate; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler; + sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler); #endif #if CHIP_DEVICE_CONFIG_ENABLE_SMOKE_CO_TRIGGER - static SmokeCOTestEventTriggerDelegate smokeCOTestEventTriggerDelegate{ - ByteSpan(LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey), otherDelegate - }; - otherDelegate = &smokeCOTestEventTriggerDelegate; + static SmokeCOTestEventTriggerHandler sSmokeCOTestEventTriggerHandler; + sTestEventTriggerDelegate.AddHandler(&sSmokeCOTestEventTriggerHandler); #endif #if CHIP_DEVICE_CONFIG_ENABLE_BOOLEAN_STATE_CONFIGURATION_TRIGGER - static BooleanStateConfigurationTestEventTriggerDelegate booleanStateConfigurationTestEventTriggerDelegate{ - ByteSpan(LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey), otherDelegate - }; - otherDelegate = &booleanStateConfigurationTestEventTriggerDelegate; + static BooleanStateConfigurationTestEventTriggerHandler sBooleanStateConfigurationTestEventTriggerHandler; + sTestEventTriggerDelegate.AddHandler(&sBooleanStateConfigurationTestEventTriggerHandler); #endif #if CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER - static EnergyEvseTestEventTriggerDelegate energyEvseTestEventTriggerDelegate{ - ByteSpan(LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey), otherDelegate - }; - otherDelegate = &energyEvseTestEventTriggerDelegate; + static EnergyEvseTestEventTriggerHandler sEnergyEvseTestEventTriggerHandler; + sTestEventTriggerDelegate.AddHandler(&sEnergyEvseTestEventTriggerHandler); +#endif +#if CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER + static EnergyReportingTestEventTriggerHandler sEnergyReportingTestEventTriggerHandler; + sTestEventTriggerDelegate.AddHandler(&sEnergyReportingTestEventTriggerHandler); #endif - // For general testing of TestEventTrigger, we have a common "core" event trigger delegate. - static SampleTestEventTriggerDelegate testEventTriggerDelegate; - VerifyOrDie(testEventTriggerDelegate.Init(ByteSpan(LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey), - otherDelegate) == CHIP_NO_ERROR); - - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; // We need to set DeviceInfoProvider before Server::Init to setup the storage of DeviceInfoProvider properly. DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider); diff --git a/examples/platform/linux/BUILD.gn b/examples/platform/linux/BUILD.gn index fbbf7e1833894e..8cf00c5be5e62c 100644 --- a/examples/platform/linux/BUILD.gn +++ b/examples/platform/linux/BUILD.gn @@ -23,6 +23,7 @@ declare_args() { chip_enable_smoke_co_trigger = false chip_enable_boolean_state_configuration_trigger = false chip_enable_energy_evse_trigger = false + chip_enable_energy_reporting_trigger = false } config("app-main-config") { @@ -31,20 +32,24 @@ config("app-main-config") { source_set("ota-test-event-trigger") { sources = [ - "${chip_root}/src/app/clusters/ota-requestor/OTATestEventTriggerDelegate.h", + "${chip_root}/src/app/clusters/ota-requestor/OTATestEventTriggerHandler.h", ] } source_set("smco-test-event-trigger") { - sources = [ "${chip_root}/src/app/clusters/smoke-co-alarm-server/SmokeCOTestEventTriggerDelegate.h" ] + sources = [ "${chip_root}/src/app/clusters/smoke-co-alarm-server/SmokeCOTestEventTriggerHandler.h" ] } source_set("boolean-state-configuration-test-event-trigger") { - sources = [ "${chip_root}/src/app/clusters/boolean-state-configuration-server/BooleanStateConfigurationTestEventTriggerDelegate.h" ] + sources = [ "${chip_root}/src/app/clusters/boolean-state-configuration-server/BooleanStateConfigurationTestEventTriggerHandler.h" ] } source_set("energy-evse-test-event-trigger") { - sources = [ "${chip_root}/src/app/clusters/energy-evse-server/EnergyEvseTestEventTriggerDelegate.h" ] + sources = [ "${chip_root}/src/app/clusters/energy-evse-server/EnergyEvseTestEventTriggerHandler.h" ] +} + +source_set("energy-reporting-test-event-trigger") { + sources = [ "${chip_root}/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerHandler.h" ] } source_set("app-main") { @@ -71,6 +76,7 @@ source_set("app-main") { public_deps = [ ":boolean-state-configuration-test-event-trigger", ":energy-evse-test-event-trigger", + ":energy-reporting-test-event-trigger", ":smco-test-event-trigger", "${chip_root}/src/lib", "${chip_root}/src/platform/logging:force_stdio", @@ -110,6 +116,7 @@ source_set("app-main") { "CHIP_DEVICE_CONFIG_ENABLE_SMOKE_CO_TRIGGER=${chip_enable_smoke_co_trigger}", "CHIP_DEVICE_CONFIG_ENABLE_BOOLEAN_STATE_CONFIGURATION_TRIGGER=${chip_enable_boolean_state_configuration_trigger}", "CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER=${chip_enable_energy_evse_trigger}", + "CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER=${chip_enable_energy_reporting_trigger}", ] public_configs = [ ":app-main-config" ] diff --git a/examples/platform/linux/Options.cpp b/examples/platform/linux/Options.cpp index 4c6791a178e48e..8398c728762bc9 100644 --- a/examples/platform/linux/Options.cpp +++ b/examples/platform/linux/Options.cpp @@ -90,6 +90,7 @@ enum #if CONFIG_BUILD_FOR_HOST_UNIT_TEST kDeviceOption_SubscriptionCapacity = 0x1024, #endif + kDeviceOption_WiFiSupports5g = 0x1025 }; constexpr unsigned kAppUsageLength = 64; @@ -100,6 +101,7 @@ OptionDef sDeviceOptionDefs[] = { #endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE #if CHIP_DEVICE_CONFIG_ENABLE_WIFI { "wifi", kNoArgument, kDeviceOption_WiFi }, + { "wifi-supports-5g", kNoArgument, kDeviceOption_WiFiSupports5g }, #endif // CHIP_DEVICE_CONFIG_ENABLE_WPA #if CHIP_ENABLE_OPENTHREAD { "thread", kNoArgument, kDeviceOption_Thread }, @@ -161,8 +163,13 @@ const char * sDeviceOptionHelp = #if CHIP_DEVICE_CONFIG_ENABLE_WPA "\n" " --wifi\n" - " Enable WiFi management via wpa_supplicant.\n" + " Enable Wi-Fi management via wpa_supplicant.\n" #endif // CHIP_DEVICE_CONFIG_ENABLE_WPA +#if CHIP_DEVICE_CONFIG_ENABLE_WIFI + "\n" + " --wifi-supports-5g\n" + " Indicate that local Wi-Fi hardware should report 5GHz support.\n" +#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI #if CHIP_ENABLE_OPENTHREAD "\n" " --thread\n" @@ -311,6 +318,10 @@ bool HandleOption(const char * aProgram, OptionSet * aOptions, int aIdentifier, LinuxDeviceOptions::GetInstance().mWiFi = true; break; + case kDeviceOption_WiFiSupports5g: + LinuxDeviceOptions::GetInstance().wifiSupports5g = true; + break; + case kDeviceOption_Thread: LinuxDeviceOptions::GetInstance().mThread = true; break; diff --git a/examples/platform/linux/Options.h b/examples/platform/linux/Options.h index 784c8d11ef1231..ca8082b5dcdc54 100644 --- a/examples/platform/linux/Options.h +++ b/examples/platform/linux/Options.h @@ -46,6 +46,7 @@ struct LinuxDeviceOptions chip::Optional> spake2pSalt; uint32_t spake2pIterations = 0; // When not provided (0), will default elsewhere uint32_t mBleDevice = 0; + bool wifiSupports5g = false; bool mWiFi = false; bool mThread = false; #if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE || CHIP_DEVICE_ENABLE_PORT_PARAMS diff --git a/examples/platform/linux/Rpc.cpp b/examples/platform/linux/Rpc.cpp index f45df32d750a81..da6b73b9135c13 100644 --- a/examples/platform/linux/Rpc.cpp +++ b/examples/platform/linux/Rpc.cpp @@ -26,6 +26,10 @@ #include "pigweed/rpc_services/Attributes.h" #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE +#include "pigweed/rpc_services/BooleanState.h" +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_DESCRIPTOR_SERVICE) && PW_RPC_DESCRIPTOR_SERVICE #include "pigweed/rpc_services/Descriptor.h" #endif // defined(PW_RPC_DESCRIPTOR_SERVICE) && PW_RPC_DESCRIPTOR_SERVICE @@ -68,6 +72,10 @@ namespace { Attributes attributes_service; #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE +BooleanState boolean_state_service; +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_DESCRIPTOR_SERVICE) && PW_RPC_DESCRIPTOR_SERVICE Descriptor descriptor_service; #endif // defined(PW_RPC_DESCRIPTOR_SERVICE) && PW_RPC_DESCRIPTOR_SERVICE @@ -90,6 +98,10 @@ void RegisterServices(pw::rpc::Server & server) server.RegisterService(attributes_service); #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + server.RegisterService(boolean_state_service); +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_DESCRIPTOR_SERVICE) && PW_RPC_DESCRIPTOR_SERVICE server.RegisterService(descriptor_service); #endif // defined(PW_RPC_DESCRIPTOR_SERVICE) && PW_RPC_DESCRIPTOR_SERVICE diff --git a/examples/platform/linux/system_rpc_server.cc b/examples/platform/linux/system_rpc_server.cc index fc44cb30478ee0..c4e45be56360a6 100644 --- a/examples/platform/linux/system_rpc_server.cc +++ b/examples/platform/linux/system_rpc_server.cc @@ -25,8 +25,9 @@ #include #include "pw_assert/check.h" +#include "pw_hdlc/decoder.h" +#include "pw_hdlc/default_addresses.h" #include "pw_hdlc/rpc_channel.h" -#include "pw_hdlc/rpc_packets.h" #include "pw_log/log.h" #include "pw_rpc_system_server/rpc_server.h" #include "pw_stream/socket_stream.h" diff --git a/examples/platform/mbed/util/PigweedLogger.cpp b/examples/platform/mbed/util/PigweedLogger.cpp index 1fefd2d614afba..d1c9afbbf0c435 100644 --- a/examples/platform/mbed/util/PigweedLogger.cpp +++ b/examples/platform/mbed/util/PigweedLogger.cpp @@ -28,6 +28,7 @@ #include #include +#include #include namespace PigweedLogger { diff --git a/examples/platform/nrfconnect/Rpc.cpp b/examples/platform/nrfconnect/Rpc.cpp index ec21fd7e379f05..8b47215d6a0680 100644 --- a/examples/platform/nrfconnect/Rpc.cpp +++ b/examples/platform/nrfconnect/Rpc.cpp @@ -32,6 +32,10 @@ LOG_MODULE_DECLARE(app, CONFIG_CHIP_APP_LOG_LEVEL); #include "pigweed/rpc_services/Attributes.h" #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE +#include "pigweed/rpc_services/BooleanState.h" +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE #include "pigweed/rpc_services/Button.h" #endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE @@ -139,6 +143,10 @@ struct k_thread rpc_thread_data; Attributes attributes_service; #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE +BooleanState boolean_state_service; +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE NrfButton button_service; #endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE @@ -177,6 +185,10 @@ void RegisterServices(pw::rpc::Server & server) server.RegisterService(attributes_service); #endif // defined(PW_RPC_ATTRIBUTE_SERVICE) && PW_RPC_ATTRIBUTE_SERVICE +#if defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + server.RegisterService(boolean_state_service); +#endif // defined(PW_RPC_BOOLEAN_STATE_SERVICE) && PW_RPC_BOOLEAN_STATE_SERVICE + #if defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE server.RegisterService(button_service); #endif // defined(PW_RPC_BUTTON_SERVICE) && PW_RPC_BUTTON_SERVICE diff --git a/examples/platform/nxp/se05x/linux/AppMain.cpp b/examples/platform/nxp/se05x/linux/AppMain.cpp index 2c04b81b0ce8bb..bd13e249683fcb 100644 --- a/examples/platform/nxp/se05x/linux/AppMain.cpp +++ b/examples/platform/nxp/se05x/linux/AppMain.cpp @@ -69,7 +69,8 @@ #endif // CHIP_CONFIG_TRANSPORT_TRACE_ENABLED #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR -#include +#include +#include #endif #include @@ -315,9 +316,12 @@ void ChipLinuxAppMainLoop(AppMainLoopImplementation * impl) } #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan( - LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey) }; - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey)) == + CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; #endif // We need to set DeviceInfoProvider before Server::Init to setup the storage of DeviceInfoProvider properly. diff --git a/examples/platform/nxp/se05x/linux/BUILD.gn b/examples/platform/nxp/se05x/linux/BUILD.gn index 2a93a4bf085a3e..a5efe460745ddd 100644 --- a/examples/platform/nxp/se05x/linux/BUILD.gn +++ b/examples/platform/nxp/se05x/linux/BUILD.gn @@ -25,7 +25,7 @@ config("app-main-config") { source_set("ota-test-event-trigger") { sources = [ - "${chip_root}/src/app/clusters/ota-requestor/OTATestEventTriggerDelegate.h", + "${chip_root}/src/app/clusters/ota-requestor/OTATestEventTriggerHandler.h", ] } diff --git a/examples/platform/silabs/BaseApplication.cpp b/examples/platform/silabs/BaseApplication.cpp index e0789f0d0d0071..99acb26d9bd26e 100644 --- a/examples/platform/silabs/BaseApplication.cpp +++ b/examples/platform/silabs/BaseApplication.cpp @@ -458,11 +458,7 @@ void BaseApplication::ButtonHandler(AppEvent * aEvent) // - Cycle LCD screen CancelFunctionTimer(); - OutputQrCode(false); -#ifdef DISPLAY_ENABLED - UpdateLCDStatusScreen(); - slLCD.CycleScreens(); -#endif + AppTask::GetAppTask().UpdateDisplay(); #ifdef SL_WIFI if (!ConnectivityMgr().IsWiFiStationProvisioned()) @@ -485,7 +481,7 @@ void BaseApplication::ButtonHandler(AppEvent * aEvent) #if CHIP_CONFIG_ENABLE_ICD_SERVER // Temporarily claim network activity, until we implement a "user trigger" reason for ICD wakeups. PlatformMgr().LockChipStack(); - ICDNotifier::GetInstance().BroadcastNetworkActivityNotification(); + ICDNotifier::GetInstance().NotifyNetworkActivityNotification(); PlatformMgr().UnlockChipStack(); #endif // CHIP_CONFIG_ENABLE_ICD_SERVER } @@ -493,6 +489,15 @@ void BaseApplication::ButtonHandler(AppEvent * aEvent) } } +void BaseApplication::UpdateDisplay() +{ + OutputQrCode(false); +#ifdef DISPLAY_ENABLED + UpdateLCDStatusScreen(); + slLCD.CycleScreens(); +#endif +} + void BaseApplication::CancelFunctionTimer() { if (xTimerStop(sFunctionTimer, pdMS_TO_TICKS(0)) == pdFAIL) diff --git a/examples/platform/silabs/BaseApplication.h b/examples/platform/silabs/BaseApplication.h index 0bde0e76f227a2..b38f0e58e1c305 100644 --- a/examples/platform/silabs/BaseApplication.h +++ b/examples/platform/silabs/BaseApplication.h @@ -105,6 +105,11 @@ class BaseApplication */ static void PostEvent(const AppEvent * event); + /** + * @brief Overridable function used to update display on button press + */ + virtual void UpdateDisplay(); + #ifdef DISPLAY_ENABLED /** * @brief Return LCD object diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp index 1197e4d48cd83b..3a78cf774c8c5a 100644 --- a/examples/platform/silabs/MatterConfig.cpp +++ b/examples/platform/silabs/MatterConfig.cpp @@ -219,8 +219,9 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName) SILABS_LOG("Failed to convert the EnableKey string to octstr type value"); memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey)); } - static SilabsTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + // TODO(#31723): Show to customers that they can do `Server::GetInstance().GetTestEventTriggerDelegate().AddHandler()` + static SilabsTestEventTriggerDelegate sTestEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; #endif // SILABS_TEST_EVENT_TRIGGER_ENABLED #if CHIP_CRYPTO_PLATFORM && !(defined(SIWX_917)) @@ -232,8 +233,9 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName) #ifdef PERFORMANCE_TEST_ENABLED // Set up Test Event Trigger command of the General Diagnostics cluster. Used only in performance testing - static SilabsTestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(kTestEventTriggerEnableKey) }; - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + // TODO(#31723): Show to customers that they can do `Server::GetInstance().GetTestEventTriggerDelegate().AddHandler()` + static SilabsTestEventTriggerDelegate sTestEventTriggerDelegate{ ByteSpan(kTestEventTriggerEnableKey) }; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; #endif // Initialize the remaining (not overridden) providers to the SDK example defaults diff --git a/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp b/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp index f231067cec851b..f9a11df74d7ae9 100644 --- a/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp +++ b/examples/platform/silabs/SilabsTestEventTriggerDelegate.cpp @@ -27,10 +27,4 @@ bool SilabsTestEventTriggerDelegate::DoesEnableKeyMatch(const ByteSpan & enableK return !mEnableKey.empty() && mEnableKey.data_equal(enableKey); } -CHIP_ERROR SilabsTestEventTriggerDelegate::HandleEventTrigger(uint64_t eventTrigger) -{ - bool success = emberAfHandleEventTrigger(eventTrigger); - return success ? CHIP_NO_ERROR : CHIP_ERROR_INVALID_ARGUMENT; -} - } // namespace chip diff --git a/examples/platform/silabs/SilabsTestEventTriggerDelegate.h b/examples/platform/silabs/SilabsTestEventTriggerDelegate.h index e9cd62fb813e50..03ceabd69a7898 100644 --- a/examples/platform/silabs/SilabsTestEventTriggerDelegate.h +++ b/examples/platform/silabs/SilabsTestEventTriggerDelegate.h @@ -18,14 +18,38 @@ #pragma once +#include + #include +#include +#include +#include + +/** + * @brief User handler for handling the test event trigger + * + * @note If TestEventTrigger is enabled, it needs to be implemented in the app + * + * @param eventTrigger Event trigger to handle + * + * @warning *** DO NOT USE FOR STANDARD CLUSTER EVENT TRIGGERS *** + * + * TODO(#31723): Rename `emberAfHandleEventTrigger` to `SilabsHandleGlobalTestEventTrigger` + * + * @retval true on success + * @retval false if error happened + */ +bool emberAfHandleEventTrigger(uint64_t eventTrigger); namespace chip { -class SilabsTestEventTriggerDelegate : public TestEventTriggerDelegate +class SilabsTestEventTriggerDelegate : public TestEventTriggerDelegate, TestEventTriggerHandler { public: - explicit SilabsTestEventTriggerDelegate(const ByteSpan & enableKey) : mEnableKey(enableKey) {} + explicit SilabsTestEventTriggerDelegate(const ByteSpan & enableKey) : mEnableKey(enableKey) + { + VerifyOrDie(AddHandler(this) == CHIP_NO_ERROR); + } /** * @brief Checks to see if `enableKey` provided matches value chosen by the manufacturer. @@ -35,26 +59,19 @@ class SilabsTestEventTriggerDelegate : public TestEventTriggerDelegate bool DoesEnableKeyMatch(const ByteSpan & enableKey) const override; /** - * @brief User handler for handling the test event trigger based on `eventTrigger` provided. - * @param eventTrigger Event trigger to handle. - * @return CHIP_NO_ERROR on success or CHIP_ERROR_INVALID_ARGUMENT on failure. + * @brief Delegates handling to global `emberAfHandleEventTrigger` function. DO NOT EXTEND. + * + * @param eventTrigger - trigger to process. + * @return CHIP_NO_ERROR if properly handled, else another CHIP_ERROR. */ - CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override; + CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override + { + // WARNING: LEGACY SUPPORT ONLY, DO NOT EXTEND FOR STANDARD CLUSTERS + return (emberAfHandleEventTrigger(eventTrigger)) ? CHIP_NO_ERROR : CHIP_ERROR_INVALID_ARGUMENT; + } private: ByteSpan mEnableKey; }; } // namespace chip - -/** - * @brief User handler for handling the test event trigger - * - * @note If TestEventTrigger is enabled, it needs to be implemented in the app - * - * @param eventTrigger Event trigger to handle - * - * @retval true on success - * @retval false if error happened - */ -bool emberAfHandleEventTrigger(uint64_t eventTrigger); diff --git a/examples/platform/silabs/display/lcd.h b/examples/platform/silabs/display/lcd.h index b6f3fc9a0669fc..703e72ab6ea61f 100644 --- a/examples/platform/silabs/display/lcd.h +++ b/examples/platform/silabs/display/lcd.h @@ -71,6 +71,7 @@ class SilabsLCD void SetScreen(Screen_e screen); void CycleScreens(void); void SetStatus(DisplayStatus_t & status); + void WriteStatus(); #ifdef QR_CODE_ENABLED void SetQRCode(uint8_t * str, uint32_t size); @@ -85,7 +86,6 @@ class SilabsLCD } DemoState_t; void WriteDemoUI(); - void WriteStatus(); #ifdef QR_CODE_ENABLED void WriteQRCode(); diff --git a/examples/providers/DeviceInfoProviderImpl.cpp b/examples/providers/DeviceInfoProviderImpl.cpp index 5524b770c0585a..7b07561c2caf98 100644 --- a/examples/providers/DeviceInfoProviderImpl.cpp +++ b/examples/providers/DeviceInfoProviderImpl.cpp @@ -100,8 +100,8 @@ bool DeviceInfoProviderImpl::FixedLabelIteratorImpl::Next(FixedLabelType & outpu VerifyOrReturnError(std::strlen(labelPtr) <= kMaxLabelNameLength, false); VerifyOrReturnError(std::strlen(valuePtr) <= kMaxLabelValueLength, false); - Platform::CopyString(mFixedLabelNameBuf, kMaxLabelNameLength + 1, labelPtr); - Platform::CopyString(mFixedLabelValueBuf, kMaxLabelValueLength + 1, valuePtr); + Platform::CopyString(mFixedLabelNameBuf, labelPtr); + Platform::CopyString(mFixedLabelValueBuf, valuePtr); output.label = CharSpan::fromCharString(mFixedLabelNameBuf); output.value = CharSpan::fromCharString(mFixedLabelValueBuf); diff --git a/examples/pump-app/nrfconnect/main/AppTask.cpp b/examples/pump-app/nrfconnect/main/AppTask.cpp index fa38eba254853a..329c8d95f64beb 100644 --- a/examples/pump-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-app/nrfconnect/main/AppTask.cpp @@ -25,7 +25,8 @@ #include #include -#include +#include +#include #include #include #include @@ -186,9 +187,12 @@ CHIP_ERROR AppTask::Init() #endif static CommonCaseDeviceServerInitParams initParams; - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams)); AppFabricTableDelegate::Init(); diff --git a/examples/pump-app/pump-common/pump-app.matter b/examples/pump-app/pump-common/pump-app.matter index acd97c8d5bb068..b944766326f35d 100644 --- a/examples/pump-app/pump-common/pump-app.matter +++ b/examples/pump-app/pump-common/pump-app.matter @@ -1647,7 +1647,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1923,7 +1923,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/pump-app/pump-common/pump-app.zap b/examples/pump-app/pump-common/pump-app.zap index 47060615ba022a..c98805b742ab37 100644 --- a/examples/pump-app/pump-common/pump-app.zap +++ b/examples/pump-app/pump-common/pump-app.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3461,10 +3461,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/pump-app/silabs/BUILD.gn b/examples/pump-app/silabs/BUILD.gn index f255000ea525d5..9b577950023bc0 100644 --- a/examples/pump-app/silabs/BUILD.gn +++ b/examples/pump-app/silabs/BUILD.gn @@ -171,6 +171,7 @@ silabs_executable("pump_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "$dir_pw_trace", diff --git a/examples/pump-app/silabs/README.md b/examples/pump-app/silabs/README.md index 9a6e4e2af9be8f..56e6ad938f82db 100644 --- a/examples/pump-app/silabs/README.md +++ b/examples/pump-app/silabs/README.md @@ -56,8 +56,9 @@ Labs platform. (For Mac OS X, `commander` is located inside `Commander.app/Contents/MacOS/`.) -- Download and install a suitable ARM gcc tool chain: - [GNU Arm Embedded Toolchain 9-2019-q4-major](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) +- Download and install a suitable ARM gcc tool chain (For most Host, the + bootstrap already installs the toolchain): + [GNU Arm Embedded Toolchain 12.2 Rel1](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - Install some additional tools (likely already present for CHIP developers): diff --git a/examples/pump-app/silabs/data_model/pump-thread-app.matter b/examples/pump-app/silabs/data_model/pump-thread-app.matter index 78f0e88073df49..43dcac8a086ab7 100644 --- a/examples/pump-app/silabs/data_model/pump-thread-app.matter +++ b/examples/pump-app/silabs/data_model/pump-thread-app.matter @@ -1647,7 +1647,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1923,7 +1923,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 1759c693e901d0..43860bd6587f11 100644 --- a/examples/pump-app/silabs/data_model/pump-thread-app.zap +++ b/examples/pump-app/silabs/data_model/pump-thread-app.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3461,10 +3461,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/pump-app/silabs/data_model/pump-wifi-app.matter b/examples/pump-app/silabs/data_model/pump-wifi-app.matter index 78f0e88073df49..43dcac8a086ab7 100644 --- a/examples/pump-app/silabs/data_model/pump-wifi-app.matter +++ b/examples/pump-app/silabs/data_model/pump-wifi-app.matter @@ -1647,7 +1647,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1923,7 +1923,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 1759c693e901d0..43860bd6587f11 100644 --- a/examples/pump-app/silabs/data_model/pump-wifi-app.zap +++ b/examples/pump-app/silabs/data_model/pump-wifi-app.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3461,10 +3461,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp index db96480e5acb9d..ca79a41160a9d2 100644 --- a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp @@ -25,7 +25,8 @@ #include #include -#include +#include +#include #include #include #include @@ -184,9 +185,12 @@ CHIP_ERROR AppTask::Init() #endif static CommonCaseDeviceServerInitParams initParams; - static OTATestEventTriggerDelegate testEventTriggerDelegate{ ByteSpan(sTestEventTriggerEnableKey) }; + static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{}; + static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{}; + VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR); + VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR); (void) initParams.InitializeStaticResourcesBeforeServerInit(); - initParams.testEventTriggerDelegate = &testEventTriggerDelegate; + initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate; ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams)); AppFabricTableDelegate::Init(); diff --git a/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter b/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter index efaad303eb0d5b..6995c3193c4322 100644 --- a/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter +++ b/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter @@ -1481,7 +1481,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1726,7 +1726,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 c62ef5889939b5..e6599d06c9ec70 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 @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3161,10 +3161,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter b/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter index e5fc026d45b4fd..d8f04c28aaece7 100644 --- a/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter +++ b/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter @@ -1032,7 +1032,7 @@ endpoint 0 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1275,7 +1275,7 @@ endpoint 1 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } @@ -1292,7 +1292,7 @@ endpoint 2 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1321,7 +1321,7 @@ endpoint 3 { callback attribute generatedCommandList; callback attribute acceptedCommandList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap b/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap index 2efab5f43b384c..4e53140434df25 100644 --- a/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap +++ b/examples/refrigerator-app/refrigerator-common/refrigerator-app.zap @@ -187,10 +187,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3036,10 +3036,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3235,10 +3235,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3566,10 +3566,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/rvc-app/rvc-common/rvc-app.matter b/examples/rvc-app/rvc-common/rvc-app.matter index 2579d7253054fb..6ed9387af4a2db 100644 --- a/examples/rvc-app/rvc-common/rvc-app.matter +++ b/examples/rvc-app/rvc-common/rvc-app.matter @@ -943,7 +943,7 @@ cluster RvcRunMode = 84 { } bitmap Feature : bitmap32 { - kOnOff = 0x1; + kNoFeatures = 0x0; } struct ModeTagStruct { @@ -959,7 +959,6 @@ cluster RvcRunMode = 84 { readonly attribute ModeOptionStruct supportedModes[] = 0; readonly attribute int8u currentMode = 1; - attribute optional nullable int8u onMode = 3; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -996,7 +995,7 @@ cluster RvcCleanMode = 85 { } bitmap Feature : bitmap32 { - kOnOff = 0x1; + kNoFeatures = 0x0; } struct ModeTagStruct { @@ -1012,7 +1011,6 @@ cluster RvcCleanMode = 85 { readonly attribute ModeOptionStruct supportedModes[] = 0; readonly attribute int8u currentMode = 1; - attribute optional nullable int8u onMode = 3; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1095,10 +1093,6 @@ cluster RvcOperationalState = 97 { /** Upon receipt, the device SHALL pause its operation if it is possible based on the current function of the server. */ command Pause(): OperationalCommandResponse = 0; - /** Upon receipt, the device SHALL stop its operation if it is at a position where it is safe to do so and/or permitted. */ - command Stop(): OperationalCommandResponse = 1; - /** Upon receipt, the device SHALL start its operation if it is safe to do so and the device is in an operational state from which it can be started. */ - command Start(): OperationalCommandResponse = 2; /** Upon receipt, the device SHALL resume its operation from the point it was at when it received the Pause command, or from the point when it was paused by means outside of this cluster (for example by manual button press). */ command Resume(): OperationalCommandResponse = 3; /** On receipt of this command, the device SHALL start seeking the charging dock, if possible in the current state of the device. */ @@ -1114,7 +1108,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1304,7 +1298,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/rvc-app/rvc-common/rvc-app.zap b/examples/rvc-app/rvc-common/rvc-app.zap index 8afe6df8ca4f33..d5c1431dded75b 100644 --- a/examples/rvc-app/rvc-common/rvc-app.zap +++ b/examples/rvc-app/rvc-common/rvc-app.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2238,10 +2238,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/smoke-co-alarm-app/silabs/BUILD.gn b/examples/smoke-co-alarm-app/silabs/BUILD.gn index 7750dc31f6324b..73b015ea232822 100644 --- a/examples/smoke-co-alarm-app/silabs/BUILD.gn +++ b/examples/smoke-co-alarm-app/silabs/BUILD.gn @@ -173,6 +173,7 @@ silabs_executable("smoke_co_alarm_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/efr32/lib/pw_rpc:pw_rpc", diff --git a/examples/smoke-co-alarm-app/silabs/README.md b/examples/smoke-co-alarm-app/silabs/README.md index d62ba82bc59ab4..b5548b69f24f54 100644 --- a/examples/smoke-co-alarm-app/silabs/README.md +++ b/examples/smoke-co-alarm-app/silabs/README.md @@ -18,6 +18,7 @@ An example showing the use of CHIP on the Silicon Labs EFR32 MG12 and MG24. - [Debug build / release build](#debug-build--release-build) - [Disabling LCD](#disabling-lcd) - [KVS maximum entry count](#kvs-maximum-entry-count) + - [Enabling test event trigger](#enabling-test-event-trigger)
@@ -54,8 +55,9 @@ Silicon Labs platform. (For Mac OS X, `commander` is located inside `Commander.app/Contents/MacOS/`.) -- Download and install a suitable ARM gcc tool chain: - [GNU Arm Embedded Toolchain 9-2019-q4-major](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) +- Download and install a suitable ARM gcc tool chain (For most Host, the + bootstrap already installs the toolchain): + [GNU Arm Embedded Toolchain 12.2 Rel1](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - Install some additional tools(likely already present for CHIP developers): diff --git a/examples/smoke-co-alarm-app/silabs/src/SmokeCoAlarmManager.cpp b/examples/smoke-co-alarm-app/silabs/src/SmokeCoAlarmManager.cpp index 85c8bca2193a67..7d64a036371a6f 100644 --- a/examples/smoke-co-alarm-app/silabs/src/SmokeCoAlarmManager.cpp +++ b/examples/smoke-co-alarm-app/silabs/src/SmokeCoAlarmManager.cpp @@ -21,7 +21,7 @@ #include "AppTask.h" #include -#include +#include #include using namespace chip; diff --git a/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter b/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter index 95582b5d2e4416..7ca0706457f11b 100644 --- a/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter +++ b/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter @@ -1753,9 +1753,6 @@ cluster IcdManagement = 70 { fabric_idx fabricIndex = 254; } - critical event OnTransitionToActiveMode = 0 { - } - readonly attribute int32u idleModeDuration = 0; readonly attribute int32u activeModeDuration = 1; readonly attribute int16u activeModeThreshold = 2; @@ -1922,7 +1919,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2263,7 +2260,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 e81864a5181d20..4cfe5ceb8ceca5 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 @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4206,10 +4206,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter index 774e1ed2e8e5bd..4ee09b5869aaa4 100644 --- a/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter +++ b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter @@ -1331,7 +1331,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -1593,7 +1593,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } 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 9803e8d34ec36a..01453667d4538c 100644 --- a/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap +++ b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3090,10 +3090,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/thermostat/nxp/zap/thermostat_matter_thread.matter b/examples/thermostat/nxp/zap/thermostat_matter_thread.matter index 1b0c9ec3bb7ffa..e554c32be1cfd3 100644 --- a/examples/thermostat/nxp/zap/thermostat_matter_thread.matter +++ b/examples/thermostat/nxp/zap/thermostat_matter_thread.matter @@ -1727,7 +1727,7 @@ cluster UserLabel = 65 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -1735,13 +1735,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -1763,14 +1756,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1781,7 +1769,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -1801,7 +1789,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -1840,7 +1828,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -1854,34 +1842,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -1890,7 +1850,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -1910,12 +1870,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** An interface for configuring and controlling the functionality of a thermostat. */ @@ -2308,7 +2264,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2607,7 +2563,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2652,11 +2608,10 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport; ram attribute sceneTableSize; callback attribute fabricSceneInfo; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 4; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; diff --git a/examples/thermostat/nxp/zap/thermostat_matter_thread.zap b/examples/thermostat/nxp/zap/thermostat_matter_thread.zap index 70d748edb09ca0..5099d34d8b6066 100644 --- a/examples/thermostat/nxp/zap/thermostat_matter_thread.zap +++ b/examples/thermostat/nxp/zap/thermostat_matter_thread.zap @@ -223,10 +223,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3848,10 +3848,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4478,25 +4478,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -4512,7 +4496,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -4536,7 +4520,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4552,7 +4536,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, diff --git a/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter b/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter index b89f05061ce2bf..43b09015e9a461 100644 --- a/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter +++ b/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter @@ -1638,7 +1638,7 @@ cluster UserLabel = 65 { /** Attributes and commands for scene configuration and manipulation. */ provisional cluster ScenesManagement = 98 { - revision 5; + revision 1; bitmap CopyModeBitmap : bitmap8 { kCopyAllScenes = 0x1; @@ -1646,13 +1646,6 @@ provisional cluster ScenesManagement = 98 { bitmap Feature : bitmap32 { kSceneNames = 0x1; - kExplicit = 0x2; - kTableSize = 0x4; - kFabricScenes = 0x8; - } - - bitmap NameSupportBitmap : bitmap8 { - kSceneNames = 0x80; } struct AttributeValuePair { @@ -1674,14 +1667,9 @@ provisional cluster ScenesManagement = 98 { fabric_idx fabricIndex = 254; } - readonly attribute optional int8u sceneCount = 0; - readonly attribute optional int8u currentScene = 1; - readonly attribute optional group_id currentGroup = 2; - readonly attribute optional boolean sceneValid = 3; - readonly attribute NameSupportBitmap nameSupport = 4; - readonly attribute optional nullable node_id lastConfiguredBy = 5; - readonly attribute int16u sceneTableSize = 6; - readonly attribute SceneInfoStruct fabricSceneInfo[] = 7; + readonly attribute optional nullable node_id lastConfiguredBy = 0; + readonly attribute int16u sceneTableSize = 1; + readonly attribute SceneInfoStruct fabricSceneInfo[] = 2; readonly attribute command_id generatedCommandList[] = 65528; readonly attribute command_id acceptedCommandList[] = 65529; readonly attribute event_id eventList[] = 65530; @@ -1692,7 +1680,7 @@ provisional cluster ScenesManagement = 98 { request struct AddSceneRequest { group_id groupID = 0; int8u sceneID = 1; - int16u transitionTime = 2; + int32u transitionTime = 2; char_string sceneName = 3; ExtensionFieldSet extensionFieldSets[] = 4; } @@ -1712,7 +1700,7 @@ provisional cluster ScenesManagement = 98 { status status = 0; group_id groupID = 1; int8u sceneID = 2; - optional int16u transitionTime = 3; + optional int32u transitionTime = 3; optional char_string sceneName = 4; optional ExtensionFieldSet extensionFieldSets[] = 5; } @@ -1751,7 +1739,7 @@ provisional cluster ScenesManagement = 98 { request struct RecallSceneRequest { group_id groupID = 0; int8u sceneID = 1; - optional nullable int16u transitionTime = 2; + optional nullable int32u transitionTime = 2; } request struct GetSceneMembershipRequest { @@ -1765,34 +1753,6 @@ provisional cluster ScenesManagement = 98 { optional int8u sceneList[] = 3; } - request struct EnhancedAddSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - int16u transitionTime = 2; - char_string sceneName = 3; - ExtensionFieldSet extensionFieldSets[] = 4; - } - - response struct EnhancedAddSceneResponse = 64 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - } - - request struct EnhancedViewSceneRequest { - group_id groupID = 0; - int8u sceneID = 1; - } - - response struct EnhancedViewSceneResponse = 65 { - status status = 0; - group_id groupID = 1; - int8u sceneID = 2; - optional int16u transitionTime = 3; - optional char_string sceneName = 4; - optional ExtensionFieldSet extensionFieldSets[] = 5; - } - request struct CopySceneRequest { CopyModeBitmap mode = 0; group_id groupIdentifierFrom = 1; @@ -1801,7 +1761,7 @@ provisional cluster ScenesManagement = 98 { int8u sceneIdentifierTo = 4; } - response struct CopySceneResponse = 66 { + response struct CopySceneResponse = 64 { status status = 0; group_id groupIdentifierFrom = 1; int8u sceneIdentifierFrom = 2; @@ -1821,12 +1781,8 @@ provisional cluster ScenesManagement = 98 { fabric command RecallScene(RecallSceneRequest): DefaultSuccess = 5; /** Get an unused scene identifier when no commissioning tool is in the network, or for a commissioning tool to get the used scene identifiers within a certain group */ fabric command GetSceneMembership(GetSceneMembershipRequest): GetSceneMembershipResponse = 6; - /** Allows a scene to be added using a finer scene transition time than the AddScene command. */ - fabric command EnhancedAddScene(EnhancedAddSceneRequest): EnhancedAddSceneResponse = 64; - /** Allows a scene to be retrieved using a finer scene transition time than the ViewScene command */ - fabric command EnhancedViewScene(EnhancedViewSceneRequest): EnhancedViewSceneResponse = 65; /** Allows a client to efficiently copy scenes from one group/scene identifier pair to another group/scene identifier pair. */ - fabric command CopyScene(CopySceneRequest): CopySceneResponse = 66; + fabric command CopyScene(CopySceneRequest): CopySceneResponse = 64; } /** An interface for configuring and controlling the functionality of a thermostat. */ @@ -2219,7 +2175,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2463,7 +2419,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2508,11 +2464,10 @@ endpoint 1 { } server cluster ScenesManagement { - ram attribute nameSupport; ram attribute sceneTableSize; callback attribute fabricSceneInfo; - ram attribute featureMap default = 15; - ram attribute clusterRevision default = 4; + ram attribute featureMap default = 1; + ram attribute clusterRevision default = 1; handle command AddScene; handle command AddSceneResponse; diff --git a/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap b/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap index 1e246a36e3f61c..c65331f86089a3 100644 --- a/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap +++ b/examples/thermostat/nxp/zap/thermostat_matter_wifi.zap @@ -223,10 +223,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -2990,10 +2990,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3620,25 +3620,9 @@ } ], "attributes": [ - { - "name": "NameSupport", - "code": 4, - "mfgCode": null, - "side": "server", - "type": "NameSupportBitmap", - "included": 1, - "storageOption": "RAM", - "singleton": 0, - "bounded": 0, - "defaultValue": "", - "reportable": 1, - "minInterval": 0, - "maxInterval": 65344, - "reportableChange": 0 - }, { "name": "SceneTableSize", - "code": 6, + "code": 1, "mfgCode": null, "side": "server", "type": "int16u", @@ -3654,7 +3638,7 @@ }, { "name": "FabricSceneInfo", - "code": 7, + "code": 2, "mfgCode": null, "side": "server", "type": "array", @@ -3678,7 +3662,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "15", + "defaultValue": "1", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3694,7 +3678,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "4", + "defaultValue": "1", "reportable": 1, "minInterval": 0, "maxInterval": 65344, diff --git a/examples/thermostat/qpg/BUILD.gn b/examples/thermostat/qpg/BUILD.gn index 4c82da60be8be9..9989e349fc6c86 100644 --- a/examples/thermostat/qpg/BUILD.gn +++ b/examples/thermostat/qpg/BUILD.gn @@ -51,7 +51,7 @@ qpg_executable("thermostat") { output_name = "chip-${qpg_target_ic}-thermostat-example.out" sources = [ - "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerDelegate.cpp", + "${chip_root}/src/app/clusters/general-diagnostics-server/GenericFaultTestEventTriggerHandler.cpp", "${examples_plat_dir}/app/main.cpp", "${examples_plat_dir}/ota/ota.cpp", "src/AppTask.cpp", @@ -101,6 +101,7 @@ qpg_executable("thermostat") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/qpg/lib/pw_rpc:pw_rpc", diff --git a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter index 813c2a4759d408..713923440baa3a 100644 --- a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter +++ b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter @@ -1913,7 +1913,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2228,7 +2228,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap index f8208c351555c1..bd7e093e436a37 100644 --- a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap +++ b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.zap @@ -223,10 +223,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -3935,10 +3935,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/thermostat/silabs/BUILD.gn b/examples/thermostat/silabs/BUILD.gn index f82bbc40776c40..bb094b894f8db3 100644 --- a/examples/thermostat/silabs/BUILD.gn +++ b/examples/thermostat/silabs/BUILD.gn @@ -185,6 +185,7 @@ silabs_executable("thermostat_app") { ] deps += [ + "$dir_pw_hdlc:default_addresses", "$dir_pw_hdlc:rpc_channel_output", "$dir_pw_stream:sys_io_stream", "${chip_root}/config/efr32/lib/pw_rpc:pw_rpc", diff --git a/examples/thermostat/silabs/README.md b/examples/thermostat/silabs/README.md index 0d9c760c5821c6..3440277c64dfee 100644 --- a/examples/thermostat/silabs/README.md +++ b/examples/thermostat/silabs/README.md @@ -59,8 +59,9 @@ Silicon Labs platform. (For Mac OS X, `commander` is located inside `Commander.app/Contents/MacOS/`.) -- Download and install a suitable ARM gcc tool chain: - [GNU Arm Embedded Toolchain 9-2019-q4-major](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads) +- Download and install a suitable ARM gcc tool chain (For most Host, the + bootstrap already installs the toolchain): + [GNU Arm Embedded Toolchain 12.2 Rel1](https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads) - Install some additional tools(likely already present for CHIP developers): diff --git a/examples/thermostat/thermostat-common/thermostat.matter b/examples/thermostat/thermostat-common/thermostat.matter index fa9ac10945582d..309c686e0756cb 100644 --- a/examples/thermostat/thermostat-common/thermostat.matter +++ b/examples/thermostat/thermostat-common/thermostat.matter @@ -2092,7 +2092,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -2462,7 +2462,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } diff --git a/examples/thermostat/thermostat-common/thermostat.zap b/examples/thermostat/thermostat-common/thermostat.zap index 9f4432c9fee359..4909f50165ab55 100644 --- a/examples/thermostat/thermostat-common/thermostat.zap +++ b/examples/thermostat/thermostat-common/thermostat.zap @@ -207,10 +207,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4600,10 +4600,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/tv-app/android/BUILD.gn b/examples/tv-app/android/BUILD.gn index 0793b7d2993ef8..63de5a515b0754 100644 --- a/examples/tv-app/android/BUILD.gn +++ b/examples/tv-app/android/BUILD.gn @@ -33,8 +33,6 @@ shared_library("jni") { "include/audio-output/AudioOutputManager.cpp", "include/audio-output/AudioOutputManager.h", "include/cluster-init.cpp", - "include/content-app-observer/ContentAppObserver.cpp", - "include/content-app-observer/ContentAppObserver.h", "include/content-control/ContentController.cpp", "include/content-control/ContentController.h", "include/content-launcher/AppContentLauncherManager.cpp", @@ -118,6 +116,8 @@ android_library("java") { "java/src/com/matter/tv/server/tvapp/ChannelLineupInfo.java", "java/src/com/matter/tv/server/tvapp/ChannelManager.java", "java/src/com/matter/tv/server/tvapp/ChannelManagerStub.java", + "java/src/com/matter/tv/server/tvapp/ChannelProgramInfo.java", + "java/src/com/matter/tv/server/tvapp/ChannelProgramResponse.java", "java/src/com/matter/tv/server/tvapp/Clusters.java", "java/src/com/matter/tv/server/tvapp/ContentAppEndpointManager.java", "java/src/com/matter/tv/server/tvapp/ContentLaunchBrandingInformation.java", @@ -142,6 +142,7 @@ android_library("java") { "java/src/com/matter/tv/server/tvapp/MediaPlaybackManager.java", "java/src/com/matter/tv/server/tvapp/MediaPlaybackManagerStub.java", "java/src/com/matter/tv/server/tvapp/MediaPlaybackPosition.java", + "java/src/com/matter/tv/server/tvapp/MediaTrack.java", "java/src/com/matter/tv/server/tvapp/OnOffManager.java", "java/src/com/matter/tv/server/tvapp/OnOffManagerStub.java", "java/src/com/matter/tv/server/tvapp/TvApp.java", diff --git a/examples/tv-app/android/java/AppImpl.h b/examples/tv-app/android/java/AppImpl.h index 7d6bf20c7bb37c..7c0537242657ca 100644 --- a/examples/tv-app/android/java/AppImpl.h +++ b/examples/tv-app/android/java/AppImpl.h @@ -35,7 +35,6 @@ #include "../include/account-login/AccountLoginManager.h" #include "../include/application-basic/ApplicationBasicManager.h" #include "../include/application-launcher/ApplicationLauncherManager.h" -#include "../include/content-app-observer/ContentAppObserver.h" #include "../include/content-control/ContentController.h" #include "../include/content-launcher/AppContentLauncherManager.h" #include "../include/media-playback/AppMediaPlaybackManager.h" @@ -49,7 +48,6 @@ #include #include #include -#include #include #include #include @@ -76,7 +74,6 @@ using ApplicationBasicDelegate = app::Clusters::ApplicationBasic::Delegate; using ApplicationLauncherDelegate = app::Clusters::ApplicationLauncher::Delegate; using ChannelDelegate = app::Clusters::Channel::Delegate; using ContentLauncherDelegate = app::Clusters::ContentLauncher::Delegate; -using ContentAppObserverDelegate = app::Clusters::ContentAppObserver::Delegate; using ContentControlDelegate = app::Clusters::ContentControl::Delegate; using KeypadInputDelegate = app::Clusters::KeypadInput::Delegate; using MediaPlaybackDelegate = app::Clusters::MediaPlayback::Delegate; @@ -118,11 +115,6 @@ class DLL_EXPORT ContentAppImpl : public ContentApp mContentLauncherDelegate.SetEndpointId(GetEndpointId()); return &mContentLauncherDelegate; }; - ContentAppObserverDelegate * GetContentAppObserverDelegate() override - { - mContentAppObserverDelegate.SetEndpointId(GetEndpointId()); - return &mContentAppObserverDelegate; - }; ContentControlDelegate * GetContentControlDelegate() override { mContentControlDelegate.SetEndpointId(GetEndpointId()); @@ -146,7 +138,6 @@ class DLL_EXPORT ContentAppImpl : public ContentApp ApplicationLauncherManager mApplicationLauncherDelegate; ChannelManager mChannelDelegate; ContentController mContentControlDelegate; - ContentAppObserver mContentAppObserverDelegate; AppContentLauncherManager mContentLauncherDelegate; KeypadInputManager mKeypadInputDelegate; AppMediaPlaybackManager mMediaPlaybackDelegate; diff --git a/examples/tv-app/android/java/ChannelManager.cpp b/examples/tv-app/android/java/ChannelManager.cpp index 586e56bf99b27f..14d7509600b66f 100644 --- a/examples/tv-app/android/java/ChannelManager.cpp +++ b/examples/tv-app/android/java/ChannelManager.cpp @@ -59,11 +59,12 @@ CHIP_ERROR ChannelManager::HandleGetChannelList(AttributeValueEncoder & aEncoder { CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NULL_OBJECT, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received ChannelManager::HandleGetChannelList"); VerifyOrExit(mChannelManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetChannelListMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); return aEncoder.EncodeList([this, env](const auto & encoder) -> CHIP_ERROR { jobjectArray channelInfoList = (jobjectArray) env->CallObjectMethod(mChannelManagerObject, mGetChannelListMethod); @@ -135,11 +136,12 @@ CHIP_ERROR ChannelManager::HandleGetLineup(AttributeValueEncoder & aEncoder) chip::app::Clusters::Channel::Structs::LineupInfoStruct::Type lineupInfo; CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NULL_OBJECT, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received ChannelManager::HandleGetLineup"); VerifyOrExit(mChannelManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetLineupMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); { jobject channelLineupObject = env->CallObjectMethod(mChannelManagerObject, mGetLineupMethod); @@ -197,10 +199,12 @@ CHIP_ERROR ChannelManager::HandleGetCurrentChannel(AttributeValueEncoder & aEnco chip::app::Clusters::Channel::Structs::ChannelInfoStruct::Type channelInfo; CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NULL_OBJECT, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + ChipLogProgress(Zcl, "Received ChannelManager::HandleGetCurrentChannel"); VerifyOrExit(mChannelManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetCurrentChannelMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); { jobject channelInfoObject = env->CallObjectMethod(mChannelManagerObject, mGetCurrentChannelMethod); @@ -232,6 +236,14 @@ CHIP_ERROR ChannelManager::HandleGetCurrentChannel(AttributeValueEncoder & aEnco channelInfo.affiliateCallSign = Optional(affiliateCallSign.charSpan()); } + jfieldID getJidentifierField = env->GetFieldID(channelClass, "identifier", "Ljava/lang/String;"); + jstring jidentifier = static_cast(env->GetObjectField(channelInfoObject, getJidentifierField)); + JniUtfString identifier(env, jidentifier); + if (jidentifier != nullptr) + { + channelInfo.identifier = Optional(identifier.charSpan()); + } + jfieldID majorNumField = env->GetFieldID(channelClass, "majorNumber", "I"); jint jmajorNum = env->GetIntField(channelInfoObject, majorNumField); channelInfo.majorNumber = static_cast(jmajorNum); @@ -262,11 +274,12 @@ void ChannelManager::HandleChangeChannel(CommandResponseHelperExceptionClear(); @@ -334,11 +348,12 @@ bool ChannelManager::HandleSkipChannel(const int16_t & count) { jboolean ret = JNI_FALSE; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received ChannelManager::HandleSkipChannel count %d", count); VerifyOrExit(mChannelManagerObject != nullptr, ChipLogError(Zcl, "mChannelManagerObject null")); VerifyOrExit(mSkipChannelMethod != nullptr, ChipLogError(Zcl, "mSkipChannelMethod null")); - VerifyOrExit(env != NULL, ChipLogError(Zcl, "env null")); env->ExceptionClear(); @@ -363,30 +378,286 @@ void ChannelManager::HandleGetProgramGuide( const chip::Optional> & externalIdList, const chip::Optional & data) { - - // 1. Decode received parameters - // 2. Perform search - // 3. Return results ProgramGuideResponseType response; - // response.channelPagingStruct; - // response.programList; - helper.Success(response); + CHIP_ERROR err = CHIP_NO_ERROR; + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + + std::vector needToFreePrograms; + std::vector needToFreeChannels; + std::vector tempPrograms; + std::vector needToFreeStrings; + + ChipLogProgress(Zcl, "Received ChannelManager::HandleGetProgramGuide"); + VerifyOrExit(mChannelManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrExit(mGetProgramGuideMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + + { + // NOTE: this example app does not pass the Data, PageToken, ChannelsArray or ExternalIdList through to the Java layer + UtfString jData(env, ""); + UtfString jToken(env, ""); + jobjectArray channelsArray = nullptr; + jobjectArray externalIDListArray = (jobjectArray) env->NewObjectArray(0, env->FindClass("java/util/Map$Entry"), NULL); + + jobject resp = env->CallObjectMethod( + mChannelManagerObject, mGetProgramGuideMethod, static_cast(startTime.ValueOr(0)), + static_cast(endTime.ValueOr(0)), channelsArray, jToken.jniValue(), + static_cast(recordingFlag.ValueOr(0).Raw() != 0), externalIDListArray, jData.jniValue()); + if (env->ExceptionCheck()) + { + ChipLogError(Zcl, "Java exception in ChannelManager::HandleGetProgramGuide"); + env->ExceptionDescribe(); + env->ExceptionClear(); + err = CHIP_ERROR_INCORRECT_STATE; + goto exit; + } + + VerifyOrExit(resp != nullptr, err = CHIP_JNI_ERROR_NULL_OBJECT); + jclass respCls = env->GetObjectClass(resp); + jfieldID programsFid = env->GetFieldID(respCls, "programs", "[Lcom/matter/tv/server/tvapp/ChannelProgramInfo;"); + VerifyOrExit(programsFid != nullptr, err = CHIP_JNI_ERROR_FIELD_NOT_FOUND); + + jobjectArray programsArray = (jobjectArray) env->GetObjectField(resp, programsFid); + jint size = env->GetArrayLength(programsArray); + for (jint i = 0; i < size; i++) + { + ProgramType * program = new ProgramType(); + VerifyOrExit(program != nullptr, err = CHIP_ERROR_NO_MEMORY); + + jobject programObject = env->GetObjectArrayElement(programsArray, i); + jclass programClass = env->GetObjectClass(programObject); + + jfieldID getIdentifierField = env->GetFieldID(programClass, "identifier", "Ljava/lang/String;"); + jstring jidentifier = static_cast(env->GetObjectField(programObject, getIdentifierField)); + JniUtfString * identifier = new JniUtfString(env, jidentifier); + VerifyOrExit(identifier != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(identifier); + if (jidentifier != nullptr) + { + program->identifier = identifier->charSpan(); + } + + jfieldID getChannelField = env->GetFieldID(programClass, "channel", "Lcom/matter/tv/server/tvapp/ChannelInfo;"); + jobject channelInfoObject = env->GetObjectField(programObject, getChannelField); + if (channelInfoObject != nullptr) + { + jclass channelClass = env->GetObjectClass(channelInfoObject); + + ChannelInfoType * channelInfo = new ChannelInfoType(); + VerifyOrExit(channelInfo != nullptr, err = CHIP_ERROR_NO_MEMORY); + + jfieldID getCallSignField = env->GetFieldID(channelClass, "callSign", "Ljava/lang/String;"); + jstring jcallSign = static_cast(env->GetObjectField(channelInfoObject, getCallSignField)); + JniUtfString * callsign = new JniUtfString(env, jcallSign); + VerifyOrExit(callsign != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(callsign); + if (jcallSign != nullptr) + { + channelInfo->callSign = Optional(callsign->charSpan()); + } + + jfieldID getNameField = env->GetFieldID(channelClass, "name", "Ljava/lang/String;"); + jstring jname = static_cast(env->GetObjectField(channelInfoObject, getNameField)); + JniUtfString * name = new JniUtfString(env, jname); + VerifyOrExit(name != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(name); + if (jname != nullptr) + { + channelInfo->name = Optional(name->charSpan()); + } + + jfieldID getJaffiliateCallSignField = env->GetFieldID(channelClass, "affiliateCallSign", "Ljava/lang/String;"); + jstring jaffiliateCallSign = + static_cast(env->GetObjectField(channelInfoObject, getJaffiliateCallSignField)); + JniUtfString * affiliateCallSign = new JniUtfString(env, jaffiliateCallSign); + VerifyOrExit(affiliateCallSign != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(affiliateCallSign); + if (jaffiliateCallSign != nullptr) + { + channelInfo->affiliateCallSign = Optional(affiliateCallSign->charSpan()); + } + + jfieldID getJchanIdentifierField = env->GetFieldID(channelClass, "identifier", "Ljava/lang/String;"); + jstring jchanidentifier = static_cast(env->GetObjectField(channelInfoObject, getJchanIdentifierField)); + JniUtfString * chanidentifier = new JniUtfString(env, jchanidentifier); + VerifyOrExit(chanidentifier != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(chanidentifier); + if (jchanidentifier != nullptr) + { + channelInfo->identifier = Optional(chanidentifier->charSpan()); + } + + jfieldID majorNumField = env->GetFieldID(channelClass, "majorNumber", "I"); + jint jmajorNum = env->GetIntField(channelInfoObject, majorNumField); + channelInfo->majorNumber = static_cast(jmajorNum); + + jfieldID minorNumField = env->GetFieldID(channelClass, "minorNumber", "I"); + jint jminorNum = env->GetIntField(channelInfoObject, minorNumField); + channelInfo->minorNumber = static_cast(jminorNum); + + program->channel = *channelInfo; + needToFreeChannels.push_back(channelInfo); + } + + jfieldID getTitleField = env->GetFieldID(programClass, "title", "Ljava/lang/String;"); + jstring jtitle = static_cast(env->GetObjectField(programObject, getTitleField)); + JniUtfString * title = new JniUtfString(env, jtitle); + VerifyOrExit(title != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(title); + if (jtitle != nullptr) + { + program->title = title->charSpan(); + } + + jfieldID getSubTitleField = env->GetFieldID(programClass, "subTitle", "Ljava/lang/String;"); + jstring jsubTitle = static_cast(env->GetObjectField(programObject, getSubTitleField)); + JniUtfString * subTitle = new JniUtfString(env, jsubTitle); + VerifyOrExit(subTitle != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(subTitle); + if (jsubTitle != nullptr) + { + program->subtitle = MakeOptional(subTitle->charSpan()); + } + + jfieldID getDescriptionField = env->GetFieldID(programClass, "description", "Ljava/lang/String;"); + jstring jdescription = static_cast(env->GetObjectField(programObject, getDescriptionField)); + JniUtfString * description = new JniUtfString(env, jdescription); + VerifyOrExit(description != nullptr, err = CHIP_ERROR_NO_MEMORY); + needToFreeStrings.push_back(description); + if (jdescription != nullptr) + { + program->description = Optional(description->charSpan()); + } + + jfieldID startTimeField = env->GetFieldID(programClass, "startTime", "J"); + jlong jstartTime = env->GetLongField(programObject, startTimeField); + program->startTime = static_cast(jstartTime); + + jfieldID endTimeField = env->GetFieldID(programClass, "endTime", "J"); + jlong jendTime = env->GetLongField(programObject, endTimeField); + program->endTime = static_cast(jendTime); + + uint32_t recordFlag = 0; + jfieldID recordFlagScheduledField = env->GetFieldID(programClass, "recordFlagScheduled", "Z"); + jboolean jrecordFlagScheduled = env->GetBooleanField(programObject, recordFlagScheduledField); + if (jrecordFlagScheduled) + { + recordFlag |= 1; + } + jfieldID recordFlagSeriesField = env->GetFieldID(programClass, "recordFlagSeries", "Z"); + jboolean jrecordFlagSeries = env->GetBooleanField(programObject, recordFlagSeriesField); + if (jrecordFlagSeries) + { + recordFlag |= 2; + } + jfieldID recordFlagRecordedField = env->GetFieldID(programClass, "recordFlagRecorded", "Z"); + jboolean jrecordFlagRecorded = env->GetBooleanField(programObject, recordFlagRecordedField); + if (jrecordFlagRecorded) + { + recordFlag |= 4; + } + + program->recordingFlag = MakeOptional(static_cast(recordFlag)); + + needToFreePrograms.push_back(program); + tempPrograms.push_back(*program); + } + + response.programList = DataModel::List(tempPrograms.data(), tempPrograms.size()); + + err = helper.Success(response); + } + +exit: + for (ProgramType * program : needToFreePrograms) + { + delete program; + } + + for (JniUtfString * str : needToFreeStrings) + { + delete str; + } + + if (err != CHIP_NO_ERROR) + { + ChipLogError(Zcl, "ChannelManager::HandleGetProgramGuide status error: %s", err.AsString()); + } } bool ChannelManager::HandleRecordProgram(const chip::CharSpan & programIdentifier, bool shouldRecordSeries, const DataModel::DecodableList & externalIdList, const chip::ByteSpan & data) { - // Start recording - return true; + jboolean ret = JNI_FALSE; + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + + ChipLogProgress(Zcl, "Received ChannelManager::HandleRecordProgram"); + VerifyOrExit(mChannelManagerObject != nullptr, ChipLogError(Zcl, "mChannelManagerObject null")); + VerifyOrExit(mRecordProgramMethod != nullptr, ChipLogError(Zcl, "mRecordProgramMethod null")); + + env->ExceptionClear(); + + { + UtfString jIdentifier(env, programIdentifier); + + // NOTE: this example app does not pass the Data or ExternalIdList through to the Java layer + UtfString jData(env, ""); + jobjectArray externalIDListArray = (jobjectArray) env->NewObjectArray(0, env->FindClass("java/util/Map$Entry"), NULL); + + ret = env->CallBooleanMethod(mChannelManagerObject, mRecordProgramMethod, jIdentifier.jniValue(), + static_cast(shouldRecordSeries), externalIDListArray, jData.jniValue()); + if (env->ExceptionCheck()) + { + ChipLogError(DeviceLayer, "Java exception in ChannelManager::HandleRecordProgram"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return false; + } + } + +exit: + return static_cast(ret); } bool ChannelManager::HandleCancelRecordProgram(const chip::CharSpan & programIdentifier, bool shouldRecordSeries, const DataModel::DecodableList & externalIdList, const chip::ByteSpan & data) { - // Cancel recording - return true; + jboolean ret = JNI_FALSE; + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + + ChipLogProgress(Zcl, "Received ChannelManager::HandleCancelRecordProgram"); + VerifyOrExit(mChannelManagerObject != nullptr, ChipLogError(Zcl, "mChannelManagerObject null")); + VerifyOrExit(mCancelRecordProgramMethod != nullptr, ChipLogError(Zcl, "mCancelRecordProgramMethod null")); + + env->ExceptionClear(); + + { + UtfString jIdentifier(env, programIdentifier); + + // NOTE: this example app does not pass the Data or ExternalIdList through to the Java layer + UtfString jData(env, ""); + jobjectArray externalIDListArray = (jobjectArray) env->NewObjectArray(0, env->FindClass("java/util/Map$Entry"), NULL); + + ret = env->CallBooleanMethod(mChannelManagerObject, mCancelRecordProgramMethod, jIdentifier.jniValue(), + static_cast(shouldRecordSeries), externalIDListArray, jData.jniValue()); + if (env->ExceptionCheck()) + { + ChipLogError(DeviceLayer, "Java exception in ChannelManager::HandleCancelRecordProgram"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return false; + } + } + +exit: + return static_cast(ret); } void ChannelManager::InitializeWithObjects(jobject managerObject) @@ -442,6 +713,31 @@ void ChannelManager::InitializeWithObjects(jobject managerObject) ChipLogError(Zcl, "Failed to access ChannelManager 'skipChannel' method"); env->ExceptionClear(); } + + mGetProgramGuideMethod = env->GetMethodID(managerClass, "getProgramGuide", + "(JJ[Lcom/matter/tv/server/tvapp/ChannelInfo;Ljava/lang/String;Z[Ljava/util/" + "Map$Entry;Ljava/lang/String;)Lcom/matter/tv/server/tvapp/ChannelProgramResponse;"); + if (mGetProgramGuideMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access ChannelManager 'getProgramGuide' method"); + env->ExceptionClear(); + } + + mRecordProgramMethod = + env->GetMethodID(managerClass, "recordProgram", "(Ljava/lang/String;Z[Ljava/util/Map$Entry;Ljava/lang/String;)Z"); + if (mRecordProgramMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access ChannelManager 'recordProgram' method"); + env->ExceptionClear(); + } + + mCancelRecordProgramMethod = + env->GetMethodID(managerClass, "cancelRecordProgram", "(Ljava/lang/String;Z[Ljava/util/Map$Entry;Ljava/lang/String;)Z"); + if (mCancelRecordProgramMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access ChannelManager 'cancelRecordProgram' method"); + env->ExceptionClear(); + } } uint32_t ChannelManager::GetFeatureMap(chip::EndpointId endpoint) diff --git a/examples/tv-app/android/java/ChannelManager.h b/examples/tv-app/android/java/ChannelManager.h index fca3d03056f0fe..85d645beda40a3 100644 --- a/examples/tv-app/android/java/ChannelManager.h +++ b/examples/tv-app/android/java/ChannelManager.h @@ -31,6 +31,8 @@ using ChannelInfoType = chip::app::Clusters::Channel::Structs::Channel using AdditionalInfoType = chip::app::Clusters::Channel::Structs::AdditionalInfoStruct::Type; using LineupInfoType = chip::app::Clusters::Channel::Structs::LineupInfoStruct::Type; using PageTokenType = chip::app::Clusters::Channel::Structs::PageTokenStruct::Type; +using ProgramType = chip::app::Clusters::Channel::Structs::ProgramStruct::Type; +using ChannelPagingType = chip::app::Clusters::Channel::Structs::ChannelPagingStruct::Type; class ChannelManager : public ChannelDelegate { @@ -73,6 +75,10 @@ class ChannelManager : public ChannelDelegate jmethodID mChangeChannelByNumberMethod = nullptr; jmethodID mSkipChannelMethod = nullptr; + jmethodID mGetProgramGuideMethod = nullptr; + jmethodID mRecordProgramMethod = nullptr; + jmethodID mCancelRecordProgramMethod = nullptr; + // TODO: set this based upon meta data from app uint32_t mDynamicEndpointFeatureMap = 3; }; diff --git a/examples/tv-app/android/java/ContentLauncherManager.cpp b/examples/tv-app/android/java/ContentLauncherManager.cpp index ee2f36c1667666..936b053fa3eae1 100644 --- a/examples/tv-app/android/java/ContentLauncherManager.cpp +++ b/examples/tv-app/android/java/ContentLauncherManager.cpp @@ -54,11 +54,12 @@ void ContentLauncherManager::HandleLaunchContent(CommandResponseHelper acceptedHeadersList; + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NO_ENV, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received ContentLauncherManager::GetAcceptHeader"); VerifyOrExit(mContentLauncherManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetAcceptHeaderMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); return aEncoder.EncodeList([this, env](const auto & encoder) -> CHIP_ERROR { jobjectArray acceptedHeadersArray = @@ -203,11 +206,12 @@ uint32_t ContentLauncherManager::HandleGetSupportedStreamingProtocols() CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); uint32_t supportedStreamingProtocols = 0; + VerifyOrReturnValue(env != nullptr, 0, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received ContentLauncherManager::GetSupportedStreamingProtocols"); VerifyOrExit(mContentLauncherManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetSupportedStreamingProtocolsMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); { jlong jSupportedStreamingProtocols = diff --git a/examples/tv-app/android/java/KeypadInputManager.cpp b/examples/tv-app/android/java/KeypadInputManager.cpp index 5267f1ec70c9db..386c2aeeb98bc1 100644 --- a/examples/tv-app/android/java/KeypadInputManager.cpp +++ b/examples/tv-app/android/java/KeypadInputManager.cpp @@ -23,6 +23,7 @@ #include #include #include +#include using namespace chip; using namespace chip::app::Clusters::KeypadInput; @@ -48,11 +49,12 @@ void KeypadInputManager::HandleSendKey(CommandResponseHelperExceptionClear(); ret = env->CallIntMethod(mKeypadInputManagerObject, mSendKeyMethod, static_cast(keyCode)); @@ -74,6 +76,7 @@ void KeypadInputManager::InitializeWithObjects(jobject managerObject) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for KeypadInputManager")); + JniLocalReferenceManager manager(env); mKeypadInputManagerObject = env->NewGlobalRef(managerObject); VerifyOrReturn(mKeypadInputManagerObject != nullptr, ChipLogError(Zcl, "Failed to NewGlobalRef KeypadInputManager")); diff --git a/examples/tv-app/android/java/LevelManager.cpp b/examples/tv-app/android/java/LevelManager.cpp index 80ad32490ddb16..0051c99b86c75d 100644 --- a/examples/tv-app/android/java/LevelManager.cpp +++ b/examples/tv-app/android/java/LevelManager.cpp @@ -92,6 +92,7 @@ CHIP_ERROR LevelManager::InitializeWithObjects(jobject managerObject) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); VerifyOrReturnLogError(env != nullptr, CHIP_ERROR_INCORRECT_STATE); + JniLocalReferenceManager manager(env); mLevelManagerObject = env->NewGlobalRef(managerObject); VerifyOrReturnLogError(mLevelManagerObject != nullptr, CHIP_ERROR_INVALID_ARGUMENT); @@ -115,7 +116,9 @@ void LevelManager::HandleLevelChanged(uint8_t value) ChipLogProgress(Zcl, "LevelManager::HandleLevelChanged"); JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null")); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + VerifyOrReturn(mLevelManagerObject != nullptr, ChipLogProgress(Zcl, "mLevelManagerObject null")); VerifyOrReturn(mHandleLevelChangedMethod != nullptr, ChipLogProgress(Zcl, "mHandleLevelChangedMethod null")); diff --git a/examples/tv-app/android/java/LowPowerManager.cpp b/examples/tv-app/android/java/LowPowerManager.cpp index b7f8f56a40b93a..d375bd3fc3e383 100644 --- a/examples/tv-app/android/java/LowPowerManager.cpp +++ b/examples/tv-app/android/java/LowPowerManager.cpp @@ -46,6 +46,7 @@ void LowPowerManager::InitializeWithObjects(jobject managerObject) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for LowPowerManager")); + JniLocalReferenceManager manager(env); mLowPowerManagerObject = env->NewGlobalRef(managerObject); VerifyOrReturn(mLowPowerManagerObject != nullptr, ChipLogError(Zcl, "Failed to NewGlobalRef LowPowerManager")); @@ -65,6 +66,7 @@ bool LowPowerManager::HandleSleep() { jboolean ret = JNI_FALSE; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received LowPowerManager::Sleep"); VerifyOrExit(mLowPowerManagerObject != nullptr, ChipLogError(Zcl, "mLowPowerManagerObject null")); diff --git a/examples/tv-app/android/java/MediaInputManager.cpp b/examples/tv-app/android/java/MediaInputManager.cpp index b28609d0efc3fa..ca96d7df41ecaa 100644 --- a/examples/tv-app/android/java/MediaInputManager.cpp +++ b/examples/tv-app/android/java/MediaInputManager.cpp @@ -53,11 +53,12 @@ CHIP_ERROR MediaInputManager::HandleGetInputList(chip::app::AttributeValueEncode { CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NO_ENV, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaInputManager::HandleGetInputList"); VerifyOrExit(mMediaInputManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetInputListMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); return aEncoder.EncodeList([this, env](const auto & encoder) -> CHIP_ERROR { jobjectArray inputArray = (jobjectArray) env->CallObjectMethod(mMediaInputManagerObject, mGetInputListMethod); @@ -123,6 +124,8 @@ uint8_t MediaInputManager::HandleGetCurrentInput() CHIP_ERROR err = CHIP_NO_ERROR; jint index = -1; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, 0, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaInputManager::HandleGetCurrentInput"); VerifyOrExit(mMediaInputManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); @@ -153,11 +156,12 @@ bool MediaInputManager::HandleSelectInput(const uint8_t index) { jboolean ret = JNI_FALSE; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaInputManager::HandleSelectInput %d", index); VerifyOrExit(mMediaInputManagerObject != nullptr, ChipLogError(Zcl, "mMediaInputManagerObject null")); VerifyOrExit(mSelectInputMethod != nullptr, ChipLogError(Zcl, "mSelectInputMethod null")); - VerifyOrExit(env != NULL, ChipLogError(Zcl, "env null")); env->ExceptionClear(); ret = env->CallBooleanMethod(mMediaInputManagerObject, mSelectInputMethod, static_cast(index)); @@ -177,11 +181,12 @@ bool MediaInputManager::HandleShowInputStatus() { jboolean ret = JNI_FALSE; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaInputManager::HandleShowInputStatus"); VerifyOrExit(mMediaInputManagerObject != nullptr, ChipLogError(Zcl, "mMediaInputManagerObject null")); VerifyOrExit(mShowInputStatusMethod != nullptr, ChipLogError(Zcl, "mShowInputStatusMethod null")); - VerifyOrExit(env != NULL, ChipLogError(Zcl, "env null")); env->ExceptionClear(); ret = env->CallBooleanMethod(mMediaInputManagerObject, mShowInputStatusMethod); @@ -201,11 +206,12 @@ bool MediaInputManager::HandleHideInputStatus() { jboolean ret = JNI_FALSE; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaInputManager::HandleHideInputStatus"); VerifyOrExit(mMediaInputManagerObject != nullptr, ChipLogError(Zcl, "mMediaInputManagerObject null")); VerifyOrExit(mHideInputStatusMethod != nullptr, ChipLogError(Zcl, "mHideInputStatusMethod null")); - VerifyOrExit(env != NULL, ChipLogError(Zcl, "env null")); env->ExceptionClear(); ret = env->CallBooleanMethod(mMediaInputManagerObject, mHideInputStatusMethod); @@ -226,11 +232,12 @@ bool MediaInputManager::HandleRenameInput(const uint8_t index, const chip::CharS std::string inputname(name.data(), name.size()); jboolean ret = JNI_FALSE; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaInputManager::HandleRenameInput %d to %s", index, name.data()); VerifyOrExit(mMediaInputManagerObject != nullptr, ChipLogError(Zcl, "mMediaInputManagerObject null")); VerifyOrExit(mRenameInputMethod != nullptr, ChipLogError(Zcl, "mHideInputStatusMethod null")); - VerifyOrExit(env != NULL, ChipLogError(Zcl, "env null")); { UtfString jniInputname(env, inputname.data()); diff --git a/examples/tv-app/android/java/MediaPlaybackManager.cpp b/examples/tv-app/android/java/MediaPlaybackManager.cpp index 30931a48709a0f..64843fd3a45e4f 100644 --- a/examples/tv-app/android/java/MediaPlaybackManager.cpp +++ b/examples/tv-app/android/java/MediaPlaybackManager.cpp @@ -92,40 +92,162 @@ uint64_t MediaPlaybackManager::HandleGetSeekRangeEnd() CHIP_ERROR MediaPlaybackManager::HandleGetActiveAudioTrack(AttributeValueEncoder & aEncoder) { - TrackType mActiveAudioTrack; - return aEncoder.Encode(mActiveAudioTrack); + return HandleGetActiveTrack(true, aEncoder); +} + +CHIP_ERROR MediaPlaybackManager::HandleGetActiveTrack(bool audio, AttributeValueEncoder & aEncoder) +{ + Structs::TrackStruct::Type response; + Structs::TrackAttributesStruct::Type trackAttributes; + response.trackAttributes = Nullable(trackAttributes); + + jobject trackObj; + CHIP_ERROR err = CHIP_NO_ERROR; + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NULL_OBJECT, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + + ChipLogProgress(Zcl, "MediaPlaybackManager::HandleGetActiveAudioTrack"); + VerifyOrExit(mMediaPlaybackManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrExit(mGetActiveTrackMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + + env->ExceptionClear(); + trackObj = env->CallObjectMethod(mMediaPlaybackManagerObject, mGetActiveTrackMethod, static_cast(audio)); + if (env->ExceptionCheck()) + { + ChipLogError(AppServer, "Java exception in MediaPlaybackManager::HandleGetActiveAudioTrack"); + env->ExceptionDescribe(); + env->ExceptionClear(); + goto exit; + } + + if (trackObj != nullptr) + { + jclass trackClass = env->GetObjectClass(trackObj); + jfieldID getIdField = env->GetFieldID(trackClass, "id", "Ljava/lang/String;"); + jstring jid = static_cast(env->GetObjectField(trackObj, getIdField)); + JniUtfString id(env, jid); + if (jid != nullptr) + { + response.id = id.charSpan(); + } + + jfieldID getLanguageCodeField = env->GetFieldID(trackClass, "languageCode", "Ljava/lang/String;"); + jstring jlanguagecode = static_cast(env->GetObjectField(trackObj, getLanguageCodeField)); + JniUtfString languageCode(env, jlanguagecode); + if (jlanguagecode != nullptr) + { + trackAttributes.languageCode = languageCode.charSpan(); + } + + jfieldID getDisplayNameField = env->GetFieldID(trackClass, "displayName", "Ljava/lang/String;"); + jstring jdisplayname = static_cast(env->GetObjectField(trackObj, getDisplayNameField)); + JniUtfString displayName(env, jdisplayname); + if (jdisplayname != nullptr) + { + trackAttributes.displayName = Optional>>( + Nullable>(displayName.charSpan())); + } + } + else + { + err = aEncoder.EncodeNull(); + } + +exit: + if (err != CHIP_NO_ERROR) + { + ChipLogError(Zcl, "MediaPlaybackManager::HandleGetActiveAudioTrack status error: %s", err.AsString()); + } + + return aEncoder.Encode(response); } CHIP_ERROR MediaPlaybackManager::HandleGetAvailableAudioTracks(AttributeValueEncoder & aEncoder) { - std::vector mAvailableAudioTracks; - // TODO: Insert code here - return aEncoder.EncodeList([mAvailableAudioTracks](const auto & encoder) -> CHIP_ERROR { - for (auto const & audioTrack : mAvailableAudioTracks) + return HandleGetAvailableTracks(true, aEncoder); +} + +CHIP_ERROR MediaPlaybackManager::HandleGetAvailableTracks(bool audio, AttributeValueEncoder & aEncoder) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NULL_OBJECT, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + + ChipLogProgress(Zcl, "MediaPlaybackManager::HandleGetAvailableAudioTracks"); + VerifyOrExit(mMediaPlaybackManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrExit(mGetAvailableTracksMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + + return aEncoder.EncodeList([this, env, audio](const auto & encoder) -> CHIP_ERROR { + jobjectArray trackList = (jobjectArray) env->CallObjectMethod(mMediaPlaybackManagerObject, mGetAvailableTracksMethod, + static_cast(audio)); + if (env->ExceptionCheck()) { - ReturnErrorOnFailure(encoder.Encode(audioTrack)); + ChipLogError(Zcl, "Java exception in MediaPlaybackManager::HandleGetAvailableAudioTracks"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return CHIP_ERROR_INCORRECT_STATE; + } + + jint length = env->GetArrayLength(trackList); + + for (jint i = 0; i < length; i++) + { + Structs::TrackStruct::Type track; + Structs::TrackAttributesStruct::Type trackAttributes; + track.trackAttributes = Nullable(trackAttributes); + + jobject trackObject = env->GetObjectArrayElement(trackList, i); + jclass trackClass = env->GetObjectClass(trackObject); + + jfieldID getIdField = env->GetFieldID(trackClass, "id", "Ljava/lang/String;"); + jstring jid = static_cast(env->GetObjectField(trackObject, getIdField)); + JniUtfString id(env, jid); + if (jid != nullptr) + { + track.id = id.charSpan(); + } + + jfieldID getLanguageCodeField = env->GetFieldID(trackClass, "languageCode", "Ljava/lang/String;"); + jstring jlanguagecode = static_cast(env->GetObjectField(trackObject, getLanguageCodeField)); + JniUtfString languageCode(env, jlanguagecode); + if (jlanguagecode != nullptr) + { + trackAttributes.languageCode = languageCode.charSpan(); + } + + jfieldID getDisplayNameField = env->GetFieldID(trackClass, "displayName", "Ljava/lang/String;"); + jstring jdisplayname = static_cast(env->GetObjectField(trackObject, getDisplayNameField)); + JniUtfString displayName(env, jdisplayname); + if (jdisplayname != nullptr) + { + trackAttributes.displayName = Optional>>( + Nullable>(displayName.charSpan())); + } + + ReturnErrorOnFailure(encoder.Encode(track)); } return CHIP_NO_ERROR; }); + +exit: + if (err != CHIP_NO_ERROR) + { + ChipLogError(Zcl, "MediaPlaybackManager::HandleGetAvailableAudioTracks status error: %s", err.AsString()); + } + + return err; } CHIP_ERROR MediaPlaybackManager::HandleGetActiveTextTrack(AttributeValueEncoder & aEncoder) { - TrackType mActiveTextTrack; - return aEncoder.Encode(mActiveTextTrack); + return HandleGetActiveTrack(false, aEncoder); } CHIP_ERROR MediaPlaybackManager::HandleGetAvailableTextTracks(AttributeValueEncoder & aEncoder) { - std::vector mAvailableTextTracks; - // TODO: Insert code here - return aEncoder.EncodeList([mAvailableTextTracks](const auto & encoder) -> CHIP_ERROR { - for (auto const & textTrack : mAvailableTextTracks) - { - ReturnErrorOnFailure(encoder.Encode(textTrack)); - } - return CHIP_NO_ERROR; - }); + return HandleGetAvailableTracks(false, aEncoder); } void MediaPlaybackManager::HandlePlay(CommandResponseHelper & helper) @@ -190,23 +312,64 @@ void MediaPlaybackManager::HandleStartOver(CommandResponseHelperExceptionClear(); + ret = env->CallIntMethod(mMediaPlaybackManagerObject, mActivateTrackMethod, static_cast(audio), jniid.jniValue()); + if (env->ExceptionCheck()) + { + ChipLogError(AppServer, "Java exception in MediaPlaybackManager::HandleActivateTrack %s", id.c_str()); + env->ExceptionDescribe(); + env->ExceptionClear(); + } + } +exit: + return static_cast(ret) == 0; } bool MediaPlaybackManager::HandleActivateTextTrack(const chip::CharSpan & trackId) { - // Handle Activate Text Track - HandleMediaRequest(MEDIA_PLAYBACK_REQUEST_ACTIVATE_TEXT_TRACK, 0); - return true; + return HandleActivateTrack(false, trackId); } bool MediaPlaybackManager::HandleDeactivateTextTrack() { - // Handle Deactivate Text Track - HandleMediaRequest(MEDIA_PLAYBACK_REQUEST_DEACTIVATE_TEXT_TRACK, 0); - return true; + jint ret = -1; + CHIP_ERROR err = CHIP_NO_ERROR; + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + + ChipLogProgress(Zcl, "MediaPlaybackManager::HandleDeactivateTextTrack"); + VerifyOrExit(mMediaPlaybackManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + VerifyOrExit(mDeactivateTextTrackMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); + + env->ExceptionClear(); + ret = env->CallIntMethod(mMediaPlaybackManagerObject, mDeactivateTextTrackMethod); + if (env->ExceptionCheck()) + { + ChipLogError(AppServer, "Java exception in MediaPlaybackManager::HandleDeactivateTextTrack"); + env->ExceptionDescribe(); + env->ExceptionClear(); + } +exit: + return static_cast(ret) == 0; } void MediaPlaybackManager::InitializeWithObjects(jobject managerObject) @@ -241,6 +404,36 @@ void MediaPlaybackManager::InitializeWithObjects(jobject managerObject) ChipLogError(Zcl, "Failed to access MediaPlaybackManager 'getPosition' method"); env->ExceptionClear(); } + + mGetAvailableTracksMethod = + env->GetMethodID(mMediaPlaybackManagerClass, "getAvailableTracks", "(Z)[Lcom/matter/tv/server/tvapp/MediaTrack;"); // TODO + if (mGetAvailableTracksMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access MediaPlaybackManager 'getAvailableTracks' method"); + env->ExceptionClear(); + } + + mActivateTrackMethod = env->GetMethodID(mMediaPlaybackManagerClass, "activateTrack", "(ZLjava/lang/String;)I"); + if (mActivateTrackMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access MediaPlaybackManager 'activateTrack' method"); + env->ExceptionClear(); + } + + mDeactivateTextTrackMethod = env->GetMethodID(mMediaPlaybackManagerClass, "deactivateTextTrack", "()I"); + if (mDeactivateTextTrackMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access MediaPlaybackManager 'deactivateTextTrack' method"); + env->ExceptionClear(); + } + + mGetActiveTrackMethod = + env->GetMethodID(mMediaPlaybackManagerClass, "getActiveTrack", "(Z)Lcom/matter/tv/server/tvapp/MediaTrack;"); + if (mGetActiveTrackMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access MediaPlaybackManager 'getActiveTrack' method"); + env->ExceptionClear(); + } } uint64_t MediaPlaybackManager::HandleMediaRequestGetAttribute(MediaPlaybackRequestAttribute attribute) @@ -249,11 +442,12 @@ uint64_t MediaPlaybackManager::HandleMediaRequestGetAttribute(MediaPlaybackReque jlong jAttributeValue = -1; CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, ret, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaPlaybackManager::HandleMediaRequestGetAttribute:%d", attribute); VerifyOrExit(mMediaPlaybackManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetAttributeMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); jAttributeValue = env->CallLongMethod(mMediaPlaybackManagerObject, mGetAttributeMethod, static_cast(attribute)); if (env->ExceptionCheck()) @@ -288,11 +482,12 @@ long MediaPlaybackManager::HandleMediaRequestGetLongAttribute(MediaPlaybackReque jlong jAttributeValue = -1; CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, false, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "Received MediaPlaybackManager::HandleMediaRequestGetLongAttribute:%d", attribute); VerifyOrExit(mMediaPlaybackManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetAttributeMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); jAttributeValue = env->CallLongMethod(mMediaPlaybackManagerObject, mGetAttributeMethod, static_cast(attribute)); if (env->ExceptionCheck()) @@ -323,12 +518,13 @@ Commands::PlaybackResponse::Type MediaPlaybackManager::HandleMediaRequest(MediaP jint ret = -1; CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnValue(env != nullptr, response, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "MediaPlaybackManager::Request %d-%ld", mediaPlaybackRequest, static_cast(deltaPositionMilliseconds)); VerifyOrExit(mMediaPlaybackManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mRequestMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); env->ExceptionClear(); ret = env->CallIntMethod(mMediaPlaybackManagerObject, mRequestMethod, static_cast(mediaPlaybackRequest), @@ -361,11 +557,12 @@ CHIP_ERROR MediaPlaybackManager::HandleGetSampledPosition(AttributeValueEncoder jobject positionObj; CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NULL_OBJECT, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); ChipLogProgress(Zcl, "MediaPlaybackManager::HandleGetSampledPosition"); VerifyOrExit(mMediaPlaybackManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetPositionMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); env->ExceptionClear(); positionObj = env->CallObjectMethod(mMediaPlaybackManagerObject, mGetPositionMethod); @@ -388,7 +585,7 @@ CHIP_ERROR MediaPlaybackManager::HandleGetSampledPosition(AttributeValueEncoder exit: if (err != CHIP_NO_ERROR) { - ChipLogError(Zcl, "MediaPlaybackManager::GetAttribute status error: %s", err.AsString()); + ChipLogError(Zcl, "MediaPlaybackManager::GetAttribute status error: %" CHIP_ERROR_FORMAT, err.Format()); } return aEncoder.Encode(response); diff --git a/examples/tv-app/android/java/MediaPlaybackManager.h b/examples/tv-app/android/java/MediaPlaybackManager.h index 507555f9937ef7..914462fea57fb2 100644 --- a/examples/tv-app/android/java/MediaPlaybackManager.h +++ b/examples/tv-app/android/java/MediaPlaybackManager.h @@ -75,6 +75,8 @@ class MediaPlaybackManager : public MediaPlaybackDelegate float HandleGetPlaybackSpeed() override; uint64_t HandleGetSeekRangeStart() override; uint64_t HandleGetSeekRangeEnd() override; + CHIP_ERROR HandleGetActiveTrack(bool audio, AttributeValueEncoder & aEncoder); + CHIP_ERROR HandleGetAvailableTracks(bool audio, AttributeValueEncoder & aEncoder); CHIP_ERROR HandleGetActiveAudioTrack(AttributeValueEncoder & aEncoder) override; CHIP_ERROR HandleGetAvailableAudioTracks(AttributeValueEncoder & aEncoder) override; CHIP_ERROR HandleGetActiveTextTrack(AttributeValueEncoder & aEncoder) override; @@ -97,15 +99,20 @@ class MediaPlaybackManager : public MediaPlaybackDelegate void HandleStartOver(CommandResponseHelper & helper) override; bool HandleActivateAudioTrack(const chip::CharSpan & trackId, const uint8_t & audioOutputIndex) override; bool HandleActivateTextTrack(const chip::CharSpan & trackId) override; + bool HandleActivateTrack(bool audio, const chip::CharSpan & trackId); bool HandleDeactivateTextTrack() override; uint32_t GetFeatureMap(chip::EndpointId endpoint) override; private: - jobject mMediaPlaybackManagerObject = nullptr; - jmethodID mRequestMethod = nullptr; - jmethodID mGetAttributeMethod = nullptr; - jmethodID mGetPositionMethod = nullptr; + jobject mMediaPlaybackManagerObject = nullptr; + jmethodID mRequestMethod = nullptr; + jmethodID mGetAttributeMethod = nullptr; + jmethodID mGetPositionMethod = nullptr; + jmethodID mGetAvailableTracksMethod = nullptr; + jmethodID mActivateTrackMethod = nullptr; + jmethodID mDeactivateTextTrackMethod = nullptr; + jmethodID mGetActiveTrackMethod = nullptr; uint64_t HandleMediaRequestGetAttribute(MediaPlaybackRequestAttribute attribute); long HandleMediaRequestGetLongAttribute(MediaPlaybackRequestAttribute attribute); diff --git a/examples/tv-app/android/java/OnOffManager.cpp b/examples/tv-app/android/java/OnOffManager.cpp index 822f058f647ef0..57ed3478b4cb3b 100644 --- a/examples/tv-app/android/java/OnOffManager.cpp +++ b/examples/tv-app/android/java/OnOffManager.cpp @@ -83,6 +83,7 @@ void OnOffManager::PostOnOffChanged(chip::EndpointId endpoint, bool value) jboolean OnOffManager::SetOnOff(jint endpoint, bool value) { + chip::DeviceLayer::StackLock stack; EmberAfStatus status = app::Clusters::OnOff::Attributes::OnOff::Set(static_cast(endpoint), value); return status == EMBER_ZCL_STATUS_SUCCESS; } @@ -90,7 +91,8 @@ jboolean OnOffManager::SetOnOff(jint endpoint, bool value) CHIP_ERROR OnOffManager::InitializeWithObjects(jobject managerObject) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - VerifyOrReturnLogError(env != nullptr, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NO_ENV, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); mOnOffManagerObject = env->NewGlobalRef(managerObject); VerifyOrReturnLogError(mOnOffManagerObject != nullptr, CHIP_ERROR_INVALID_ARGUMENT); @@ -114,7 +116,9 @@ void OnOffManager::HandleOnOffChanged(bool value) ChipLogProgress(Zcl, "OnOffManager::HandleOnOffChanged"); JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - VerifyOrReturn(env != NULL, ChipLogProgress(Zcl, "env null")); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); + VerifyOrReturn(mOnOffManagerObject != nullptr, ChipLogProgress(Zcl, "mOnOffManagerObject null")); VerifyOrReturn(mHandleOnOffChangedMethod != nullptr, ChipLogProgress(Zcl, "mHandleOnOffChangedMethod null")); diff --git a/examples/tv-app/android/java/WakeOnLanManager.cpp b/examples/tv-app/android/java/WakeOnLanManager.cpp index 99b4dc089dc250..3189bf98eb443f 100644 --- a/examples/tv-app/android/java/WakeOnLanManager.cpp +++ b/examples/tv-app/android/java/WakeOnLanManager.cpp @@ -54,12 +54,13 @@ CHIP_ERROR WakeOnLanManager::HandleGetMacAddress(chip::app::AttributeValueEncode jobject javaMac; CHIP_ERROR err = CHIP_NO_ERROR; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturnError(env != nullptr, CHIP_JNI_ERROR_NO_ENV, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); chip::CharSpan macValue; ChipLogProgress(Zcl, "Received WakeOnLanManager::HandleGetMacAddress"); VerifyOrExit(mWakeOnLanManagerObject != nullptr, err = CHIP_ERROR_INCORRECT_STATE); VerifyOrExit(mGetMacMethod != nullptr, err = CHIP_ERROR_INCORRECT_STATE); - VerifyOrExit(env != NULL, err = CHIP_JNI_ERROR_NO_ENV); env->ExceptionClear(); javaMac = env->CallObjectMethod(mWakeOnLanManagerObject, mGetMacMethod); @@ -85,7 +86,8 @@ CHIP_ERROR WakeOnLanManager::HandleGetMacAddress(chip::app::AttributeValueEncode void WakeOnLanManager::InitializeWithObjects(jobject managerObject) { JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); - VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Failed to GetEnvForCurrentThread for WakeOnLanManager")); + VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNIEnv for current thread")); + JniLocalReferenceManager manager(env); mWakeOnLanManagerObject = env->NewGlobalRef(managerObject); VerifyOrReturn(mWakeOnLanManagerObject != nullptr, ChipLogError(Zcl, "Failed to NewGlobalRef WakeOnLanManager")); diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelInfo.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelInfo.java index 93ad0afef5539d..6f0421c1c08f34 100644 --- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelInfo.java +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelInfo.java @@ -19,6 +19,13 @@ public class ChannelInfo { + public enum ChannelType { + Satellite, + Cable, + Terrestrial, + OTT + } + public static final int kSuccess = 0; public static final int kMultipleMatches = 1; public static final int kNoMatches = 2; @@ -29,15 +36,25 @@ public class ChannelInfo { public String name; public String callSign; public String affiliateCallSign; + public String identifier; + public ChannelType type; public ChannelInfo( - int majorNumber, int minorNumber, String name, String callSign, String affiliateCallSign) { + int majorNumber, + int minorNumber, + String name, + String callSign, + String affiliateCallSign, + String identifier, + ChannelType type) { this.status = kSuccess; this.majorNumber = majorNumber; this.minorNumber = minorNumber; this.name = name; this.callSign = callSign; this.affiliateCallSign = affiliateCallSign; + this.identifier = identifier; + this.type = type; } public ChannelInfo(int status) { diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManager.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManager.java index 336bfa5340aff9..646d37ab46670e 100644 --- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManager.java +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManager.java @@ -17,6 +17,8 @@ */ package com.matter.tv.server.tvapp; +import java.util.Map; + public interface ChannelManager { ChannelInfo[] getChannelList(); @@ -30,4 +32,19 @@ public interface ChannelManager { boolean changeChannelByNumber(int majorNumber, int minorNumber); boolean skipChannel(int count); + + ChannelProgramResponse getProgramGuide( + long startTime, + long endTime, + ChannelInfo[] channels, + String pageToken, + boolean series, + Map.Entry[] externalIDList, + String data); + + boolean recordProgram( + String identifier, boolean series, Map.Entry[] externalIDList, String data); + + boolean cancelRecordProgram( + String identifier, boolean series, Map.Entry[] externalIDList, String data); } diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManagerStub.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManagerStub.java index a90e1838778611..1320f8b295e8d9 100644 --- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManagerStub.java +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelManagerStub.java @@ -18,8 +18,10 @@ package com.matter.tv.server.tvapp; import android.util.Log; +import com.matter.tv.server.tvapp.ChannelInfo.ChannelType; import java.util.ArrayList; import java.util.List; +import java.util.Map; public class ChannelManagerStub implements ChannelManager { private static final String TAG = ChannelManagerStub.class.getSimpleName(); @@ -27,11 +29,31 @@ public class ChannelManagerStub implements ChannelManager { private int endpoint; private int currentChannelIndex = 0; private ChannelInfo currentChannel; + + ChannelInfo chanAbc = new ChannelInfo(6, 0, "ABC", "KAAL-TV", "KAAL", "id-1", ChannelType.Cable); + ChannelInfo chanPbs = + new ChannelInfo(9, 1, "PBS", "KCTS-TV", "KCTS", "id-2", ChannelType.Satellite); + ChannelInfo chanWor = + new ChannelInfo(9, 3, "World Channel", "KCTS-TV", "KCTS", "id-4", ChannelType.Terrestrial); + private ChannelInfo[] channelList = { - new ChannelInfo(6, 0, "ABC", "KAAL-TV", "KAAL"), - new ChannelInfo(9, 1, "PBS", "KCTS-TV", "KCTS"), - new ChannelInfo(9, 2, "PBS Kids", "KCTS-TV", "KCTS"), - new ChannelInfo(9, 3, "World Channel", "KCTS-TV", "KCTS") + chanAbc, + chanPbs, + chanWor, + new ChannelInfo(9, 2, "PBS Kids", "KCTS-TV", "KCTS", "id-3", ChannelType.OTT) + }; + + private ChannelProgramInfo[] programList = { + new ChannelProgramInfo( + "progid-abc1", chanAbc, 0, 30 * 60, "First Show", "First subtitle", "First Description"), + new ChannelProgramInfo( + "progid-pbs1", chanPbs, 0, 30 * 60, "Show 2", "subtitle 2", "Description 2"), + new ChannelProgramInfo( + "progid-abc2", chanAbc, 30 * 60, 60 * 60, "Show 3", "subtitle 3", "Description 3"), + new ChannelProgramInfo( + "progid-abc3", chanAbc, 30 * 60, 60 * 60, "Show 4", "subtitle 4", "Description 4"), + new ChannelProgramInfo( + "id-5", chanWor, 60 * 60, 90 * 60, "Show 5", "subtitle 5", "Description 5"), }; public ChannelManagerStub(int endpoint) { @@ -142,4 +164,46 @@ public boolean skipChannel(int count) { currentChannel = channelList[newChannelIndex]; return true; } + + @Override + public ChannelProgramResponse getProgramGuide( + long startTime, + long endTime, + ChannelInfo[] channels, + String pageToken, + boolean series, + Map.Entry[] externalIDList, + String data) { + ChannelProgramResponse resp = new ChannelProgramResponse(); + resp.programs = programList; + return resp; + } + + @Override + public boolean recordProgram( + String identifier, boolean series, Map.Entry[] externalIDList, String data) { + for (ChannelProgramInfo program : programList) { + if (program.identifier.equals(identifier)) { + program.recordFlagSeries = series; + program.recordFlagScheduled = true; + return true; + } + } + return false; + } + + @Override + public boolean cancelRecordProgram( + String identifier, boolean series, Map.Entry[] externalIDList, String data) { + for (ChannelProgramInfo program : programList) { + if (program.identifier.equals(identifier)) { + if (series) { + program.recordFlagSeries = false; + } + program.recordFlagScheduled = false; + return true; + } + } + return false; + } } diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelProgramInfo.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelProgramInfo.java new file mode 100644 index 00000000000000..31c9535249afc0 --- /dev/null +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelProgramInfo.java @@ -0,0 +1,52 @@ +/* + * 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. + * + */ +package com.matter.tv.server.tvapp; + +import java.util.Map; + +public class ChannelProgramInfo { + + public String identifier; + public ChannelInfo channel; + public long startTime; + public long endTime; + public String title; + public String subTitle; + public String description; + public boolean recordFlagScheduled = false; + public boolean recordFlagSeries = false; + public boolean recordFlagRecorded = false; + public Map.Entry[] externalIDList; + + public ChannelProgramInfo( + String identifier, + ChannelInfo channel, + long startTime, + long endTime, + String title, + String subTitle, + String description) { + this.identifier = identifier; + this.channel = channel; + this.startTime = startTime; + this.endTime = endTime; + this.title = title; + this.subTitle = subTitle; + this.description = description; + } +} diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelProgramResponse.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelProgramResponse.java new file mode 100644 index 00000000000000..d89b1a146a733c --- /dev/null +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/ChannelProgramResponse.java @@ -0,0 +1,28 @@ +/* + * 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. + * + */ +package com.matter.tv.server.tvapp; + +public class ChannelProgramResponse { + ChannelProgramInfo[] programs; + int previousLimit = -1; + String previousAfter; + String previousBefore; + int nextLimit = -1; + String nextAfter; + String nextBefore; +} diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManager.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManager.java index 9047e54c0d596a..6c0b04a374b442 100755 --- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManager.java +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManager.java @@ -119,4 +119,36 @@ public interface MediaPlaybackManager { /** Get the position of playback (Position field) at the time (UpdateAt field) specified */ MediaPlaybackPosition getPosition(); + + /** + * Get the available tracks + * + * @param audio true=audio, false=text + * @return list of available tracks + */ + MediaTrack[] getAvailableTracks(boolean audio); + + /** + * activate the given track + * + * @param audio true=audio, false=text + * @param id track id + * @return the response status defined in RESPONSE_STATUS_XXX + */ + int activateTrack(boolean audio, String id); + + /** + * Deactivate the current test track + * + * @return the response status defined in RESPONSE_STATUS_XXX + */ + int deactivateTextTrack(); + + /** + * Get the active track + * + * @param audio true=audio, false=text + * @return active track or null + */ + MediaTrack getActiveTrack(boolean audio); } diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManagerStub.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManagerStub.java index 062e83008677e0..a6b9afcc603338 100755 --- a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManagerStub.java +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaPlaybackManagerStub.java @@ -35,6 +35,18 @@ public class MediaPlaybackManagerStub implements MediaPlaybackManager { private static int playbackMaxForwardSpeed = 10; private static int playbackMaxRewindSpeed = -10; + private static MediaTrack activeAudioTrack = null; + private static MediaTrack[] audioTracks = { + new MediaTrack("activeAudioTrackId_0", "languageCode1", "displayName1"), + new MediaTrack("activeAudioTrackId_1", "languageCode2", "displayName2") + }; + + private static MediaTrack activeTextTrack = null; + private static MediaTrack[] textTracks = { + new MediaTrack("activeTextTrackId_0", "languageCode1", "displayName1"), + new MediaTrack("activeTextTrackId_1", "languageCode2", "displayName2") + }; + public MediaPlaybackManagerStub(int endpoint) { this.endpoint = endpoint; } @@ -69,6 +81,8 @@ public long getAttributes(int attributesId) { case ATTRIBUTE_PLAYBACK_SEEK_RANGE_START: Log.d(TAG, "getAttributes SampledPosition SeekRangeStart " + startTime + " at " + endpoint); return startTime; + + // TODO: add audio/text track available/active attributes } return -1; @@ -183,4 +197,41 @@ public MediaPlaybackPosition getPosition() { Log.d(TAG, "getPosition " + playbackPosition); return new MediaPlaybackPosition(playbackPosition); } + + @Override + public MediaTrack[] getAvailableTracks(boolean audio) { + return (audio ? audioTracks : textTracks); + } + + @Override + public int activateTrack(boolean audio, String id) { + if (audio) { + for (MediaTrack track : audioTracks) { + if (track.id.equalsIgnoreCase(id)) { + activeAudioTrack = track; + return RESPONSE_STATUS_SUCCESS; + } + } + return RESPONSE_STATUS_NOT_ALLOWED; // TODO + } else { + for (MediaTrack track : textTracks) { + if (track.id.equalsIgnoreCase(id)) { + activeTextTrack = track; + return RESPONSE_STATUS_SUCCESS; + } + } + return RESPONSE_STATUS_NOT_ALLOWED; // TODO + } + } + + @Override + public int deactivateTextTrack() { + activeTextTrack = null; + return RESPONSE_STATUS_SUCCESS; + } + + @Override + public MediaTrack getActiveTrack(boolean audio) { + return (audio ? activeAudioTrack : activeTextTrack); + } } diff --git a/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaTrack.java b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaTrack.java new file mode 100644 index 00000000000000..f19492e188b72b --- /dev/null +++ b/examples/tv-app/android/java/src/com/matter/tv/server/tvapp/MediaTrack.java @@ -0,0 +1,30 @@ +/* + * 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. + * + */ +package com.matter.tv.server.tvapp; + +public class MediaTrack { + public String id; + public String languageCode; + public String displayName; + + public MediaTrack(String id, String languageCode, String displayName) { + this.id = id; + this.languageCode = languageCode; + this.displayName = displayName; + } +} diff --git a/examples/tv-app/tv-common/BUILD.gn b/examples/tv-app/tv-common/BUILD.gn index b24fd24839bdb3..c522709c0a8e85 100644 --- a/examples/tv-app/tv-common/BUILD.gn +++ b/examples/tv-app/tv-common/BUILD.gn @@ -52,8 +52,6 @@ source_set("tv-common-sources") { "clusters/audio-output/AudioOutputManager.h", "clusters/channel/ChannelManager.cpp", "clusters/channel/ChannelManager.h", - "clusters/content-app-observer/ContentAppObserver.cpp", - "clusters/content-app-observer/ContentAppObserver.h", "clusters/content-control/ContentController.cpp", "clusters/content-control/ContentController.h", "clusters/content-launcher/ContentLauncherManager.cpp", diff --git a/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp b/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp index a278de45489112..7599bc48ef5d29 100644 --- a/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp +++ b/examples/tv-app/tv-common/clusters/channel/ChannelManager.cpp @@ -69,29 +69,39 @@ ChannelManager::ChannelManager() program1.title = chip::CharSpan::fromCharString("ABC Title1"); program1.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle1")); program1.startTime = 0; - program1.endTime = 30 * 60 * 60; + program1.endTime = 30 * 60; mPrograms.push_back(program1); - ProgramType program_abc1; - program_abc1.identifier = chip::CharSpan::fromCharString("progid-pbs1"); - program_abc1.channel = pbs; - program_abc1.title = chip::CharSpan::fromCharString("PBS Title1"); - program_abc1.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle1")); - program_abc1.startTime = 0; - program_abc1.endTime = 30 * 60 * 60; + ProgramType program_pbs1; + program_pbs1.identifier = chip::CharSpan::fromCharString("progid-pbs1"); + program_pbs1.channel = pbs; + program_pbs1.title = chip::CharSpan::fromCharString("PBS Title1"); + program_pbs1.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle1")); + program_pbs1.startTime = 0; + program_pbs1.endTime = 30 * 60; - mPrograms.push_back(program_abc1); + mPrograms.push_back(program_pbs1); ProgramType program2; program2.identifier = chip::CharSpan::fromCharString("progid-abc2"); program2.channel = abc; program2.title = chip::CharSpan::fromCharString("My Program Title2"); program2.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle2")); - program2.startTime = 30 * 60 * 60; - program2.endTime = 30 * 60 * 60; + program2.startTime = 30 * 60; + program2.endTime = 60 * 60; mPrograms.push_back(program2); + + ProgramType program3; + program3.identifier = chip::CharSpan::fromCharString("progid-abc3"); + program3.channel = abc; + program3.title = chip::CharSpan::fromCharString("My Program Title3"); + program3.subtitle = MakeOptional(chip::CharSpan::fromCharString("My Program Subtitle3")); + program3.startTime = 0; + program3.endTime = 60 * 60; + + mPrograms.push_back(program3); } CHIP_ERROR ChannelManager::HandleGetChannelList(AttributeValueEncoder & aEncoder) @@ -182,7 +192,6 @@ void ChannelManager::HandleChangeChannel(CommandResponseHelper>(paging); - ProgramGuideResponseType response; - // response.channelPagingStruct = channelPaging; - response.programList = DataModel::List(mPrograms.data(), mPrograms.size()); + std::vector matches; + for (auto const & program : mPrograms) + { + if (startTime.ValueOr(0) > program.startTime) + { + continue; + } + if (endTime.HasValue() && endTime.ValueOr(0) < program.endTime) + { + continue; + } + if (channelList.HasValue()) + { + auto iter = channelList.Value().begin(); + bool match = false; + int listCount = 0; + while (iter.Next() && !match) + { + listCount++; + auto & channel = iter.GetValue(); + if (channel.minorNumber != program.channel.minorNumber || channel.majorNumber != program.channel.majorNumber) + { + continue; + } + // this sample code does not currently check OTT + match = true; + } + if (!match && listCount > 0) + { + continue; + } + } + // this sample code does not currently filter on external id list + matches.push_back(program); + } + ProgramGuideResponseType response; + response.programList = DataModel::List(matches.data(), matches.size()); helper.Success(response); } @@ -258,7 +301,7 @@ bool ChannelManager::HandleRecordProgram(const chip::CharSpan & programIdentifie for (auto & program : mPrograms) { std::string nextIdString(program.identifier.data(), program.identifier.size()); - if (strcmp(idString.c_str(), nextIdString.c_str()) == 0) + if (nextIdString == idString) { program.recordingFlag = MakeOptional(static_cast(shouldRecordSeries ? 2 : 1)); } @@ -276,7 +319,7 @@ bool ChannelManager::HandleCancelRecordProgram(const chip::CharSpan & programIde for (auto & program : mPrograms) { std::string nextIdString(program.identifier.data(), program.identifier.size()); - if (strcmp(idString.c_str(), nextIdString.c_str()) == 0) + if (nextIdString == idString) { program.recordingFlag = MakeOptional(static_cast(0)); } diff --git a/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp b/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp index 6eb71bd53a96bd..fe220ce612e7d5 100644 --- a/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp +++ b/examples/tv-app/tv-common/clusters/media-playback/MediaPlaybackManager.cpp @@ -277,42 +277,32 @@ void MediaPlaybackManager::HandleStartOver(CommandResponseHelper>( { chip::app::DataModel::MakeNullable(chip::CharSpan("displayName2", 12)) }) }) } }; - TrackType mActiveTextTrack = { chip::CharSpan("activeTextTrackId_0", 19), - chip::app::DataModel::Nullable( - { chip::CharSpan("languageCode1", 13), - chip::Optional>( - { chip::app::DataModel::MakeNullable(chip::CharSpan("displayName1", 12)) }) }) }; + TrackType mActiveTextTrack = {}; std::vector mAvailableTextTracks = { { chip::CharSpan("activeTextTrackId_0", 19), chip::app::DataModel::Nullable( diff --git a/examples/tv-app/tv-common/include/AppTv.h b/examples/tv-app/tv-common/include/AppTv.h index 0a56ebe1da8624..bd056ae6813a5f 100644 --- a/examples/tv-app/tv-common/include/AppTv.h +++ b/examples/tv-app/tv-common/include/AppTv.h @@ -33,7 +33,6 @@ #include "application-basic/ApplicationBasicManager.h" #include "application-launcher/ApplicationLauncherManager.h" #include "channel/ChannelManager.h" -#include "content-app-observer/ContentAppObserver.h" #include "content-control/ContentController.h" #include "content-launcher/ContentLauncherManager.h" #include "keypad-input/KeypadInputManager.h" @@ -60,7 +59,6 @@ using ApplicationLauncherDelegate = app::Clusters::ApplicationLauncher::Delegate using ChannelDelegate = app::Clusters::Channel::Delegate; using ContentLauncherDelegate = app::Clusters::ContentLauncher::Delegate; using ContentControllerDelegate = app::Clusters::ContentControl::Delegate; -using ContentAppObserverDelegate = app::Clusters::ContentAppObserver::Delegate; using KeypadInputDelegate = app::Clusters::KeypadInput::Delegate; using MediaPlaybackDelegate = app::Clusters::MediaPlayback::Delegate; using TargetNavigatorDelegate = app::Clusters::TargetNavigator::Delegate; @@ -90,7 +88,6 @@ class DLL_EXPORT ContentAppImpl : public ContentApp ChannelDelegate * GetChannelDelegate() override { return &mChannelDelegate; }; ContentLauncherDelegate * GetContentLauncherDelegate() override { return &mContentLauncherDelegate; }; ContentControllerDelegate * GetContentControlDelegate() override { return &mContentControlDelegate; }; - ContentAppObserverDelegate * GetContentAppObserverDelegate() override { return &mContentAppObserverDelegate; }; KeypadInputDelegate * GetKeypadInputDelegate() override { return &mKeypadInputDelegate; }; MediaPlaybackDelegate * GetMediaPlaybackDelegate() override { return &mMediaPlaybackDelegate; }; TargetNavigatorDelegate * GetTargetNavigatorDelegate() override { return &mTargetNavigatorDelegate; }; @@ -101,7 +98,6 @@ class DLL_EXPORT ContentAppImpl : public ContentApp ApplicationLauncherManager mApplicationLauncherDelegate; ChannelManager mChannelDelegate; ContentLauncherManager mContentLauncherDelegate; - ContentAppObserverManager mContentAppObserverDelegate; ContentControlManager mContentControlDelegate; KeypadInputManager mKeypadInputDelegate; MediaPlaybackManager mMediaPlaybackDelegate; diff --git a/examples/tv-app/tv-common/src/ZCLCallbacks.cpp b/examples/tv-app/tv-common/src/ZCLCallbacks.cpp index 1358ab0bba9bb1..c56a3f73e76afc 100644 --- a/examples/tv-app/tv-common/src/ZCLCallbacks.cpp +++ b/examples/tv-app/tv-common/src/ZCLCallbacks.cpp @@ -31,7 +31,6 @@ #include "application-launcher/ApplicationLauncherManager.h" #include "audio-output/AudioOutputManager.h" #include "channel/ChannelManager.h" -#include "content-app-observer/ContentAppObserver.h" #include "content-control/ContentController.h" #include "content-launcher/ContentLauncherManager.h" #include "keypad-input/KeypadInputManager.h" @@ -51,7 +50,6 @@ static ApplicationLauncherManager applicationLauncherManager(false); #endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED static AudioOutputManager audioOutputManager; static ChannelManager channelManager; -static ContentAppObserverManager contentAppObserverManager; static ContentControlManager contentControlManager; static ContentLauncherManager contentLauncherManager; static KeypadInputManager keypadInputManager; @@ -130,12 +128,6 @@ void emberAfAudioOutputClusterInitCallback(EndpointId endpoint) AudioOutput::SetDefaultDelegate(endpoint, &audioOutputManager); } -void emberAfContentAppObserverClusterInitCallback(EndpointId endpoint) -{ - ChipLogProgress(Zcl, "TV Linux App: ContentAppObserverManager::SetDefaultDelegate"); - ContentAppObserver::SetDefaultDelegate(endpoint, &contentAppObserverManager); -} - void emberAfContentControlClusterInitCallback(EndpointId endpoint) { ChipLogProgress(Zcl, "TV Linux App: ContentControlManager::SetDefaultDelegate"); diff --git a/examples/tv-app/tv-common/tv-app.matter b/examples/tv-app/tv-common/tv-app.matter index 3f0d6b09e1f33b..b893f790792eb5 100644 --- a/examples/tv-app/tv-common/tv-app.matter +++ b/examples/tv-app/tv-common/tv-app.matter @@ -2025,7 +2025,7 @@ cluster RelativeHumidityMeasurement = 1029 { /** This cluster provides an interface for managing low power mode on a device that supports the Wake On LAN protocol. */ cluster WakeOnLan = 1283 { - revision 1; // NOTE: Default/not specifically set + revision 1; readonly attribute optional char_string<12> MACAddress = 0; readonly attribute optional octet_string<16> linkLocalAddress = 1; @@ -2039,12 +2039,13 @@ cluster WakeOnLan = 1283 { /** This cluster provides an interface for controlling the current Channel on a device. */ cluster Channel = 1284 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum ChannelTypeEnum : enum8 { kSatellite = 0; kCable = 1; kTerrestrial = 2; + kOTT = 3; } enum LineupInfoTypeEnum : enum8 { @@ -2060,14 +2061,14 @@ cluster Channel = 1284 { bitmap Feature : bitmap32 { kChannelList = 0x1; kLineupInfo = 0x2; - kElectronicGuide = 0x3; - kRecordProgram = 0x4; + kElectronicGuide = 0x4; + kRecordProgram = 0x8; } bitmap RecordingFlagBitmap : bitmap32 { kScheduled = 0x1; kRecordSeries = 0x2; - kRecorded = 0x3; + kRecorded = 0x4; } struct ProgramCastStruct { @@ -2213,7 +2214,7 @@ cluster Channel = 1284 { /** This cluster provides an interface for UX navigation within a set of targets on a device or endpoint. */ cluster TargetNavigator = 1285 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum StatusEnum : enum8 { kSuccess = 0; @@ -2257,7 +2258,7 @@ cluster TargetNavigator = 1285 { /** This cluster provides an interface for controlling Media Playback (PLAY, PAUSE, etc) on a media device such as a TV or Speaker. */ cluster MediaPlayback = 1286 { - revision 1; // NOTE: Default/not specifically set + revision 2; enum CharacteristicEnum : enum8 { kForcedSubtitles = 0; @@ -2299,9 +2300,9 @@ cluster MediaPlayback = 1286 { bitmap Feature : bitmap32 { kAdvancedSeek = 0x1; kVariableSpeed = 0x2; - kTextTracks = 0x3; - kAudioTracks = 0x4; - kAudioAdvance = 0x5; + kTextTracks = 0x4; + kAudioTracks = 0x8; + kAudioAdvance = 0x10; } struct TrackAttributesStruct { @@ -2904,7 +2905,7 @@ cluster ApplicationBasic = 1293 { /** This cluster provides commands that facilitate user account login on a Content App or a node. For example, a Content App running on a Video Player device, which is represented as an endpoint (see [TV Architecture]), can use this cluster to help make the user account on the Content App match the user account on the Client. */ cluster AccountLogin = 1294 { - revision 1; // NOTE: Default/not specifically set + revision 2; critical event LoggedOut = 0 { optional node_id node = 0; @@ -2950,9 +2951,9 @@ cluster ContentControl = 1295 { bitmap Feature : bitmap32 { kScreenTime = 0x1; kPINManagement = 0x2; - kBlockUnrated = 0x3; - kOnDemandContentRating = 0x4; - kScheduledContentRating = 0x5; + kBlockUnrated = 0x4; + kOnDemandContentRating = 0x8; + kScheduledContentRating = 0x10; } struct RatingNameStruct { @@ -3070,7 +3071,7 @@ endpoint 0 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -3428,7 +3429,7 @@ endpoint 1 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -3578,7 +3579,7 @@ endpoint 1 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + ram attribute featureMap default = 28; ram attribute clusterRevision default = 1; handle command UpdatePIN; @@ -3641,7 +3642,7 @@ endpoint 2 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } } @@ -3655,7 +3656,7 @@ endpoint 3 { callback attribute serverList; callback attribute clientList; callback attribute partsList; - ram attribute featureMap default = 0; + callback attribute featureMap; callback attribute clusterRevision; } @@ -3809,7 +3810,7 @@ endpoint 3 { callback attribute acceptedCommandList; callback attribute eventList; callback attribute attributeList; - ram attribute featureMap default = 0; + ram attribute featureMap default = 28; ram attribute clusterRevision default = 1; handle command UpdatePIN; diff --git a/examples/tv-app/tv-common/tv-app.zap b/examples/tv-app/tv-common/tv-app.zap index c6cde12f5eac5e..955307dbf00c31 100644 --- a/examples/tv-app/tv-common/tv-app.zap +++ b/examples/tv-app/tv-common/tv-app.zap @@ -139,10 +139,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -4664,10 +4664,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -6263,7 +6263,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": "28", "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -6820,10 +6820,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -6955,10 +6955,10 @@ "side": "server", "type": "bitmap32", "included": 1, - "storageOption": "RAM", + "storageOption": "External", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": null, "reportable": 1, "minInterval": 1, "maxInterval": 65534, @@ -8707,7 +8707,7 @@ "storageOption": "RAM", "singleton": 0, "bounded": 0, - "defaultValue": "0", + "defaultValue": "28", "reportable": 1, "minInterval": 1, "maxInterval": 65534, diff --git a/examples/tv-casting-app/APIs.md b/examples/tv-casting-app/APIs.md index 4afb4f6556fe28..f0fdb32484a72e 100644 --- a/examples/tv-casting-app/APIs.md +++ b/examples/tv-casting-app/APIs.md @@ -773,7 +773,8 @@ func connect(selectedCastingPlayer: MCCastingPlayer?) { ### Select an Endpoint on the Casting Player -_{Complete Endpoint selection examples: [Linux](linux/simple-app-helper.cpp)}_ +_{Complete Endpoint selection examples: [Linux](linux/simple-app-helper.cpp) | +[iOS](darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift)}_ On a successful connection with a `CastingPlayer`, a Casting Client may select one of the Endpoints to interact with based on its attributes (e.g. Vendor ID, @@ -799,6 +800,19 @@ if (it != endpoints.end()) } ``` +On iOS, it can select an `MCEndpoint` similarly and as shown below. + +```swift +// VendorId of the MCEndpoint on the MCCastingPlayer that the MCCastingApp desires to interact with after connection +let sampleEndpointVid: Int = 65521 +... +// select the MCEndpoint on the MCCastingPlayer to invoke the command on +if let endpoint: MCEndpoint = castingPlayer.endpoints().filter({ $0.vendorId().intValue == sampleEndpointVid}).first +{ +... +} +``` + ## Interacting with a Casting Endpoint Once the Casting Client has selected an `Endpoint`, it is ready to @@ -819,13 +833,14 @@ response types to use with these APIs: ### Issuing Commands -_{Complete Command invocation examples: [Linux](linux/simple-app-helper.cpp)}_ +_{Complete Command invocation examples: [Linux](linux/simple-app-helper.cpp) | +[iOS](darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift)}_ -The Casting Client can get a reference to a `endpoint` on a `CastingPlayer`, +The Casting Client can get a reference to an `Endpoint` on a `CastingPlayer`, check if it supports the required cluster/command, and send commands to it. It can then handle any command response / error the `CastingPlayer` sends back. -On Linux, for example, given an `endpoint`, it can send a `LaunchURL` command +On Linux, for example, given an `Endpoint`, it can send a `LaunchURL` command (part of the Content Launcher cluster) by calling the `Invoke` API on a `Command` of type `matter::casting::core::Command` @@ -865,9 +880,65 @@ void InvokeContentLauncherLaunchURL(matter::casting::memory::Strong= 3 minutes. + private static final long MIN_CONNECTION_TIMEOUT_SEC = 3 * 60; + private final CastingPlayer targetCastingPlayer; + private TextView connectionFragmentStatusTextView; + private Button connectionFragmentNextButton; + + public ConnectionExampleFragment(CastingPlayer targetCastingPlayer) { + Log.i(TAG, "ConnectionExampleFragment() called with target CastingPlayer"); + this.targetCastingPlayer = targetCastingPlayer; + } + + /** + * Use this factory method to create a new instance of this fragment using the provided + * parameters. + * + * @return A new instance of fragment ConnectionExampleFragment. + */ + public static ConnectionExampleFragment newInstance(CastingPlayer castingPlayer) { + Log.i(TAG, "newInstance() called"); + return new ConnectionExampleFragment(castingPlayer); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.i(TAG, "onCreate() called"); + } + + @Override + public View onCreateView( + LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + Log.i(TAG, "onCreateView() called"); + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_matter_connection_example, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Log.i(TAG, "onViewCreated() called"); + + connectionFragmentStatusTextView = getView().findViewById(R.id.connectionFragmentStatusText); + connectionFragmentStatusTextView.setText( + "Verifying or establishing connection with Casting Player with device name: " + + targetCastingPlayer.getDeviceName()); + + connectionFragmentNextButton = getView().findViewById(R.id.connectionFragmentNextButton); + Callback callback = (ConnectionExampleFragment.Callback) this.getActivity(); + connectionFragmentNextButton.setOnClickListener( + v -> { + Log.i(TAG, "onViewCreated() NEXT clicked. Calling handleConnectionComplete()"); + callback.handleConnectionComplete(targetCastingPlayer); + }); + + Executors.newSingleThreadExecutor() + .submit( + () -> { + Log.d(TAG, "onViewCreated() calling verifyOrEstablishConnection()"); + + EndpointFilter desiredEndpointFilter = + new EndpointFilter(null, 65521, new ArrayList()); + // The desired commissioning window timeout and EndpointFilter are optional. + CompletableFuture completableFuture = + targetCastingPlayer.VerifyOrEstablishConnection( + MIN_CONNECTION_TIMEOUT_SEC, desiredEndpointFilter); + + Log.d(TAG, "onViewCreated() verifyOrEstablishConnection() called"); + + completableFuture + .thenRun( + () -> { + Log.i( + TAG, + "CompletableFuture.thenRun(), connected to CastingPlayer with deviceId: " + + targetCastingPlayer.getDeviceId()); + getActivity() + .runOnUiThread( + () -> { + connectionFragmentStatusTextView.setText( + "Connected to Casting Player with device name: " + + targetCastingPlayer.getDeviceName()); + connectionFragmentNextButton.setEnabled(true); + }); + }) + .exceptionally( + exc -> { + Log.e( + TAG, + "CompletableFuture.exceptionally(), CastingPLayer connection failed: " + + exc.getMessage()); + getActivity() + .runOnUiThread( + () -> { + connectionFragmentStatusTextView.setText( + "Casting Player connection failed due to: " + + exc.getMessage()); + }); + return null; + }); + }); + } + + /** Interface for notifying the host. */ + public interface Callback { + /** Notifies listener to trigger transition on completion of connection */ + void handleConnectionComplete(CastingPlayer castingPlayer); + } +} diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java b/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java index 4c5d68fdb60654..67db95be2637df 100644 --- a/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java @@ -338,11 +338,10 @@ public View getView(int i, View view, ViewGroup viewGroup) { CastingPlayer castingPlayer = playerList.get(i); Log.d( TAG, - "OnItemClickListener.onClick() called for castingPlayer with deviceId: " + "OnClickListener.onClick() called for CastingPlayer with deviceId: " + castingPlayer.getDeviceId()); DiscoveryExampleFragment.Callback callback1 = (DiscoveryExampleFragment.Callback) context; - // TODO: In following PRs. Implement CastingPlayer connection - // callback1.handleCommissioningButtonClicked(castingPlayer); + callback1.handleConnectionButtonClicked(castingPlayer); }; playerDescription.setOnClickListener(clickListener); return view; diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java index 71ea4767a03994..723f1b8e93b1a5 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java @@ -16,8 +16,10 @@ */ package com.matter.casting.core; +import com.matter.casting.support.EndpointFilter; import java.net.InetAddress; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * The CastingPlayer interface defines a Matter commissioner that is able to play media to a @@ -55,24 +57,38 @@ public interface CastingPlayer { @Override int hashCode(); - // TODO: Implement in following PRs. Related to player connection implementation. - // List getEndpoints(); - // - // ConnectionState getConnectionState(); - // - // CompletableFuture connect(long timeout); - // - // static class ConnectionState extends Observable { - // private boolean connected; - // - // void setConnected(boolean connected) { - // this.connected = connected; - // setChanged(); - // notifyObservers(this.connected); - // } - // - // boolean isConnected() { - // return connected; - // } - // } + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @param commissioningWindowTimeoutSec (Optional) time (in sec) to keep the commissioning window + * open, if commissioning is required. Needs to be >= MIN_CONNECTION_TIMEOUT_SEC. + * @param desiredEndpointFilter (Optional) Attributes (such as VendorId) describing an Endpoint + * that the client wants to interact with after commissioning. If this value is passed in, the + * VerifyOrEstablishConnection will force User Directed Commissioning, in case the desired + * Endpoint is not found in the on device CastingStore. + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + CompletableFuture VerifyOrEstablishConnection( + long commissioningWindowTimeoutSec, EndpointFilter desiredEndpointFilter); + + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + CompletableFuture VerifyOrEstablishConnection(); } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java index ecc76a575a115b..d5d93c3204ec34 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java @@ -16,9 +16,11 @@ */ package com.matter.casting.core; +import com.matter.casting.support.EndpointFilter; import java.net.InetAddress; import java.util.List; import java.util.Objects; +import java.util.concurrent.CompletableFuture; /** * A Matter Casting Player represents a Matter commissioner that is able to play media to a physical @@ -27,6 +29,13 @@ * the service discovered/resolved. */ public class MatterCastingPlayer implements CastingPlayer { + private static final String TAG = MatterCastingPlayer.class.getSimpleName(); + /** + * Time (in sec) to keep the commissioning window open, if commissioning is required. Must be >= 3 + * minutes. + */ + public static final long MIN_CONNECTION_TIMEOUT_SEC = 3 * 60; + private boolean connected; private String deviceId; private String deviceName; @@ -37,6 +46,7 @@ public class MatterCastingPlayer implements CastingPlayer { private int productId; private int vendorId; private long deviceType; + protected long _cppCastingPlayer; public MatterCastingPlayer( boolean connected, @@ -137,4 +147,43 @@ public boolean equals(Object o) { MatterCastingPlayer that = (MatterCastingPlayer) o; return Objects.equals(this.deviceId, that.deviceId); } + + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @param commissioningWindowTimeoutSec (Optional) time (in sec) to keep the commissioning window + * open, if commissioning is required. Needs to be >= MIN_CONNECTION_TIMEOUT_SEC. + * @param desiredEndpointFilter (Optional) Attributes (such as VendorId) describing an Endpoint + * that the client wants to interact with after commissioning. If this value is passed in, the + * VerifyOrEstablishConnection will force User Directed Commissioning, in case the desired + * Endpoint is not found in the on device CastingStore. + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + @Override + public native CompletableFuture VerifyOrEstablishConnection( + long commissioningWindowTimeoutSec, EndpointFilter desiredEndpointFilter); + + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + @Override + public CompletableFuture VerifyOrEstablishConnection() { + return VerifyOrEstablishConnection(MIN_CONNECTION_TIMEOUT_SEC, null); + } } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/DeviceTypeStruct.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/DeviceTypeStruct.java new file mode 100644 index 00000000000000..4c0271c69ecdf2 --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/DeviceTypeStruct.java @@ -0,0 +1,28 @@ +/* + * 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. + */ +package com.matter.casting.support; + +/** A class to describe a Matter device type. */ +public class DeviceTypeStruct { + public long deviceType; + public int revision; + + public DeviceTypeStruct(long deviceType, int revision) { + this.deviceType = deviceType; + this.revision = revision; + } +} diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/EndpointFilter.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/EndpointFilter.java new file mode 100644 index 00000000000000..1152e48b95890c --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/EndpointFilter.java @@ -0,0 +1,35 @@ +/* + * 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. + */ +package com.matter.casting.support; + +import java.util.List; + +/** Describes an Endpoint that the client wants to connect to. */ +public class EndpointFilter { + // Value of null means unspecified + public Integer productId; + // Value of null means unspecified + public Integer vendorId; + public List requiredDeviceTypes; + + public EndpointFilter( + Integer productId, Integer vendorId, List requiredDeviceTypes) { + this.productId = productId; + this.vendorId = vendorId; + this.requiredDeviceTypes = requiredDeviceTypes; + } +} diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.cpp new file mode 100644 index 00000000000000..2c0fe914232778 --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.cpp @@ -0,0 +1,171 @@ +/* + * 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. + * + */ + +#include "CastingPlayer-JNI.h" + +#include "../JNIDACProvider.h" +#include "../support/CastingPlayerConverter-JNI.h" +#include "../support/ErrorConverter-JNI.h" +#include "../support/RotatingDeviceIdUniqueIdProvider-JNI.h" +#include "core/CastingApp.h" // from tv-casting-common +#include "core/CastingPlayer.h" // from tv-casting-common +#include "core/CastingPlayerDiscovery.h" // from tv-casting-common + +#include +#include +#include +#include +#include + +using namespace chip; + +#define JNI_METHOD(RETURN, METHOD_NAME) \ + extern "C" JNIEXPORT RETURN JNICALL Java_com_matter_casting_core_MatterCastingPlayer_##METHOD_NAME + +namespace matter { +namespace casting { +namespace core { + +JNI_METHOD(jobject, VerifyOrEstablishConnection) +(JNIEnv * env, jobject thiz, jlong commissioningWindowTimeoutSec, jobject desiredEndpointFilterJavaObject) +{ + chip::DeviceLayer::StackLock lock; + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() called with a timeout of: %ld seconds", + static_cast(commissioningWindowTimeoutSec)); + + // Convert the CastingPlayer jlong to a CastingPlayer pointer + jclass castingPlayerClass = env->GetObjectClass(thiz); + jfieldID _cppCastingPlayerFieldId = env->GetFieldID(castingPlayerClass, "_cppCastingPlayer", "J"); + VerifyOrReturnValue( + _cppCastingPlayerFieldId != nullptr, nullptr, + ChipLogError(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() _cppCastingPlayerFieldId == nullptr")); + + jlong _cppCastingPlayerValue = env->GetLongField(thiz, _cppCastingPlayerFieldId); + CastingPlayer * castingPlayer = reinterpret_cast(_cppCastingPlayerValue); + VerifyOrReturnValue(castingPlayer != nullptr, nullptr, + ChipLogError(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() castingPlayer == nullptr")); + + // Create a new Java CompletableFuture + jclass completableFutureClass = env->FindClass("java/util/concurrent/CompletableFuture"); + jmethodID completableFutureConstructor = env->GetMethodID(completableFutureClass, "", "()V"); + jobject completableFutureObj = env->NewObject(completableFutureClass, completableFutureConstructor); + jobject completableFutureObjGlobalRef = env->NewGlobalRef(completableFutureObj); + VerifyOrReturnValue( + completableFutureObjGlobalRef != nullptr, nullptr, + ChipLogError(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() completableFutureObjGlobalRef == nullptr")); + + ConnectCallback callback = [completableFutureObjGlobalRef](CHIP_ERROR err, CastingPlayer * playerPtr) { + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() ConnectCallback called"); + VerifyOrReturn(completableFutureObjGlobalRef != nullptr, + ChipLogError(AppServer, "ConnectCallback, completableFutureObjGlobalRef == nullptr")); + + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != nullptr, ChipLogError(AppServer, "ConnectCallback, env == nullptr")); + // Ensures proper cleanup of local references to Java objects. + JniLocalReferenceManager manager(env); + // Ensures proper cleanup of global references to Java objects. + JniGlobalRefWrapper globalRefWrapper(completableFutureObjGlobalRef); + + jclass completableFutureClass = env->FindClass("java/util/concurrent/CompletableFuture"); + VerifyOrReturn(completableFutureClass != nullptr, + ChipLogError(AppServer, "ConnectCallback, completableFutureClass == nullptr"); + env->DeleteGlobalRef(completableFutureObjGlobalRef);); + + if (err == CHIP_NO_ERROR) + { + ChipLogProgress(AppServer, "ConnectCallback, Connected to Casting Player with device ID: %s", playerPtr->GetId()); + jmethodID completeMethod = env->GetMethodID(completableFutureClass, "complete", "(Ljava/lang/Object;)Z"); + VerifyOrReturn(completeMethod != nullptr, ChipLogError(AppServer, "ConnectCallback, completeMethod == nullptr")); + + chip::DeviceLayer::StackUnlock unlock; + env->CallBooleanMethod(completableFutureObjGlobalRef, completeMethod, nullptr); + } + else + { + ChipLogError(AppServer, "ConnectCallback, connection error: %" CHIP_ERROR_FORMAT, err.Format()); + jmethodID completeExceptionallyMethod = + env->GetMethodID(completableFutureClass, "completeExceptionally", "(Ljava/lang/Throwable;)Z"); + VerifyOrReturn(completeExceptionallyMethod != nullptr, + ChipLogError(AppServer, "ConnectCallback, completeExceptionallyMethod == nullptr")); + + // Create a Throwable object (e.g., RuntimeException) to pass to completeExceptionallyMethod + jclass throwableClass = env->FindClass("java/lang/RuntimeException"); + VerifyOrReturn(throwableClass != nullptr, ChipLogError(AppServer, "ConnectCallback, throwableClass == nullptr")); + jmethodID throwableConstructor = env->GetMethodID(throwableClass, "", "(Ljava/lang/String;)V"); + VerifyOrReturn(throwableConstructor != nullptr, + ChipLogError(AppServer, "ConnectCallback, throwableConstructor == nullptr")); + jstring errorMessage = env->NewStringUTF(err.Format()); + VerifyOrReturn(errorMessage != nullptr, ChipLogError(AppServer, "ConnectCallback, errorMessage == nullptr")); + jobject throwableObject = env->NewObject(throwableClass, throwableConstructor, errorMessage); + VerifyOrReturn(throwableObject != nullptr, ChipLogError(AppServer, "ConnectCallback, throwableObject == nullptr")); + + chip::DeviceLayer::StackUnlock unlock; + env->CallBooleanMethod(completableFutureObjGlobalRef, completeExceptionallyMethod, throwableObject); + } + }; + + if (desiredEndpointFilterJavaObject == nullptr) + { + ChipLogProgress(AppServer, + "CastingPlayer-JNI::VerifyOrEstablishConnection() calling CastingPlayer::VerifyOrEstablishConnection() on " + "Casting Player with device ID: %s", + castingPlayer->GetId()); + castingPlayer->VerifyOrEstablishConnection(callback, static_cast(commissioningWindowTimeoutSec)); + } + else + { + // Convert the EndpointFilter Java class to a C++ EndpointFilter + jclass endpointFilterJavaClass = env->GetObjectClass(desiredEndpointFilterJavaObject); + jfieldID vendorIdFieldId = env->GetFieldID(endpointFilterJavaClass, "vendorId", "Ljava/lang/Integer;"); + jfieldID productIdFieldId = env->GetFieldID(endpointFilterJavaClass, "productId", "Ljava/lang/Integer;"); + jobject vendorIdIntegerObject = env->GetObjectField(desiredEndpointFilterJavaObject, vendorIdFieldId); + jobject productIdIntegerObject = env->GetObjectField(desiredEndpointFilterJavaObject, productIdFieldId); + // jfieldID requiredDeviceTypesFieldId = env->GetFieldID(endpointFilterJavaClass, "requiredDeviceTypes", + // "Ljava/util/List;"); + + matter::casting::core::EndpointFilter desiredEndpointFilter; + // Value of 0 means unspecified + desiredEndpointFilter.vendorId = vendorIdIntegerObject != nullptr + ? static_cast(env->CallIntMethod( + vendorIdIntegerObject, env->GetMethodID(env->GetObjectClass(vendorIdIntegerObject), "intValue", "()I"))) + : 0; + desiredEndpointFilter.productId = productIdIntegerObject != nullptr + ? static_cast(env->CallIntMethod( + productIdIntegerObject, env->GetMethodID(env->GetObjectClass(productIdIntegerObject), "intValue", "()I"))) + : 0; + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() desiredEndpointFilter.vendorId: %d", + desiredEndpointFilter.vendorId); + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() desiredEndpointFilter.productId: %d", + desiredEndpointFilter.productId); + // TODO: In following PRs. Translate the Java requiredDeviceTypes list to a C++ requiredDeviceTypes vector. For now we're + // passing an empty list of DeviceTypeStruct. + + ChipLogProgress(AppServer, + "CastingPlayer-JNI::VerifyOrEstablishConnection() calling " + "CastingPlayer::VerifyOrEstablishConnection() on Casting Player with device ID: %s", + castingPlayer->GetId()); + castingPlayer->VerifyOrEstablishConnection(callback, static_cast(commissioningWindowTimeoutSec), + desiredEndpointFilter); + } + + return completableFutureObjGlobalRef; +} + +}; // namespace core +}; // namespace casting +}; // namespace matter diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.h b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.h new file mode 100644 index 00000000000000..2870866895c868 --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.h @@ -0,0 +1,41 @@ +/* + * + * 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 + +namespace matter { +namespace casting { +namespace core { + +class CastingPlayerJNI +{ +public: +private: + friend CastingPlayerJNI & CastingAppJNIMgr(); + static CastingPlayerJNI sInstance; +}; + +inline class CastingPlayerJNI & CastingAppJNIMgr() +{ + return CastingPlayerJNI::sInstance; +} +}; // namespace core +}; // namespace casting +}; // namespace matter diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp index 255ba570082e16..5d531e0164e4db 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp @@ -88,6 +88,7 @@ class DiscoveryDelegateImpl : public DiscoveryDelegate "CastingPlayer jobject")); JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + chip::DeviceLayer::StackUnlock unlock; env->CallVoidMethod(castingPlayerChangeListenerJavaObject, onAddedCallbackJavaMethodID, matterCastingPlayerJavaObject); } @@ -113,6 +114,7 @@ class DiscoveryDelegateImpl : public DiscoveryDelegate "create CastingPlayer jobject")); JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + chip::DeviceLayer::StackUnlock unlock; env->CallVoidMethod(castingPlayerChangeListenerJavaObject, onChangedCallbackJavaMethodID, matterCastingPlayerJavaObject); } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp index a993a501bd6aa0..72c3677f357707 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp @@ -83,7 +83,11 @@ jobject createJCastingPlayer(matter::casting::memory::StrongGetFieldID(matterCastingPlayerJavaClass, "_cppCastingPlayer", "J"); + env->SetLongField(jMatterCastingPlayer, longFieldId, reinterpret_cast(player.get())); return jMatterCastingPlayer; } diff --git a/examples/tv-casting-app/android/App/app/src/main/res/layout/fragment_matter_connection_example.xml b/examples/tv-casting-app/android/App/app/src/main/res/layout/fragment_matter_connection_example.xml new file mode 100644 index 00000000000000..8bdd1b4bb741aa --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/res/layout/fragment_matter_connection_example.xml @@ -0,0 +1,23 @@ + + + + + +