From 3be848d2374bfedaccc286eff3d1a80acfcaac23 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Tue, 30 Aug 2022 21:33:43 +0530 Subject: [PATCH 01/27] [ESP32] Remove the unused files for make build system (#22253) Since ESP-IDF V4.0, the default build system is based on CMake and will be removed in future idf releases. Also, none of the other components or examples uses them so removing component.mk --- config/esp32/components/chip/component.mk | 167 ------------------ .../components/esp32_mbedtls/component.mk | 1 - 2 files changed, 168 deletions(-) delete mode 100644 config/esp32/components/chip/component.mk delete mode 100644 config/esp32/components/esp32_mbedtls/component.mk diff --git a/config/esp32/components/chip/component.mk b/config/esp32/components/chip/component.mk deleted file mode 100644 index 61ab9100fa78e7..00000000000000 --- a/config/esp32/components/chip/component.mk +++ /dev/null @@ -1,167 +0,0 @@ -# -# Copyright (c) 2020 Project CHIP Authors -# Copyright (c) 2018 Nest Labs, Inc. -# 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. -# -# Description: -# Component makefile for building CHIP within the ESP32 ESP-IDF environment. -# - -# ================================================== -# General settings -# ================================================== - -SHELL = /bin/bash - -# CHIP source root directory -CHIP_ROOT ?= $(realpath $(COMPONENT_PATH)/../../../..) - -# Directory into which the CHIP build system will place its output. -OUTPUT_DIR := $(BUILD_DIR_BASE)/chip -REL_OUTPUT_DIR := $(shell perl -e 'use File::Spec; use Cwd; print File::Spec->abs2rel(Cwd::realpath($$ARGV[0]), Cwd::realpath($$ARGV[1])) . "\n"' $(OUTPUT_DIR) $(COMPONENT_PATH)) - -REL_CHIP_ROOT := $(shell perl -e 'use File::Spec; use Cwd; print File::Spec->abs2rel(Cwd::realpath($$ARGV[0]), Cwd::realpath($$ARGV[1])) . "\n"' $(CHIP_ROOT) $(COMPONENT_PATH)) - -COMPONENT_LIBRARIES := - - -# ================================================== -# Compilation flags specific to building CHIP -# ================================================== - -# Include directories to be searched when building CHIP. Make sure -# that anything starting with $(IDF_PATH) ends up being included with -# -isystem, not -I, so warnings in those headers don't cause the build -# to fail. -INCLUDES := $(OUTPUT_DIR)/src/include \ - $(OUTPUT_DIR)/src/include/platform/ESP32 \ - $(filter-out $(IDF_PATH)/%, $(COMPONENT_INCLUDES)) - -SYSTEM_INCLUDES := $(IDF_PATH)/components/lwip/lwip/src/include \ - $(IDF_PATH)/components/freertos/include/freertos/ \ - $(IDF_PATH)/components/mbedtls/mbedtls/include \ - $(filter $(IDF_PATH)/%, $(COMPONENT_INCLUDES)) - - -# Compiler flags for building CHIP -ALL_INCLUDES := $(addprefix -I,$(INCLUDES)) $(addprefix -isystem,$(SYSTEM_INCLUDES)) -CFLAGS += $(ALL_INCLUDES) -CPPFLAGS += $(ALL_INCLUDES) -CXXFLAGS += $(ALL_INCLUDES) - - -# ================================================== -# Configuration for the CHIP ESF-IDF Component -# ================================================== - -# Header directories to be included when building other components that use CHIP. -# Note that these must be relative to the component source directory. -# TODO Boot the CHIP_ROOT includedirs -COMPONENT_ADD_INCLUDEDIRS = project-config \ - $(REL_OUTPUT_DIR)/include \ - $(REL_CHIP_ROOT)/src/include/platform/ESP32 \ - $(REL_CHIP_ROOT)/src/include/ \ - $(REL_CHIP_ROOT)/src/lib \ - $(REL_CHIP_ROOT)/src/ \ - $(REL_CHIP_ROOT)/src/system \ - $(IDF_PATH)/components/mbedtls/mbedtls/include \ - $(REL_CHIP_ROOT)/src/app - -# Linker flags to be included when building other components that use CHIP. -COMPONENT_ADD_LDFLAGS = -L$(OUTPUT_DIR)/lib/ \ - -lCHIP - -ifdef CONFIG_ENABLE_CHIP_SHELL -COMPONENT_ADD_LDFLAGS += -lCHIPShell -endif - -ifdef CONFIG_ENABLE_PW_RPC -COMPONENT_ADD_LDFLAGS += -lPwRpc -endif - -COMPONENT_ADD_INCLUDEDIRS += $(REL_OUTPUT_DIR)/src/include \ - $(REL_CHIP_ROOT)/third_party/nlassert/repo/include \ - $(REL_OUTPUT_DIR)/gen/third_party/connectedhomeip/src/app/include \ - $(REL_OUTPUT_DIR)/gen/include \ - $(REL_CHIP_ROOT)/zzz_generated/app-common - -# Tell the ESP-IDF build system that the CHIP component defines its own build -# and clean targets. -COMPONENT_OWNBUILDTARGET := chip_build -COMPONENT_OWNCLEANTARGET := chip_clean - -is_debug ?= true - -# ================================================== -# Build Rules -# ================================================== - -$(OUTPUT_DIR) : - echo "MKDIR $@" - @mkdir -p "$@" - - -fix_cflags = $(filter-out -DHAVE_CONFIG_H,\ - $(filter-out -D,\ - $(filter-out IDF_VER%,\ - $(1) -D$(filter IDF_VER%,$(1))\ - ))) -CHIP_CFLAGS = $(call fix_cflags,$(CFLAGS) $(CPPFLAGS)) -CHIP_CXXFLAGS = $(call fix_cflags,$(CXXFLAGS) $(CPPFLAGS)) - -install-chip : $(OUTPUT_DIR) - echo "INSTALL CHIP..." - echo > $(OUTPUT_DIR)/args.gn - echo "import(\"//args.gni\")" >> $(OUTPUT_DIR)/args.gn - echo target_cflags_c = [$(foreach word,$(CHIP_CFLAGS),\"$(word)\",)] | sed -e 's/=\"/=\\"/g;s/\"\"/\\"\"/g;' >> $(OUTPUT_DIR)/args.gn - echo target_cflags_cc = [$(foreach word,$(CHIP_CXXFLAGS),\"$(word)\",)] | sed -e 's/=\"/=\\"/g;s/\"\"/\\"\"/g;' >> $(OUTPUT_DIR)/args.gn - echo esp32_ar = \"$(AR)\" >> $(OUTPUT_DIR)/args.gn - echo esp32_cc = \"$(CC)\" >> $(OUTPUT_DIR)/args.gn - echo esp32_cxx = \"$(CXX)\" >> $(OUTPUT_DIR)/args.gn - echo esp32_cpu = \"esp32\" >> $(OUTPUT_DIR)/args.gn -ifeq ($(is_debug),false) - @echo "is_debug = false" >> $(OUTPUT_DIR)/args.gn -endif - if [[ "$(CONFIG_ENABLE_PW_RPC)" = "y" ]]; then \ - echo "chip_build_pw_rpc_lib = true" >> $(OUTPUT_DIR)/args.gn ;\ - echo "chip_build_pw_trace_lib = true" >> $(OUTPUT_DIR)/args.gn ;\ - echo "remove_default_configs = [\"//third_party/connectedhomeip/third_party/pigweed/repo/pw_build:cpp17\"]" >> $(OUTPUT_DIR)/args.gn ;\ - echo "pw_log_BACKEND = \"//third_party/connectedhomeip/third_party/pigweed/repo/pw_log_basic\"" >> $(OUTPUT_DIR)/args.gn ;\ - echo "pw_assert_BACKEND = \"//third_party/connectedhomeip/third_party/pigweed/repo/pw_assert_log\"" >> $(OUTPUT_DIR)/args.gn ;\ - echo "pw_sys_io_BACKEND = \"//third_party/connectedhomeip/examples/platform/esp32/pw_sys_io:pw_sys_io_esp32\"" >> $(OUTPUT_DIR)/args.gn ;\ - echo "pw_trace_BACKEND = \"//third_party/connectedhomeip/third_party/pigweed/repo/pw_trace_tokenized\"" >> $(OUTPUT_DIR)/args.gn ;\ - echo "dir_pw_third_party_nanopb = \"//third_party/connectedhomeip/third_party/nanopb/repo\"" >>$(OUTPUT_DIR)/args.gn ;\ - fi - if [[ "$(CONFIG_ENABLE_CHIP_SHELL)" = "y" ]]; then \ - echo "chip_build_libshell = true" >> $(OUTPUT_DIR)/args.gn ;\ - fi - if [[ "$(CONFIG_USE_MINIMAL_MDNS)" = "n" ]]; then \ - echo "chip_mdns = platform" >> $(OUTPUT_DIR)/args.gn ;\ - fi - if [[ "$(CONFIG_DISABLE_IPV4)" = "y" ]]; then \ - echo "chip_inet_config_enable_ipv4 = false" >> $(OUTPUT_DIR)/args.gn ;\ - fi - echo "Written file $(OUTPUT_DIR)/args.gn" - cd $(CHIP_ROOT) && PW_ENVSETUP_QUIET=1 . scripts/activate.sh && cd $(COMPONENT_PATH) && gn gen --check --fail-on-unused-args $(OUTPUT_DIR) - cd $(COMPONENT_PATH); ninja $(subst 1,-v,$(filter 1,$(V))) -C $(OUTPUT_DIR) esp32 - - -chip_build : install-chip - echo "CHIP built and installed..." - cp -a ${OUTPUT_DIR}/lib/libCHIP.a ${OUTPUT_DIR}/libchip.a - -chip_clean: - echo "RM $(OUTPUT_DIR)" - rm -rf $(OUTPUT_DIR) diff --git a/config/esp32/components/esp32_mbedtls/component.mk b/config/esp32/components/esp32_mbedtls/component.mk deleted file mode 100644 index a6290b41f3a6c1..00000000000000 --- a/config/esp32/components/esp32_mbedtls/component.mk +++ /dev/null @@ -1 +0,0 @@ -COMPONENT_DEPENDS := chip From 132be6e370e7c59d27aecd8727f8eeb37d9b0f05 Mon Sep 17 00:00:00 2001 From: Timothy Maes Date: Tue, 30 Aug 2022 20:22:34 +0200 Subject: [PATCH 02/27] Re-enable bloat reporting for QPG builds (#22221) --- .github/workflows/examples-qpg.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml index d43855ab74c4a2..46d84ce5a538d9 100644 --- a/.github/workflows/examples-qpg.yaml +++ b/.github/workflows/examples-qpg.yaml @@ -81,6 +81,17 @@ jobs: run: | config/qpg/chip-gn/build.sh + - name: Prepare some bloat report from the previous builds + run: | + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + qpg qpg6105+debug lighting-app \ + out/qpg-light/chip-qpg6105-lighting-example.out \ + /tmp/bloat_reports/ + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + qpg qpg6105+debug lock-app \ + out/qpg-lock/chip-qpg6105-lock-example.out \ + /tmp/bloat_reports/ + - name: Uploading Size Reports uses: actions/upload-artifact@v2 if: ${{ !env.ACT }} From bb1ebbab66759e3d3d0b70852e7c0d601dfd471d Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 30 Aug 2022 14:25:15 -0400 Subject: [PATCH 03/27] Don't notify OnSessionEstablishmentError after OnSessionEstablished. (#22261) A PairingSession that has sent an OnSessionEstablished notification should not send an OnSessionEstablishmentError notification after that (e.g. if the session gets evicted). The session is established at that point, and the _establishment_ cannot hit an error. This is needed to allow PASE sessions to be sanely evicted (e.g. when we're done with them) without triggering spurious errors. --- src/protocols/secure_channel/CASESession.cpp | 4 ++-- src/protocols/secure_channel/PASESession.cpp | 6 +++--- .../secure_channel/PairingSession.cpp | 21 +++++++++++++++++-- src/protocols/secure_channel/PairingSession.h | 6 ++++++ .../SessionEstablishmentDelegate.h | 8 +++++-- .../secure_channel/tests/TestPASESession.cpp | 17 +++++++++++++++ 6 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/protocols/secure_channel/CASESession.cpp b/src/protocols/secure_channel/CASESession.cpp index 5f4c04752fe389..623265d160349a 100644 --- a/src/protocols/secure_channel/CASESession.cpp +++ b/src/protocols/secure_channel/CASESession.cpp @@ -131,7 +131,7 @@ void CASESession::OnSessionReleased() { Clear(); // Do this last in case the delegate frees us. - mDelegate->OnSessionEstablishmentError(CHIP_ERROR_CONNECTION_ABORTED); + NotifySessionEstablishmentError(CHIP_ERROR_CONNECTION_ABORTED); } void CASESession::Clear() @@ -294,7 +294,7 @@ void CASESession::AbortPendingEstablish(CHIP_ERROR err) { Clear(); // Do this last in case the delegate frees us. - mDelegate->OnSessionEstablishmentError(err); + NotifySessionEstablishmentError(err); } CHIP_ERROR CASESession::DeriveSecureSession(CryptoContext & session) const diff --git a/src/protocols/secure_channel/PASESession.cpp b/src/protocols/secure_channel/PASESession.cpp index 6c48957a14d275..05fc3b38915983 100644 --- a/src/protocols/secure_channel/PASESession.cpp +++ b/src/protocols/secure_channel/PASESession.cpp @@ -72,7 +72,7 @@ void PASESession::OnSessionReleased() { Clear(); // Do this last in case the delegate frees us. - mDelegate->OnSessionEstablishmentError(CHIP_ERROR_CONNECTION_ABORTED); + NotifySessionEstablishmentError(CHIP_ERROR_CONNECTION_ABORTED); } void PASESession::Finish() @@ -242,7 +242,7 @@ void PASESession::OnResponseTimeout(ExchangeContext * ec) DiscardExchange(); Clear(); // Do this last in case the delegate frees us. - mDelegate->OnSessionEstablishmentError(CHIP_ERROR_TIMEOUT); + NotifySessionEstablishmentError(CHIP_ERROR_TIMEOUT); } CHIP_ERROR PASESession::DeriveSecureSession(CryptoContext & session) const @@ -859,7 +859,7 @@ CHIP_ERROR PASESession::OnMessageReceived(ExchangeContext * exchange, const Payl Clear(); ChipLogError(SecureChannel, "Failed during PASE session setup: %" CHIP_ERROR_FORMAT, err.Format()); // Do this last in case the delegate frees us. - mDelegate->OnSessionEstablishmentError(err); + NotifySessionEstablishmentError(err); } return err; } diff --git a/src/protocols/secure_channel/PairingSession.cpp b/src/protocols/secure_channel/PairingSession.cpp index 8c1dee5968ed4a..67d7229b462709 100644 --- a/src/protocols/secure_channel/PairingSession.cpp +++ b/src/protocols/secure_channel/PairingSession.cpp @@ -63,11 +63,15 @@ void PairingSession::Finish() if (err == CHIP_NO_ERROR) { VerifyOrDie(mSecureSessionHolder); - mDelegate->OnSessionEstablished(mSecureSessionHolder.Get().Value()); + // Make sure to null out mDelegate so we don't send it any other + // notifications. + auto * delegate = mDelegate; + mDelegate = nullptr; + delegate->OnSessionEstablished(mSecureSessionHolder.Get().Value()); } else { - mDelegate->OnSessionEstablishmentError(err); + NotifySessionEstablishmentError(err); } } @@ -165,4 +169,17 @@ void PairingSession::Clear() mSessionManager = nullptr; } +void PairingSession::NotifySessionEstablishmentError(CHIP_ERROR error) +{ + if (mDelegate == nullptr) + { + // Already notified success or error. + return; + } + + auto * delegate = mDelegate; + mDelegate = nullptr; + delegate->OnSessionEstablishmentError(error); +} + } // namespace chip diff --git a/src/protocols/secure_channel/PairingSession.h b/src/protocols/secure_channel/PairingSession.h index f8a707aa3af2d1..e220346e11b4a6 100644 --- a/src/protocols/secure_channel/PairingSession.h +++ b/src/protocols/secure_channel/PairingSession.h @@ -192,6 +192,12 @@ class DLL_EXPORT PairingSession : public SessionDelegate // TODO: remove Clear, we should create a new instance instead reset the old instance. void Clear(); + /** + * Notify our delegate about a session establishment error, if we have not + * notified it of an error or success before. + */ + void NotifySessionEstablishmentError(CHIP_ERROR error); + protected: CryptoContext::SessionRole mRole; SessionHolderWithDelegate mSecureSessionHolder; diff --git a/src/protocols/secure_channel/SessionEstablishmentDelegate.h b/src/protocols/secure_channel/SessionEstablishmentDelegate.h index f14566dae5a092..30cc8cac59f76b 100644 --- a/src/protocols/secure_channel/SessionEstablishmentDelegate.h +++ b/src/protocols/secure_channel/SessionEstablishmentDelegate.h @@ -36,7 +36,9 @@ class DLL_EXPORT SessionEstablishmentDelegate { public: /** - * Called when session establishment fails with an error + * Called when session establishment fails with an error. This will be + * called at most once per session establishment and will not be called if + * OnSessionEstablished is called. */ virtual void OnSessionEstablishmentError(CHIP_ERROR error) {} @@ -46,7 +48,9 @@ class DLL_EXPORT SessionEstablishmentDelegate virtual void OnSessionEstablishmentStarted() {} /** - * Called when the new secure session has been established + * Called when the new secure session has been established. This is + * mututally exclusive with OnSessionEstablishmentError for a give session + * establishment. */ virtual void OnSessionEstablished(const SessionHandle & session) {} diff --git a/src/protocols/secure_channel/tests/TestPASESession.cpp b/src/protocols/secure_channel/tests/TestPASESession.cpp index 61830fa174b530..ab97624e39e473 100644 --- a/src/protocols/secure_channel/tests/TestPASESession.cpp +++ b/src/protocols/secure_channel/tests/TestPASESession.cpp @@ -290,7 +290,9 @@ void SecurePairingHandshakeTestCommon(nlTestSuite * inSuite, void * inContext, S // Let's make sure atleast number is >= than the minimum messages required to complete the // handshake. NL_TEST_ASSERT(inSuite, loopback.mSentMessageCount >= sTestPaseMessageCount); + NL_TEST_ASSERT(inSuite, delegateAccessory.mNumPairingErrors == 0); NL_TEST_ASSERT(inSuite, delegateAccessory.mNumPairingComplete == 1); + NL_TEST_ASSERT(inSuite, delegateCommissioner.mNumPairingErrors == 0); NL_TEST_ASSERT(inSuite, delegateCommissioner.mNumPairingComplete == 1); if (mrpCommissionerConfig.HasValue()) @@ -313,6 +315,21 @@ void SecurePairingHandshakeTestCommon(nlTestSuite * inSuite, void * inContext, S mrpAccessoryConfig.Value().mActiveRetransTimeout); } + // Now evict the PASE sessions. + auto session = pairingCommissioner.CopySecureSession(); + NL_TEST_ASSERT(inSuite, session.HasValue()); + session.Value()->AsSecureSession()->MarkForEviction(); + + session = pairingAccessory.CopySecureSession(); + NL_TEST_ASSERT(inSuite, session.HasValue()); + session.Value()->AsSecureSession()->MarkForEviction(); + + // And check that this did not result in any new notifications. + NL_TEST_ASSERT(inSuite, delegateAccessory.mNumPairingErrors == 0); + NL_TEST_ASSERT(inSuite, delegateAccessory.mNumPairingComplete == 1); + NL_TEST_ASSERT(inSuite, delegateCommissioner.mNumPairingErrors == 0); + NL_TEST_ASSERT(inSuite, delegateCommissioner.mNumPairingComplete == 1); + loopback.SetLoopbackTransportDelegate(nullptr); } From 8a0aad177fc127b6fc4d02b3954b1312d902e8a5 Mon Sep 17 00:00:00 2001 From: adabreuti <76965454+adabreuti@users.noreply.github.com> Date: Tue, 30 Aug 2022 13:37:49 -0500 Subject: [PATCH 04/27] Add DevinfoInit to Relevant CC13xx apps (#22184) * Add DevinfoInit to CC13xx all clusters * Add Devinfo init to lock-app * Update style --- examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn | 2 ++ examples/all-clusters-app/cc13x2x7_26x2x7/main/AppTask.cpp | 7 +++++++ examples/all-clusters-minimal-app/cc13x2x7_26x2x7/BUILD.gn | 2 ++ .../cc13x2x7_26x2x7/main/AppTask.cpp | 7 +++++++ examples/lock-app/cc13x2x7_26x2x7/BUILD.gn | 2 ++ examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp | 7 +++++++ 6 files changed, 27 insertions(+) diff --git a/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn b/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn index 48f3ef5b7583f9..3194d47bb0f188 100644 --- a/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/all-clusters-app/cc13x2x7_26x2x7/BUILD.gn @@ -78,6 +78,7 @@ ti_simplelink_executable("all-clusters-app") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp", "${chip_root}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp", "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp", + "${chip_root}/examples/providers/DeviceInfoProviderImpl.cpp", "${project_dir}/main/AppTask.cpp", "${project_dir}/main/ClusterManager.cpp", "${project_dir}/main/Globals.cpp", @@ -102,6 +103,7 @@ ti_simplelink_executable("all-clusters-app") { "${project_dir}", "${project_dir}/main", "${chip_root}/examples/all-clusters-app/all-clusters-common/include", + "${chip_root}/examples/providers/", ] cflags = [ diff --git a/examples/all-clusters-app/cc13x2x7_26x2x7/main/AppTask.cpp b/examples/all-clusters-app/cc13x2x7_26x2x7/main/AppTask.cpp index b00e11a766a6da..09762791f4cf1a 100644 --- a/examples/all-clusters-app/cc13x2x7_26x2x7/main/AppTask.cpp +++ b/examples/all-clusters-app/cc13x2x7_26x2x7/main/AppTask.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR @@ -64,6 +65,7 @@ static QueueHandle_t sAppEventQueue; static Button_Handle sAppLeftHandle; static Button_Handle sAppRightHandle; +static DeviceInfoProviderImpl sExampleDeviceInfoProvider; AppTask AppTask::sAppTask; @@ -243,6 +245,11 @@ int AppTask::Init() PLAT_LOG("Initialize Server"); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); + + // Initialize info provider + sExampleDeviceInfoProvider.SetStorageDelegate(initParams.persistentStorageDelegate); + SetDeviceInfoProvider(&sExampleDeviceInfoProvider); + chip::Server::GetInstance().Init(initParams); ConfigurationMgr().LogDeviceConfig(); diff --git a/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/BUILD.gn b/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/BUILD.gn index 9c870ec32fa84e..6c20ed346ec530 100644 --- a/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/BUILD.gn @@ -78,6 +78,7 @@ ti_simplelink_executable("all-clusters-minimal-app") { "${chip_root}/examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp", "${chip_root}/examples/all-clusters-app/all-clusters-common/src/bridged-actions-stub.cpp", "${chip_root}/examples/all-clusters-app/all-clusters-common/src/static-supported-modes-manager.cpp", + "${chip_root}/examples/providers/DeviceInfoProviderImpl.cpp", "${project_dir}/main/AppTask.cpp", "${project_dir}/main/ClusterManager.cpp", "${project_dir}/main/Globals.cpp", @@ -102,6 +103,7 @@ ti_simplelink_executable("all-clusters-minimal-app") { "${project_dir}", "${project_dir}/main", "${chip_root}/examples/all-clusters-app/all-clusters-common/include", + "${chip_root}/examples/providers/", ] cflags = [ diff --git a/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/main/AppTask.cpp b/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/main/AppTask.cpp index b00e11a766a6da..09762791f4cf1a 100644 --- a/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/main/AppTask.cpp +++ b/examples/all-clusters-minimal-app/cc13x2x7_26x2x7/main/AppTask.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR @@ -64,6 +65,7 @@ static QueueHandle_t sAppEventQueue; static Button_Handle sAppLeftHandle; static Button_Handle sAppRightHandle; +static DeviceInfoProviderImpl sExampleDeviceInfoProvider; AppTask AppTask::sAppTask; @@ -243,6 +245,11 @@ int AppTask::Init() PLAT_LOG("Initialize Server"); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); + + // Initialize info provider + sExampleDeviceInfoProvider.SetStorageDelegate(initParams.persistentStorageDelegate); + SetDeviceInfoProvider(&sExampleDeviceInfoProvider); + chip::Server::GetInstance().Init(initParams); ConfigurationMgr().LogDeviceConfig(); diff --git a/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn b/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn index 57792e12f69e0c..ba2b327339e516 100644 --- a/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn +++ b/examples/lock-app/cc13x2x7_26x2x7/BUILD.gn @@ -74,6 +74,7 @@ ti_simplelink_executable("lock_app") { output_name = "chip-${ti_simplelink_board}-lock-example.out" sources = [ + "${chip_root}/examples/providers/DeviceInfoProviderImpl.cpp", "${project_dir}/main/AppTask.cpp", "${project_dir}/main/BoltLockManager.cpp", "${project_dir}/main/ZclCallbacks.cpp", @@ -96,6 +97,7 @@ ti_simplelink_executable("lock_app") { include_dirs = [ "${project_dir}", "${project_dir}/main", + "${chip_root}/examples/providers/", ] cflags = [ diff --git a/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp b/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp index a0d30130644e43..4854eb4c5af0d8 100644 --- a/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp +++ b/examples/lock-app/cc13x2x7_26x2x7/main/AppTask.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR @@ -63,6 +64,7 @@ static LED_Handle sAppRedHandle; static LED_Handle sAppGreenHandle; static Button_Handle sAppLeftHandle; static Button_Handle sAppRightHandle; +static DeviceInfoProviderImpl sExampleDeviceInfoProvider; AppTask AppTask::sAppTask; @@ -166,6 +168,11 @@ int AppTask::Init() PLAT_LOG("Initialize Server"); static chip::CommonCaseDeviceServerInitParams initParams; (void) initParams.InitializeStaticResourcesBeforeServerInit(); + + // Initialize info provider + sExampleDeviceInfoProvider.SetStorageDelegate(initParams.persistentStorageDelegate); + SetDeviceInfoProvider(&sExampleDeviceInfoProvider); + chip::Server::GetInstance().Init(initParams); // Initialize device attestation config From 70143fe152a5dc97d6544315daa018cfe5fc6e77 Mon Sep 17 00:00:00 2001 From: chrisdecenzo <61757564+chrisdecenzo@users.noreply.github.com> Date: Tue, 30 Aug 2022 11:38:45 -0700 Subject: [PATCH 05/27] Fixes related to PASE-only commissioning on Android (#22140) * Draft: fixes related to PASE-only commissioning on Android * fix build * avoid null pointer in cleanup --- src/controller/AutoCommissioner.cpp | 18 +++++++++++++ src/controller/CHIPDeviceController.cpp | 1 - src/controller/CommissioningDelegate.cpp | 4 +++ src/controller/CommissioningDelegate.h | 10 ++++++++ .../java/AndroidDeviceControllerWrapper.cpp | 3 ++- .../java/AndroidDeviceControllerWrapper.h | 3 ++- .../java/CHIPDeviceController-JNI.cpp | 15 ++++++++--- .../devicecontroller/ControllerParams.java | 25 +++++++++++++++++++ 8 files changed, 72 insertions(+), 7 deletions(-) diff --git a/src/controller/AutoCommissioner.cpp b/src/controller/AutoCommissioner.cpp index e9cc301f45b904..b7d7f0c70755f4 100644 --- a/src/controller/AutoCommissioner.cpp +++ b/src/controller/AutoCommissioner.cpp @@ -139,6 +139,12 @@ CHIP_ERROR AutoCommissioner::SetCommissioningParameters(const CommissioningParam } mParams.SetCSRNonce(ByteSpan(mCSRNonce, sizeof(mCSRNonce))); + if (params.GetSkipCommissioningComplete().HasValue()) + { + ChipLogProgress(Controller, "Setting PASE-only commissioning from parameters"); + mParams.SetSkipCommissioningComplete(params.GetSkipCommissioningComplete().Value()); + } + return CHIP_NO_ERROR; } @@ -252,6 +258,10 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio } else { + if (mParams.GetSkipCommissioningComplete().ValueOr(false)) + { + return CommissioningStage::kCleanup; + } return CommissioningStage::kFindOperational; } case CommissioningStage::kWiFiNetworkSetup: @@ -280,11 +290,19 @@ CommissioningStage AutoCommissioner::GetNextCommissioningStageInternal(Commissio { return CommissioningStage::kThreadNetworkEnable; } + else if (mParams.GetSkipCommissioningComplete().ValueOr(false)) + { + return CommissioningStage::kCleanup; + } else { return CommissioningStage::kFindOperational; } case CommissioningStage::kThreadNetworkEnable: + if (mParams.GetSkipCommissioningComplete().ValueOr(false)) + { + return CommissioningStage::kCleanup; + } return CommissioningStage::kFindOperational; case CommissioningStage::kFindOperational: return CommissioningStage::kSendComplete; diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index 88bef7820efd71..0452835651aec8 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -1572,7 +1572,6 @@ void DeviceCommissioner::CommissioningStageComplete(CHIP_ERROR err, Commissionin { // Once this stage is complete, reset mDeviceBeingCommissioned - this will be reset when the delegate calls the next step. MATTER_TRACE_EVENT_SCOPE("CommissioningStageComplete", "DeviceCommissioner"); - if (mDeviceBeingCommissioned == nullptr) { // We are getting a stray callback (e.g. due to un-cancellable diff --git a/src/controller/CommissioningDelegate.cpp b/src/controller/CommissioningDelegate.cpp index 01d9c6ecd90f88..b6b83980130e98 100644 --- a/src/controller/CommissioningDelegate.cpp +++ b/src/controller/CommissioningDelegate.cpp @@ -113,6 +113,10 @@ const char * StageToString(CommissioningStage stage) return "Cleanup"; break; + case kNeedsNetworkCreds: + return "NeedsNetworkCreds"; + break; + default: return "???"; break; diff --git a/src/controller/CommissioningDelegate.h b/src/controller/CommissioningDelegate.h index cf1743c2d21bae..1e3fdef1276e44 100644 --- a/src/controller/CommissioningDelegate.h +++ b/src/controller/CommissioningDelegate.h @@ -378,6 +378,15 @@ class CommissioningParameters return *this; } + // Only perform the PASE steps of commissioning. + // Commissioning will be completed by another admin on the network. + Optional GetSkipCommissioningComplete() const { return mSkipCommissioningComplete; } + CommissioningParameters & SetSkipCommissioningComplete(bool skipCommissioningComplete) + { + mSkipCommissioningComplete = MakeOptional(skipCommissioningComplete); + return *this; + } + private: // Items that can be set by the commissioner Optional mFailsafeTimerSeconds; @@ -407,6 +416,7 @@ class CommissioningParameters nullptr; // Delegate to handle device attestation failures during commissioning Optional mAttemptWiFiNetworkScan; Optional mAttemptThreadNetworkScan; // This automatically gets set to false when a ThreadOperationalDataset is set + Optional mSkipCommissioningComplete; }; struct RequestedCertificate diff --git a/src/controller/java/AndroidDeviceControllerWrapper.cpp b/src/controller/java/AndroidDeviceControllerWrapper.cpp index b4a8c6714ec9eb..2be556d5a2bfd9 100644 --- a/src/controller/java/AndroidDeviceControllerWrapper.cpp +++ b/src/controller/java/AndroidDeviceControllerWrapper.cpp @@ -75,7 +75,7 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( chip::Inet::EndPointManager * udpEndPointManager, AndroidOperationalCredentialsIssuerPtr opCredsIssuerPtr, jobject keypairDelegate, jbyteArray rootCertificate, jbyteArray intermediateCertificate, jbyteArray nodeOperationalCertificate, jbyteArray ipkEpochKey, uint16_t listenPort, uint16_t controllerVendorId, uint16_t failsafeTimerSeconds, - bool attemptNetworkScanWiFi, bool attemptNetworkScanThread, CHIP_ERROR * errInfoOnFailure) + bool attemptNetworkScanWiFi, bool attemptNetworkScanThread, bool skipCommissioningComplete, CHIP_ERROR * errInfoOnFailure) { if (errInfoOnFailure == nullptr) { @@ -156,6 +156,7 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( params.SetFailsafeTimerSeconds(failsafeTimerSeconds); params.SetAttemptWiFiNetworkScan(attemptNetworkScanWiFi); params.SetAttemptThreadNetworkScan(attemptNetworkScanThread); + params.SetSkipCommissioningComplete(skipCommissioningComplete); wrapper->UpdateCommissioningParameters(params); CHIP_ERROR err = wrapper->mGroupDataProvider.Init(); diff --git a/src/controller/java/AndroidDeviceControllerWrapper.h b/src/controller/java/AndroidDeviceControllerWrapper.h index 799cd374e32439..8c0697b024170a 100644 --- a/src/controller/java/AndroidDeviceControllerWrapper.h +++ b/src/controller/java/AndroidDeviceControllerWrapper.h @@ -138,6 +138,7 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel * @param[in] failsafeTimerSeconds the failsafe timer in seconds * @param[in] attemptNetworkScanWiFi whether to attempt a network scan when configuring the network for a WiFi device * @param[in] attemptNetworkScanThread whether to attempt a network scan when configuring the network for a Thread device + * @param[in] skipCommissioningComplete whether to skip the CASE commissioningComplete command during commissioning * @param[out] errInfoOnFailure a pointer to a CHIP_ERROR that will be populated if this method returns nullptr */ static AndroidDeviceControllerWrapper * @@ -148,7 +149,7 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel AndroidOperationalCredentialsIssuerPtr opCredsIssuer, jobject keypairDelegate, jbyteArray rootCertificate, jbyteArray intermediateCertificate, jbyteArray nodeOperationalCertificate, jbyteArray ipkEpochKey, uint16_t listenPort, uint16_t controllerVendorId, uint16_t failsafeTimerSeconds, bool attemptNetworkScanWiFi, - bool attemptNetworkScanThread, CHIP_ERROR * errInfoOnFailure); + bool attemptNetworkScanThread, bool skipCommissioningComplete, CHIP_ERROR * errInfoOnFailure); chip::Controller::AndroidOperationalCredentialsIssuer * GetAndroidOperationalCredentialsIssuer() { diff --git a/src/controller/java/CHIPDeviceController-JNI.cpp b/src/controller/java/CHIPDeviceController-JNI.cpp index 9a46972dd54d79..5f2b6fb0b19caf 100644 --- a/src/controller/java/CHIPDeviceController-JNI.cpp +++ b/src/controller/java/CHIPDeviceController-JNI.cpp @@ -285,6 +285,11 @@ JNI_METHOD(jlong, newDeviceController)(JNIEnv * env, jobject self, jobject contr &getAttemptNetworkScanThread); SuccessOrExit(err); + jmethodID getSkipCommissioningComplete; + err = chip::JniReferences::GetInstance().FindMethod(env, controllerParams, "getSkipCommissioningComplete", "()Z", + &getSkipCommissioningComplete); + SuccessOrExit(err); + jmethodID getKeypairDelegate; err = chip::JniReferences::GetInstance().FindMethod(env, controllerParams, "getKeypairDelegate", "()Lchip/devicecontroller/KeypairDelegate;", &getKeypairDelegate); @@ -324,6 +329,7 @@ JNI_METHOD(jlong, newDeviceController)(JNIEnv * env, jobject self, jobject contr uint16_t failsafeTimerSeconds = env->CallIntMethod(controllerParams, getFailsafeTimerSeconds); bool attemptNetworkScanWiFi = env->CallBooleanMethod(controllerParams, getAttemptNetworkScanWiFi); bool attemptNetworkScanThread = env->CallBooleanMethod(controllerParams, getAttemptNetworkScanThread); + bool skipCommissioningComplete = env->CallBooleanMethod(controllerParams, getSkipCommissioningComplete); uint64_t adminSubject = env->CallLongMethod(controllerParams, getAdminSubject); std::unique_ptr opCredsIssuer( @@ -332,7 +338,7 @@ JNI_METHOD(jlong, newDeviceController)(JNIEnv * env, jobject self, jobject contr sJVM, self, kLocalDeviceId, fabricId, chip::kUndefinedCATs, &DeviceLayer::SystemLayer(), DeviceLayer::TCPEndPointManager(), DeviceLayer::UDPEndPointManager(), std::move(opCredsIssuer), keypairDelegate, rootCertificate, intermediateCertificate, operationalCertificate, ipk, listenPort, controllerVendorId, - failsafeTimerSeconds, attemptNetworkScanWiFi, attemptNetworkScanThread, &err); + failsafeTimerSeconds, attemptNetworkScanWiFi, attemptNetworkScanThread, skipCommissioningComplete, &err); SuccessOrExit(err); if (adminSubject != kUndefinedNodeId) @@ -384,7 +390,7 @@ JNI_METHOD(void, commissionDevice) ChipLogProgress(Controller, "commissionDevice() called"); - CommissioningParameters commissioningParams = CommissioningParameters(); + CommissioningParameters commissioningParams = wrapper->GetCommissioningParameters(); if (networkCredentials != nullptr) { err = wrapper->ApplyNetworkCredentials(commissioningParams, networkCredentials); @@ -422,7 +428,7 @@ JNI_METHOD(void, pairDevice) #endif .SetPeerAddress(Transport::PeerAddress::BLE()); - CommissioningParameters commissioningParams = CommissioningParameters(); + CommissioningParameters commissioningParams = wrapper->GetCommissioningParameters(); wrapper->ApplyNetworkCredentials(commissioningParams, networkCredentials); if (csrNonce != nullptr) @@ -456,7 +462,8 @@ JNI_METHOD(void, pairDeviceWithAddress) .SetDiscriminator(discriminator) .SetSetupPINCode(pinCode) .SetPeerAddress(Transport::PeerAddress::UDP(const_cast(addrJniString.c_str()), port)); - CommissioningParameters commissioningParams = CommissioningParameters(); + + CommissioningParameters commissioningParams = wrapper->GetCommissioningParameters(); if (csrNonce != nullptr) { JniByteArray jniCsrNonce(env, csrNonce); diff --git a/src/controller/java/src/chip/devicecontroller/ControllerParams.java b/src/controller/java/src/chip/devicecontroller/ControllerParams.java index 612079bfa29361..e2e429a6ad083d 100644 --- a/src/controller/java/src/chip/devicecontroller/ControllerParams.java +++ b/src/controller/java/src/chip/devicecontroller/ControllerParams.java @@ -11,6 +11,7 @@ public final class ControllerParams { private final int failsafeTimerSeconds; private final boolean attemptNetworkScanWiFi; private final boolean attemptNetworkScanThread; + private final boolean skipCommissioningComplete; @Nullable private final KeypairDelegate keypairDelegate; @Nullable private final byte[] rootCertificate; @Nullable private final byte[] intermediateCertificate; @@ -28,6 +29,7 @@ private ControllerParams(Builder builder) { this.failsafeTimerSeconds = builder.failsafeTimerSeconds; this.attemptNetworkScanWiFi = builder.attemptNetworkScanWiFi; this.attemptNetworkScanThread = builder.attemptNetworkScanThread; + this.skipCommissioningComplete = builder.skipCommissioningComplete; this.keypairDelegate = builder.keypairDelegate; this.rootCertificate = builder.rootCertificate; this.intermediateCertificate = builder.intermediateCertificate; @@ -61,6 +63,10 @@ public boolean getAttemptNetworkScanThread() { return attemptNetworkScanThread; } + public boolean getSkipCommissioningComplete() { + return skipCommissioningComplete; + } + public KeypairDelegate getKeypairDelegate() { return keypairDelegate; } @@ -112,6 +118,7 @@ public static class Builder { private int failsafeTimerSeconds = 30; private boolean attemptNetworkScanWiFi = false; private boolean attemptNetworkScanThread = false; + private boolean skipCommissioningComplete = false; @Nullable private KeypairDelegate keypairDelegate = null; @Nullable private byte[] rootCertificate = null; @Nullable private byte[] intermediateCertificate = null; @@ -197,6 +204,24 @@ public Builder setAttemptNetworkScanThread(boolean attemptNetworkScanThread) { return this; } + /** + * Disable the CASE phase of commissioning when the CommissioningComplete command is sent by + * this ChipDeviceCommissioner. + * + *

Specifically, this sets SkipCommissioningComplete in the CommissioningParameters passed to + * the CommissioningDelegate. + * + *

A controller will set this to true when the CASE phase of commissioning is done by a + * separate process, for example, by a Hub on the network. + * + * @param skipCommissioningComplete + * @return + */ + public Builder setSkipCommissioningComplete(boolean skipCommissioningComplete) { + this.skipCommissioningComplete = skipCommissioningComplete; + return this; + } + public Builder setKeypairDelegate(KeypairDelegate keypairDelegate) { this.keypairDelegate = keypairDelegate; return this; From b444d25462331714bf633a0f3715124786d0bf74 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 30 Aug 2022 15:30:59 -0400 Subject: [PATCH 06/27] Ignore DeviceCommissioner::OnDeviceConnectionFailureFn for unexpected devices. (#22247) Just like we ignore DeviceCommissioner::OnDeviceConnectedFn if the device id does not match mDeviceBeingCommissioned, we should ignore OnDeviceConnectionFailureFn. Fixes https://github.com/project-chip/connectedhomeip/issues/22244 --- src/controller/CHIPDeviceController.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index 0452835651aec8..0bf9ee911359d9 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -1653,6 +1653,13 @@ void DeviceCommissioner::OnDeviceConnectionFailureFn(void * context, const Scope error = CHIP_ERROR_INTERNAL; } + if (commissioner->mDeviceBeingCommissioned == nullptr || + commissioner->mDeviceBeingCommissioned->GetDeviceId() != peerId.GetNodeId()) + { + // Not the device we are trying to commission. + return; + } + if (commissioner->mCommissioningStage == CommissioningStage::kFindOperational && commissioner->mCommissioningDelegate != nullptr) { From d47c8f7a3ac84f2cc04e5411f064baeb9fe8c93f Mon Sep 17 00:00:00 2001 From: Yufeng Wang Date: Tue, 30 Aug 2022 12:49:23 -0700 Subject: [PATCH 07/27] Add initial Messaging Layer unit test to test various negative paths (#22202) --- src/messaging/tests/BUILD.gn | 4 + src/messaging/tests/MessagingContext.h | 42 +++++ src/messaging/tests/TestMessagingLayer.cpp | 180 +++++++++++++++++++++ src/transport/raw/UDP.cpp | 6 + src/transport/tests/UDPTransportManager.h | 62 +++++++ 5 files changed, 294 insertions(+) create mode 100644 src/messaging/tests/TestMessagingLayer.cpp create mode 100644 src/transport/tests/UDPTransportManager.h diff --git a/src/messaging/tests/BUILD.gn b/src/messaging/tests/BUILD.gn index 4f2fa28bc25825..15c7dbdc02eb74 100644 --- a/src/messaging/tests/BUILD.gn +++ b/src/messaging/tests/BUILD.gn @@ -58,6 +58,10 @@ chip_test_suite("tests") { chip_device_platform != "nrfconnect") { test_sources += [ "TestExchangeHolder.cpp" ] } + + if (chip_device_platform == "linux") { + test_sources += [ "TestMessagingLayer.cpp" ] + } } cflags = [ "-Wconversion" ] diff --git a/src/messaging/tests/MessagingContext.h b/src/messaging/tests/MessagingContext.h index 5c885300fddac2..8d33c50b6176b9 100644 --- a/src/messaging/tests/MessagingContext.h +++ b/src/messaging/tests/MessagingContext.h @@ -27,6 +27,7 @@ #include #include #include +#include #include @@ -231,6 +232,47 @@ class LoopbackMessagingContext : public LoopbackTransportManager, public Messagi using LoopbackTransportManager::GetSystemLayer; }; +// UDPMessagingContext enriches MessagingContext with an UDP transport +class UDPMessagingContext : public UDPTransportManager, public MessagingContext +{ +public: + virtual ~UDPMessagingContext() {} + + /// Initialize the underlying layers. + virtual CHIP_ERROR Init() + { + ReturnErrorOnFailure(chip::Platform::MemoryInit()); + ReturnErrorOnFailure(UDPTransportManager::Init()); + ReturnErrorOnFailure(MessagingContext::Init(&GetTransportMgr(), &GetIOContext())); + return CHIP_NO_ERROR; + } + + // Shutdown all layers, finalize operations + virtual void Shutdown() + { + MessagingContext::Shutdown(); + UDPTransportManager::Shutdown(); + chip::Platform::MemoryShutdown(); + } + + // Init/Shutdown Helpers that can be used directly as the nlTestSuite + // initialize/finalize function. + static int Initialize(void * context) + { + auto * ctx = static_cast(context); + return ctx->Init() == CHIP_NO_ERROR ? SUCCESS : FAILURE; + } + + static int Finalize(void * context) + { + auto * ctx = static_cast(context); + ctx->Shutdown(); + return SUCCESS; + } + + using UDPTransportManager::GetSystemLayer; +}; + // Class that can be used to capture decrypted message traffic in tests using // MessagingContext. class MessageCapturer : public SessionMessageDelegate diff --git a/src/messaging/tests/TestMessagingLayer.cpp b/src/messaging/tests/TestMessagingLayer.cpp new file mode 100644 index 00000000000000..7e0285d6f27170 --- /dev/null +++ b/src/messaging/tests/TestMessagingLayer.cpp @@ -0,0 +1,180 @@ +/* + * + * Copyright (c) 2022 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file + * This file implements unit tests for the ExchangeManager implementation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +namespace { + +using namespace chip; +using namespace chip::Inet; +using namespace chip::Transport; +using namespace chip::Messaging; +using namespace chip::Protocols; +using namespace chip::System::Clock::Literals; + +using TestContext = Test::UDPMessagingContext; + +// The message timeout value in milliseconds. +constexpr System::Clock::Timeout kMessageTimeout = System::Clock::Milliseconds32(100); + +class MockAppDelegate : public UnsolicitedMessageHandler, public ExchangeDelegate +{ +public: + CHIP_ERROR OnUnsolicitedMessageReceived(const PayloadHeader & payloadHeader, ExchangeDelegate *& newDelegate) override + { + newDelegate = this; + return CHIP_NO_ERROR; + } + + CHIP_ERROR OnMessageReceived(ExchangeContext * ec, const PayloadHeader & payloadHeader, + System::PacketBufferHandle && buffer) override + { + IsOnMessageReceivedCalled = true; + return CHIP_NO_ERROR; + } + + void OnResponseTimeout(ExchangeContext * ec) override { IsOnResponseTimeoutCalled = true; } + + bool IsOnMessageReceivedCalled = false; + bool IsOnResponseTimeoutCalled = false; +}; + +/** + * Tests sending exchange message with Success: + * + * DUT = sender, PEER = remote device + * + * 1) DUT sends message w/o MRP to PEER + * - Confirm the message is sent successfully + * - Observe DUT response timeout with no response + */ +void CheckExchangeOutgoingMessagesSuccess(nlTestSuite * inSuite, void * inContext) +{ + TestContext & ctx = *reinterpret_cast(inContext); + + // create solicited exchange + MockAppDelegate mockSolicitedAppDelegate; + ExchangeContext * ec = ctx.NewExchangeToAlice(&mockSolicitedAppDelegate); + + NL_TEST_ASSERT(inSuite, ec != nullptr); + ec->SetResponseTimeout(kMessageTimeout); + + CHIP_ERROR err = ec->SendMessage(Echo::MsgType::EchoRequest, System::PacketBufferHandle::New(System::PacketBuffer::kMaxSize), + SendFlags(SendMessageFlags::kExpectResponse).Set(SendMessageFlags::kNoAutoRequestAck)); + + // Wait for the initial message to fail (should take 330-413ms) + ctx.GetIOContext().DriveIOUntil(500_ms32, [&] { return mockSolicitedAppDelegate.IsOnMessageReceivedCalled; }); + + NL_TEST_ASSERT(inSuite, err == CHIP_NO_ERROR); + NL_TEST_ASSERT(inSuite, mockSolicitedAppDelegate.IsOnResponseTimeoutCalled); +} + +/** + * Tests sending exchange message with Failure: + * + * DUT = sender, PEER = remote device + * + * 1) DUT configured to drop the outgoing UDP packet + * 2) DUT sends message w/o MRP to PEER + * - Confirm the message is sent with failure + * - Confirm the DUT response timeout timer is cancelled + */ +void CheckExchangeOutgoingMessagesFail(nlTestSuite * inSuite, void * inContext) +{ + TestContext & ctx = *reinterpret_cast(inContext); + + // create solicited exchange + MockAppDelegate mockSolicitedAppDelegate; + ExchangeContext * ec = ctx.NewExchangeToAlice(&mockSolicitedAppDelegate); + + NL_TEST_ASSERT(inSuite, ec != nullptr); + ec->SetResponseTimeout(kMessageTimeout); + + chip::FaultInjection::GetManager().FailAtFault(chip::FaultInjection::kFault_DropOutgoingUDPMsg, 0, 1); + + CHIP_ERROR err = ec->SendMessage(Echo::MsgType::EchoRequest, System::PacketBufferHandle::New(System::PacketBuffer::kMaxSize), + SendFlags(SendMessageFlags::kExpectResponse).Set(SendMessageFlags::kNoAutoRequestAck)); + + // Wait for the initial message to fail (should take 330-413ms) + ctx.GetIOContext().DriveIOUntil(500_ms32, [&] { return mockSolicitedAppDelegate.IsOnMessageReceivedCalled; }); + + NL_TEST_ASSERT(inSuite, err != CHIP_NO_ERROR); + NL_TEST_ASSERT(inSuite, !mockSolicitedAppDelegate.IsOnResponseTimeoutCalled); + ec->Close(); +} + +// Test Suite + +/** + * Test Suite that lists all the test functions. + */ +// clang-format off +const nlTest sTests[] = +{ + NL_TEST_DEF("Test MessagingLayer::ExchangeOutgoingMessagesSuccess", CheckExchangeOutgoingMessagesSuccess), + NL_TEST_DEF("Test MessagingLayer::ExchangeOutgoingMessagesFail", CheckExchangeOutgoingMessagesFail), + + NL_TEST_SENTINEL() +}; +// clang-format on + +// clang-format off +nlTestSuite sSuite = +{ + "Test-CHIP-MessagingLayer", + &sTests[0], + TestContext::Initialize, + TestContext::Finalize +}; +// clang-format on + +} // namespace + +/** + * Main + */ +int TestMessagingLayer() +{ + return chip::ExecuteTestsWithContext(&sSuite); +} + +CHIP_REGISTER_TEST_SUITE(TestMessagingLayer); diff --git a/src/transport/raw/UDP.cpp b/src/transport/raw/UDP.cpp index 57b1d3c615bffc..3113e9797bfc72 100644 --- a/src/transport/raw/UDP.cpp +++ b/src/transport/raw/UDP.cpp @@ -23,6 +23,7 @@ */ #include +#include #include #include #include @@ -110,6 +111,9 @@ CHIP_ERROR UDP::SendMessage(const Transport::PeerAddress & address, System::Pack addrInfo.DestPort = address.GetPort(); addrInfo.Interface = address.GetInterface(); + // Drop the message and return. Free the buffer. + CHIP_FAULT_INJECT(FaultInjection::kFault_DropOutgoingUDPMsg, msgBuf = nullptr; return CHIP_ERROR_CONNECTION_ABORTED;); + return mUDPEndPoint->SendMsg(&addrInfo, std::move(msgBuf)); } @@ -119,6 +123,8 @@ void UDP::OnUdpReceive(Inet::UDPEndPoint * endPoint, System::PacketBufferHandle UDP * udp = reinterpret_cast(endPoint->mAppState); PeerAddress peerAddress = PeerAddress::UDP(pktInfo->SrcAddress, pktInfo->SrcPort, pktInfo->Interface); + CHIP_FAULT_INJECT(FaultInjection::kFault_DropIncomingUDPMsg, buffer = nullptr; return;); + udp->HandleMessageReceived(peerAddress, std::move(buffer)); if (err != CHIP_NO_ERROR) diff --git a/src/transport/tests/UDPTransportManager.h b/src/transport/tests/UDPTransportManager.h new file mode 100644 index 00000000000000..2a940d3264e834 --- /dev/null +++ b/src/transport/tests/UDPTransportManager.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace chip { +namespace Test { + +class UDPTransportManager +{ +public: + /// Initialize the underlying layers. + CHIP_ERROR Init() + { + ReturnErrorOnFailure(mIOContext.Init()); + ReturnErrorOnFailure(DeviceLayer::PlatformMgr().InitChipStack()); + ReturnErrorOnFailure(mTransportManager.Init(Transport::UdpListenParameters(DeviceLayer::UDPEndPointManager()) + .SetAddressType(Inet::IPAddressType::kIPv6) + .SetListenPort(CHIP_PORT + 1))); + + return CHIP_NO_ERROR; + } + + // Shutdown all layers, finalize operations + void Shutdown() + { + mTransportManager.Close(); + DeviceLayer::PlatformMgr().Shutdown(); + mIOContext.Shutdown(); + } + + System::Layer & GetSystemLayer() { return mIOContext.GetSystemLayer(); } + chip::Transport::UDP & GetUDP() { return mTransportManager.GetTransport().template GetImplAtIndex<0>(); } + TransportMgrBase & GetTransportMgr() { return mTransportManager; } + IOContext & GetIOContext() { return mIOContext; } + +private: + Test::IOContext mIOContext; + TransportMgr mTransportManager; +}; + +} // namespace Test +} // namespace chip From 0b4376303fa3374bf65d1222c453d3c694b3aef4 Mon Sep 17 00:00:00 2001 From: achsoftathome <107869195+achsoftathome@users.noreply.github.com> Date: Tue, 30 Aug 2022 23:03:53 +0200 Subject: [PATCH 08/27] [doc] Fix of the documentation's build #21967 (#22180) The Doxygen configuration file does not allow the generation of the documentation. To solve this problem, I made some changes: * I excluded symbolic links to avoid infinite recurrences. * I excluded the "third_party" which causes too many troubles. I disabled the transformation of the warning into an error because there's few warning during documentation generation. I have deliberately not made any changes so as not to be too intrusive. I invite the managers of these parts to make corrections that will certainly be more relevant than mine. I put logs file on ticket. Doc entry point: ./docs/html/index.html Build command: CHIP_NAME="xxxx" CHIP_VERSION="v x.y.z" doxygen ./docs/Doxyfile --- docs/Doxyfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Doxyfile b/docs/Doxyfile index 279399498d80c2..cafa736248e40b 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -795,7 +795,7 @@ WARN_NO_PARAMDOC = NO # a warning is encountered. # The default value is: NO. -WARN_AS_ERROR = YES +WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which @@ -919,14 +919,14 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = third_party # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. -EXCLUDE_SYMLINKS = NO +EXCLUDE_SYMLINKS = YES # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude @@ -2172,7 +2172,7 @@ SEARCH_INCLUDES = YES # preprocessor. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = third_party/ +INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the From e11443104afc7ff337981d4d132d8898429c08d4 Mon Sep 17 00:00:00 2001 From: Song GUO Date: Wed, 31 Aug 2022 05:20:32 +0800 Subject: [PATCH 09/27] [python] Add script interface for node discovery in REPL (#22034) --- ...tter - Basic Interactions-checkpoint.ipynb | 4218 +++++++++++++++++ .../repl/Matter - Basic Interactions.ipynb | 298 +- src/controller/python/BUILD.gn | 2 + .../python/ChipDeviceController-Discovery.cpp | 218 + .../ChipDeviceController-ScriptBinding.cpp | 71 +- src/controller/python/chip/ChipDeviceCtrl.py | 115 +- src/controller/python/chip/ChipReplStartup.py | 1 + .../python/chip/discovery/__init__.py | 33 + .../python/test/test_scripts/base.py | 10 +- .../test/test_scripts/mobile-device-test.py | 6 +- 10 files changed, 4719 insertions(+), 253 deletions(-) create mode 100644 docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb create mode 100644 src/controller/python/ChipDeviceController-Discovery.cpp diff --git a/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb b/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb new file mode 100644 index 00000000000000..cf2046aaebc0bd --- /dev/null +++ b/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb @@ -0,0 +1,4218 @@ +{ + "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'>: <OTAUpdateStateEnum.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'>: <NetworkCommissioningStatus.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'>: <NetworkCommissioningStatus.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.BridgedDeviceBasic'>: {\n",
+       "│   │   │   <class 'chip.clusters.Objects.BridgedDeviceBasic.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;95mOTAUpdateStateEnum.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;95mNetworkCommissioningStatus.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;95mNetworkCommissioningStatus.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.BridgedDeviceBasic'\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.BridgedDeviceBasic.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/guides/repl/Matter - Basic Interactions.ipynb b/docs/guides/repl/Matter - Basic Interactions.ipynb index 53e574047d78a0..fe2e36630e4a3c 100644 --- a/docs/guides/repl/Matter - Basic Interactions.ipynb +++ b/docs/guides/repl/Matter - Basic Interactions.ipynb @@ -74,164 +74,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "bad327b7-c78a-4c46-b224-077fe7539ee1", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[0;34m[1643499271185] [10607:4156252] CHIP: [DL] _Init\u001b[0m\n", - "\u001b[0;32m[1643499271185] [10607:4156669] CHIP: [DL] Platform main loop started.\u001b[0m\n" - ] - }, - { - "data": { - "text/html": [ - "
──────────────────────────────────────── Matter REPL ────────────────────────────────────────\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[92m──────────────────────────────────────── \u001b[0mMatter REPL\u001b[92m ────────────────────────────────────────\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
\n",
-       "            \n",
-       "    \n",
-       "            Welcome to the Matter Python REPL!\n",
-       "    \n",
-       "            For help, please type matterhelp()\n",
-       "    \n",
-       "            To get more information on a particular object/class, you can pass\n",
-       "            that into matterhelp() as well.\n",
-       "    \n",
-       "            \n",
-       "
\n" - ], - "text/plain": [ - "\n", - " \n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m Welcome to the Matter Python REPL!\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m For help, please type \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m To get more information on a particular object/class, you can pass\u001b[0m\n", - "\u001b[1;34m that into \u001b[0m\u001b[1;32mmatterhelp\u001b[0m\u001b[1;32m(\u001b[0m\u001b[1;32m)\u001b[0m\u001b[1;34m as well.\u001b[0m\n", - "\u001b[1;34m \u001b[0m\n", - "\u001b[1;34m \u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
─────────────────────────────────────────────────────────────────────────────────────────────\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[92m─────────────────────────────────────────────────────────────────────────────────────────────\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-01-29 15:34:31 johnsj-macbookpro1.roam.corp.google.com root[10607] ERROR [Errno 2] No such file or directory: '/tmp/repl-storage.json'\n", - "2022-01-29 15:34:31 johnsj-macbookpro1.roam.corp.google.com root[10607] WARNING Could not load configuration from /tmp/repl-storage.json - resetting configuration...\n" - ] - }, - { - "data": { - "text/html": [ - "
\n",
-       "No previous fabric admins discovered in persistent storage - creating a new one...\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[38;5;129mNo previous fabric admins discovered in persistent storage - creating a new one\u001b[0m\u001b[38;5;129m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "New FabricAdmin: FabricId: 1(1)\n" - ] - }, - { - "data": { - "text/html": [ - "
\n",
-       "\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "
Creating default device controller on fabric 1...\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[38;5;129mCreating default device controller on fabric \u001b[0m\u001b[1;38;5;129m1\u001b[0m\u001b[38;5;129m...\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Allocating new controller with FabricId: 1(1), NodeId: 1\n" - ] - }, - { - "data": { - "text/html": [ - "
\n",
-       "\n",
-       "Default CHIP Device Controller has been initialized to manage fabricAdmins[0], and is \n",
-       "available as devCtrl\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\n", - "\u001b[34mDefault CHIP Device Controller has been initialized to manage \u001b[0m\u001b[1;31mfabricAdmins\u001b[0m\u001b[1;31m[\u001b[0m\u001b[1;31m0\u001b[0m\u001b[1;31m]\u001b[0m\u001b[1;34m, and is \u001b[0m\n", - "\u001b[1;34mavailable as \u001b[0m\u001b[1;31mdevCtrl\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import chip.native\n", "import pkgutil\n", @@ -259,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "043ade5d-6f01-4cbc-8d60-57d605946ada", "metadata": {}, "outputs": [ @@ -319,7 +167,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "d52b1adc-7723-4be8-80c0-f7f262398d39", "metadata": {}, "outputs": [ @@ -359,7 +207,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "c55de6c7-da4e-488e-bafb-32781ee088a8", "metadata": {}, "outputs": [ @@ -451,7 +299,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "eb2563ac-0315-45ed-9984-308d4376ca94", "metadata": {}, "outputs": [ @@ -515,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "75de30fc-666c-4610-9d86-25fb9d0e4f82", "metadata": {}, "outputs": [ @@ -549,7 +397,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "677ce9b4-99f3-4c0e-8f78-d123eb3190b5", "metadata": {}, "outputs": [ @@ -629,7 +477,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "52ccd8c6", "metadata": {}, "outputs": [], @@ -654,6 +502,123 @@ "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='DCA63289ABCD0000',\n",
+       "│   │   │   port=5540,\n",
+       "│   │   │   longDiscriminator=3840,\n",
+       "│   │   │   vendorId=65521,\n",
+       "│   │   │   productId=32769,\n",
+       "│   │   │   commissioningMode=1,\n",
+       "│   │   │   deviceType=0,\n",
+       "│   │   │   deviceName='',\n",
+       "│   │   │   pairingInstruction='',\n",
+       "│   │   │   pairingHint=33,\n",
+       "│   │   │   mrpRetryIntervalIdle=5000,\n",
+       "│   │   │   mrpRetryIntervalActive=300,\n",
+       "│   │   │   supportsTcp=True,\n",
+       "│   │   │   addresses=[\n",
+       "│   │   │   │   'fd1e:1a94:d591:6914:dea6:32ff:fe89:abcd',\n",
+       "│   │   │   │   'fe80::dea6:32ff:fe89:abcd',\n",
+       "│   │   │   │   '172.16.243.198'\n",
+       "│   │   │   ]\n",
+       "│   │   )\n",
+       ")\n",
+       "]\n",
+       "
\n" + ], + "text/plain": [ + "\n", + "\u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1;35mCommissionableNode\u001b[0m\u001b[1m(\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m(\u001b[0mTo Be Commissioned By\u001b[1m)\u001b[0m=\u001b[32m'caIndex\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/fabricId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x0000000000000001\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/nodeId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x000000000001B669\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m,\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1;35mCommissionableNode\u001b[0m\u001b[1m(\u001b[0m\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33minstanceName\u001b[0m=\u001b[32m'B2D5B11D799BB1E0'\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mhostName\u001b[0m=\u001b[32m'DCA63289ABCD0000'\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mport\u001b[0m=\u001b[1;36m5540\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mlongDiscriminator\u001b[0m=\u001b[1;36m3840\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m65521\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mproductId\u001b[0m=\u001b[1;36m32769\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mcommissioningMode\u001b[0m=\u001b[1;36m1\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[1;36m0\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mdeviceName\u001b[0m=\u001b[32m''\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpairingInstruction\u001b[0m=\u001b[32m''\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpairingHint\u001b[0m=\u001b[1;36m33\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mmrpRetryIntervalIdle\u001b[0m=\u001b[1;36m5000\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mmrpRetryIntervalActive\u001b[0m=\u001b[1;36m300\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33msupportsTcp\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[33maddresses\u001b[0m=\u001b[1m[\u001b[0m\n", + "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'fd1e:1a94:d591:6914:dea6:32ff:fe89:abcd'\u001b[0m,\n", + "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'fe80::dea6:32ff:fe89:abcd'\u001b[0m,\n", + "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'192.168.2.1'\u001b[0m\n", + "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m\n", + "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m\n", + "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", + "\u001b[1m]\u001b[0m\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "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", @@ -4219,9 +4184,9 @@ ], "metadata": { "kernelspec": { - "display_name": "matter-env", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "matter-env" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -4233,7 +4198,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2+chromium.10" + "version": "3.10.5" + }, + "vscode": { + "interpreter": { + "hash": "f7fd7085b4be428477fa1342305f4ebb7800cfd7c4438123a54b78fc013e2c1b" + } } }, "nbformat": 4, diff --git a/src/controller/python/BUILD.gn b/src/controller/python/BUILD.gn index 21897af175f92d..d722a830577ed3 100644 --- a/src/controller/python/BUILD.gn +++ b/src/controller/python/BUILD.gn @@ -51,6 +51,7 @@ shared_library("ChipDeviceCtrl") { if (chip_controller) { sources += [ "ChipCommissionableNodeController-ScriptBinding.cpp", + "ChipDeviceController-Discovery.cpp", "ChipDeviceController-IssueNocChain.cpp", "ChipDeviceController-ScriptBinding.cpp", "ChipDeviceController-ScriptDevicePairingDelegate.cpp", @@ -109,6 +110,7 @@ shared_library("ChipDeviceCtrl") { public_deps += [ "${chip_root}/src/controller/data_model", "${chip_root}/src/credentials:file_attestation_trust_store", + "${chip_root}/third_party/jsoncpp", ] } else { public_deps += [ "$chip_data_model" ] diff --git a/src/controller/python/ChipDeviceController-Discovery.cpp b/src/controller/python/ChipDeviceController-Discovery.cpp new file mode 100644 index 00000000000000..f4aaaed81bdf49 --- /dev/null +++ b/src/controller/python/ChipDeviceController-Discovery.cpp @@ -0,0 +1,218 @@ +/* + * + * Copyright (c) 2022 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file + * Implementation of the native methods expected by the Python + * version of Chip Device Manager. + * + */ + +#include +#include +#include +#include +#include + +using namespace chip; + +typedef void (*IterateDiscoveredCommissionableNodesFunct)(const char * deviceInfoJson, size_t deviceInfoLen); + +extern "C" { + +bool pychip_DeviceController_HasDiscoveredCommissionableNode(Controller::DeviceCommissioner * devCtrl) +{ + for (int i = 0; i < devCtrl->GetMaxCommissionableNodesSupported(); ++i) + { + const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); + if (dnsSdInfo == nullptr) + { + continue; + } + return true; + } + return false; +} + +ChipError::StorageType pychip_DeviceController_DiscoverCommissionableNodes(Controller::DeviceCommissioner * devCtrl, + const uint8_t filterType, const char * filterParam) +{ + Dnssd::DiscoveryFilter filter(static_cast(filterType)); + switch (static_cast(filterType)) + { + case Dnssd::DiscoveryFilterType::kNone: + break; + case Dnssd::DiscoveryFilterType::kShortDiscriminator: + case Dnssd::DiscoveryFilterType::kLongDiscriminator: + case Dnssd::DiscoveryFilterType::kCompressedFabricId: + case Dnssd::DiscoveryFilterType::kVendorId: + case Dnssd::DiscoveryFilterType::kDeviceType: { + // For any numerical filter, convert the string to a filter value + errno = 0; + unsigned long long int numericalArg = strtoull(filterParam, nullptr, 0); + if ((numericalArg == ULLONG_MAX) && (errno == ERANGE)) + { + return CHIP_ERROR_INVALID_ARGUMENT.AsInteger(); + } + filter.code = static_cast(numericalArg); + break; + } + case Dnssd::DiscoveryFilterType::kCommissioningMode: + break; + case Dnssd::DiscoveryFilterType::kCommissioner: + filter.code = 1; + break; + case Dnssd::DiscoveryFilterType::kInstanceName: + filter.code = 0; + filter.instanceName = filterParam; + break; + default: + return CHIP_ERROR_INVALID_ARGUMENT.AsInteger(); + } + + return devCtrl->DiscoverCommissionableNodes(filter).AsInteger(); +} + +void pychip_DeviceController_IterateDiscoveredCommissionableNodes(Controller::DeviceCommissioner * devCtrl, + IterateDiscoveredCommissionableNodesFunct cb) +{ + VerifyOrReturn(cb != nullptr); + + for (int i = 0; i < devCtrl->GetMaxCommissionableNodesSupported(); ++i) + { + const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); + if (dnsSdInfo == nullptr) + { + continue; + } + + Json::Value jsonVal; + + char rotatingId[Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; + Encoding::BytesToUppercaseHexString(dnsSdInfo->commissionData.rotatingId, dnsSdInfo->commissionData.rotatingIdLen, + rotatingId, sizeof(rotatingId)); + + ChipLogProgress(Discovery, "Commissionable Node %d", i); + jsonVal["instanceName"] = dnsSdInfo->commissionData.instanceName; + jsonVal["hostName"] = dnsSdInfo->resolutionData.hostName; + jsonVal["port"] = dnsSdInfo->resolutionData.port; + jsonVal["longDiscriminator"] = dnsSdInfo->commissionData.longDiscriminator; + jsonVal["vendorId"] = dnsSdInfo->commissionData.vendorId; + jsonVal["productId"] = dnsSdInfo->commissionData.productId; + jsonVal["commissioningMode"] = dnsSdInfo->commissionData.commissioningMode; + jsonVal["deviceType"] = dnsSdInfo->commissionData.deviceType; + jsonVal["deviceName"] = dnsSdInfo->commissionData.deviceName; + jsonVal["pairingInstruction"] = dnsSdInfo->commissionData.pairingInstruction; + jsonVal["pairingHint"] = dnsSdInfo->commissionData.pairingHint; + if (dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().HasValue()) + { + jsonVal["mrpRetryIntervalIdle"] = dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().Value().count(); + } + if (dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().HasValue()) + { + jsonVal["mrpRetryIntervalActive"] = dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().Value().count(); + } + jsonVal["supportsTcp"] = dnsSdInfo->resolutionData.supportsTcp; + { + Json::Value addresses; + for (unsigned j = 0; j < dnsSdInfo->resolutionData.numIPs; ++j) + { + char buf[Inet::IPAddress::kMaxStringLength]; + dnsSdInfo->resolutionData.ipAddress[j].ToString(buf); + addresses[j] = buf; + } + jsonVal["addresses"] = addresses; + } + + { + auto str = jsonVal.toStyledString(); + cb(str.c_str(), str.size()); + } + } +} + +void pychip_DeviceController_PrintDiscoveredDevices(Controller::DeviceCommissioner * devCtrl) +{ + for (int i = 0; i < devCtrl->GetMaxCommissionableNodesSupported(); ++i) + { + const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); + if (dnsSdInfo == nullptr) + { + continue; + } + char rotatingId[Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; + Encoding::BytesToUppercaseHexString(dnsSdInfo->commissionData.rotatingId, dnsSdInfo->commissionData.rotatingIdLen, + rotatingId, sizeof(rotatingId)); + + ChipLogProgress(Discovery, "Commissionable Node %d", i); + ChipLogProgress(Discovery, "\tInstance name:\t\t%s", dnsSdInfo->commissionData.instanceName); + ChipLogProgress(Discovery, "\tHost name:\t\t%s", dnsSdInfo->resolutionData.hostName); + ChipLogProgress(Discovery, "\tPort:\t\t\t%u", dnsSdInfo->resolutionData.port); + ChipLogProgress(Discovery, "\tLong discriminator:\t%u", dnsSdInfo->commissionData.longDiscriminator); + ChipLogProgress(Discovery, "\tVendor ID:\t\t%u", dnsSdInfo->commissionData.vendorId); + ChipLogProgress(Discovery, "\tProduct ID:\t\t%u", dnsSdInfo->commissionData.productId); + ChipLogProgress(Discovery, "\tCommissioning Mode\t%u", dnsSdInfo->commissionData.commissioningMode); + ChipLogProgress(Discovery, "\tDevice Type\t\t%u", dnsSdInfo->commissionData.deviceType); + ChipLogProgress(Discovery, "\tDevice Name\t\t%s", dnsSdInfo->commissionData.deviceName); + ChipLogProgress(Discovery, "\tRotating Id\t\t%s", rotatingId); + ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->commissionData.pairingInstruction); + ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->commissionData.pairingHint); + if (dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().HasValue()) + { + ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", + dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().Value().count()); + } + else + { + ChipLogProgress(Discovery, "\tMrp Interval idle\tNot present"); + } + if (dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().HasValue()) + { + ChipLogProgress(Discovery, "\tMrp Interval active\t%u", + dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().Value().count()); + } + else + { + ChipLogProgress(Discovery, "\tMrp Interval active\tNot present"); + } + ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->resolutionData.supportsTcp); + for (unsigned j = 0; j < dnsSdInfo->resolutionData.numIPs; ++j) + { + char buf[Inet::IPAddress::kMaxStringLength]; + dnsSdInfo->resolutionData.ipAddress[j].ToString(buf); + ChipLogProgress(Discovery, "\tAddress %d:\t\t%s", j, buf); + } + } +} + +bool pychip_DeviceController_GetIPForDiscoveredDevice(Controller::DeviceCommissioner * devCtrl, int idx, char * addrStr, + uint32_t len) +{ + const Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(idx); + if (dnsSdInfo == nullptr) + { + return false; + } + // TODO(cecille): Select which one we actually want. + if (dnsSdInfo->resolutionData.ipAddress[0].ToString(addrStr, len) == addrStr) + { + return true; + } + return false; +} +} diff --git a/src/controller/python/ChipDeviceController-ScriptBinding.cpp b/src/controller/python/ChipDeviceController-ScriptBinding.cpp index 32740719ff864b..e0448fb1f2729f 100644 --- a/src/controller/python/ChipDeviceController-ScriptBinding.cpp +++ b/src/controller/python/ChipDeviceController-ScriptBinding.cpp @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -551,76 +552,6 @@ ChipError::StorageType pychip_DeviceController_OpenCommissioningWindow(chip::Con return CHIP_ERROR_INVALID_ARGUMENT.AsInteger(); } -void pychip_DeviceController_PrintDiscoveredDevices(chip::Controller::DeviceCommissioner * devCtrl) -{ - for (int i = 0; i < devCtrl->GetMaxCommissionableNodesSupported(); ++i) - { - const chip::Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(i); - if (dnsSdInfo == nullptr) - { - continue; - } - char rotatingId[chip::Dnssd::kMaxRotatingIdLen * 2 + 1] = ""; - Encoding::BytesToUppercaseHexString(dnsSdInfo->commissionData.rotatingId, dnsSdInfo->commissionData.rotatingIdLen, - rotatingId, sizeof(rotatingId)); - - ChipLogProgress(Discovery, "Commissionable Node %d", i); - ChipLogProgress(Discovery, "\tInstance name:\t\t%s", dnsSdInfo->commissionData.instanceName); - ChipLogProgress(Discovery, "\tHost name:\t\t%s", dnsSdInfo->resolutionData.hostName); - ChipLogProgress(Discovery, "\tPort:\t\t\t%u", dnsSdInfo->resolutionData.port); - ChipLogProgress(Discovery, "\tLong discriminator:\t%u", dnsSdInfo->commissionData.longDiscriminator); - ChipLogProgress(Discovery, "\tVendor ID:\t\t%u", dnsSdInfo->commissionData.vendorId); - ChipLogProgress(Discovery, "\tProduct ID:\t\t%u", dnsSdInfo->commissionData.productId); - ChipLogProgress(Discovery, "\tCommissioning Mode\t%u", dnsSdInfo->commissionData.commissioningMode); - ChipLogProgress(Discovery, "\tDevice Type\t\t%u", dnsSdInfo->commissionData.deviceType); - ChipLogProgress(Discovery, "\tDevice Name\t\t%s", dnsSdInfo->commissionData.deviceName); - ChipLogProgress(Discovery, "\tRotating Id\t\t%s", rotatingId); - ChipLogProgress(Discovery, "\tPairing Instruction\t%s", dnsSdInfo->commissionData.pairingInstruction); - ChipLogProgress(Discovery, "\tPairing Hint\t\t%u", dnsSdInfo->commissionData.pairingHint); - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().HasValue()) - { - ChipLogProgress(Discovery, "\tMrp Interval idle\t%u", - dnsSdInfo->resolutionData.GetMrpRetryIntervalIdle().Value().count()); - } - else - { - ChipLogProgress(Discovery, "\tMrp Interval idle\tNot present"); - } - if (dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().HasValue()) - { - ChipLogProgress(Discovery, "\tMrp Interval active\t%u", - dnsSdInfo->resolutionData.GetMrpRetryIntervalActive().Value().count()); - } - else - { - ChipLogProgress(Discovery, "\tMrp Interval active\tNot present"); - } - ChipLogProgress(Discovery, "\tSupports TCP\t\t%d", dnsSdInfo->resolutionData.supportsTcp); - for (unsigned j = 0; j < dnsSdInfo->resolutionData.numIPs; ++j) - { - char buf[chip::Inet::IPAddress::kMaxStringLength]; - dnsSdInfo->resolutionData.ipAddress[j].ToString(buf); - ChipLogProgress(Discovery, "\tAddress %d:\t\t%s", j, buf); - } - } -} - -bool pychip_DeviceController_GetIPForDiscoveredDevice(chip::Controller::DeviceCommissioner * devCtrl, int idx, char * addrStr, - uint32_t len) -{ - const chip::Dnssd::DiscoveredNodeData * dnsSdInfo = devCtrl->GetDiscoveredDevice(idx); - if (dnsSdInfo == nullptr) - { - return false; - } - // TODO(cecille): Select which one we actually want. - if (dnsSdInfo->resolutionData.ipAddress[0].ToString(addrStr, len) == addrStr) - { - return true; - } - return false; -} - ChipError::StorageType pychip_ScriptDevicePairingDelegate_SetKeyExchangeCallback(chip::Controller::DeviceCommissioner * devCtrl, chip::Controller::DevicePairingDelegate_OnPairingCompleteFunct callback) diff --git a/src/controller/python/chip/ChipDeviceCtrl.py b/src/controller/python/chip/ChipDeviceCtrl.py index 412dd9945599cd..45bdf7cfe640c0 100644 --- a/src/controller/python/chip/ChipDeviceCtrl.py +++ b/src/controller/python/chip/ChipDeviceCtrl.py @@ -41,12 +41,16 @@ from .clusters.CHIPClusters import * from . import clusters as Clusters from .FabricAdmin import FabricAdmin +from . import discovery import enum import threading import typing import builtins import ctypes import copy +import json +import time +import dacite __all__ = ["ChipDeviceController"] @@ -64,6 +68,8 @@ _IssueNOCChainCallbackPythonCallbackFunct = CFUNCTYPE( None, py_object, c_uint32, c_void_p, c_size_t, c_void_p, c_size_t, c_void_p, c_size_t, c_void_p, c_size_t, c_uint64) +_ChipDeviceController_IterateDiscoveredCommissionableNodesFunct = CFUNCTYPE(None, c_char_p, c_size_t) + @dataclass class NOCChain: @@ -117,6 +123,27 @@ class DCState(enum.IntEnum): COMMISSIONING = 5 +class CommissionableNode(discovery.CommissionableNode): + def SetDeviceController(self, devCtrl: 'ChipDeviceController'): + self._devCtrl = devCtrl + + def Commission(self, nodeId: int, setupPinCode: int): + ''' Commission the device using the device controller discovered this device. + + nodeId: The nodeId commissioned to the device + setupPinCode: The setup pin code of the device + ''' + self._devCtrl.CommissionOnNetwork( + nodeId, setupPinCode, filterType=discovery.FilterType.INSTANCE_NAME, filter=self.instanceName) + + def __rich_repr__(self): + yield "(To Be Commissioned By)", self._devCtrl.name + + for k in self.__dataclass_fields__.keys(): + if k in self.__dict__: + yield k, self.__dict__[k] + + class DeviceProxyWrapper(): ''' Encapsulates a pointer to OperationalDeviceProxy on the c++ side that needs to be freed when DeviceProxyWrapper goes out of scope. There is a potential issue where @@ -167,17 +194,7 @@ def numTotalSessions(self) -> int: return numSessions.value -class DiscoveryFilterType(enum.IntEnum): - # These must match chip::Dnssd::DiscoveryFilterType values (barring the naming convention) - NONE = 0 - SHORT_DISCRIMINATOR = 1 - LONG_DISCRIMINATOR = 2 - VENDOR_ID = 3 - DEVICE_TYPE = 4 - COMMISSIONING_MODE = 5 - INSTANCE_NAME = 6 - COMMISSIONER = 7 - COMPRESSED_FABRIC_ID = 8 +DiscoveryFilterType = discovery.FilterType class ChipDeviceController(): @@ -589,7 +606,49 @@ def GetAddressAndPort(self, nodeid): return (address.value.decode(), port.value) if error == 0 else None + def DiscoverCommissionableNodes(self, filterType: discovery.FilterType = discovery.FilterType.NONE, filter: typing.Any = None, stopOnFirst: bool = False, timeoutSecond: int = 5) -> typing.Union[None, CommissionableNode, typing.List[CommissionableNode]]: + ''' Discover commissionable nodes via DNS-SD with specified filters. + Supported filters are: + + discovery.FilterType.NONE + discovery.FilterType.SHORT_DISCRIMINATOR + discovery.FilterType.LONG_DISCRIMINATOR + discovery.FilterType.VENDOR_ID + discovery.FilterType.DEVICE_TYPE + discovery.FilterType.COMMISSIONING_MODE + discovery.FilterType.INSTANCE_NAME + discovery.FilterType.COMMISSIONER + discovery.FilterType.COMPRESSED_FABRIC_ID + + This function will always return a list of CommissionableDevice. When stopOnFirst is set, this function will return when at least one device is discovered or on timeout. + ''' + self.CheckIsActive() + + if isinstance(filter, int): + filter = str(filter) + + res = self._ChipStack.Call( + lambda: self._dmLib.pychip_DeviceController_DiscoverCommissionableNodes( + self.devCtrl, int(filterType), str(filter).encode("utf-8") + b"\x00")) + + if res != 0: + raise self._ChipStack.ErrorToException(res) + + if timeoutSecond != 0: + if stopOnFirst: + target = time.time() + timeoutSecond + while time.time() < target: + if self._ChipStack.Call(lambda: self._dmLib.pychip_DeviceController_HasDiscoveredCommissionableNode(self.devCtrl)): + break + time.sleep(0.1) + else: + time.sleep(timeoutSecond) + + return self.GetDiscoveredDevices() + def DiscoverCommissionableNodesLongDiscriminator(self, long_discriminator): + ''' Deprecated, use DiscoverCommissionableNodes + ''' self.CheckIsActive() return self._ChipStack.Call( @@ -598,6 +657,8 @@ def DiscoverCommissionableNodesLongDiscriminator(self, long_discriminator): ) def DiscoverCommissionableNodesShortDiscriminator(self, short_discriminator): + ''' Deprecated, use DiscoverCommissionableNodes + ''' self.CheckIsActive() return self._ChipStack.Call( @@ -606,6 +667,8 @@ def DiscoverCommissionableNodesShortDiscriminator(self, short_discriminator): ) def DiscoverCommissionableNodesVendor(self, vendor): + ''' Deprecated, use DiscoverCommissionableNodes + ''' self.CheckIsActive() return self._ChipStack.Call( @@ -614,6 +677,8 @@ def DiscoverCommissionableNodesVendor(self, vendor): ) def DiscoverCommissionableNodesDeviceType(self, device_type): + ''' Deprecated, use DiscoverCommissionableNodes + ''' self.CheckIsActive() return self._ChipStack.Call( @@ -622,6 +687,8 @@ def DiscoverCommissionableNodesDeviceType(self, device_type): ) def DiscoverCommissionableNodesCommissioningEnabled(self): + ''' Deprecated, use DiscoverCommissionableNodes + ''' self.CheckIsActive() return self._ChipStack.Call( @@ -630,6 +697,8 @@ def DiscoverCommissionableNodesCommissioningEnabled(self): ) def PrintDiscoveredDevices(self): + ''' Deprecated, use GetCommissionableNodes + ''' self.CheckIsActive() return self._ChipStack.Call( @@ -637,6 +706,22 @@ def PrintDiscoveredDevices(self): self.devCtrl) ) + def GetDiscoveredDevices(self): + def GetDevices(devCtrl): + devices = [] + + @_ChipDeviceController_IterateDiscoveredCommissionableNodesFunct + def HandleDevice(deviceJson, deviceJsonLen): + jsonStr = ctypes.string_at(deviceJson, deviceJsonLen).decode("utf-8") + device = dacite.from_dict(data_class=CommissionableNode, data=json.loads(jsonStr)) + device.SetDeviceController(devCtrl) + devices.append(device) + + self._dmLib.pychip_DeviceController_IterateDiscoveredCommissionableNodes(devCtrl.devCtrl, HandleDevice) + return devices + + return self._ChipStack.Call(lambda: GetDevices(self)) + def ParseQRCode(self, qrCode, output): self.CheckIsActive() @@ -655,6 +740,8 @@ def GetIPForDiscoveredDevice(self, idx, addrStr, length): ) def DiscoverAllCommissioning(self): + ''' Deprecated, use DiscoverCommissionableNodes + ''' self.CheckIsActive() return self._ChipStack.Call( @@ -1239,7 +1326,7 @@ def _InitLib(self): self._dmLib.pychip_DeviceController_OnNetworkCommission.restype = c_uint32 self._dmLib.pychip_DeviceController_DiscoverAllCommissionableNodes.argtypes = [ - c_void_p] + c_void_p, c_uint8, c_char_p] self._dmLib.pychip_DeviceController_DiscoverAllCommissionableNodes.restype = c_uint32 self._dmLib.pychip_DeviceController_DiscoverCommissionableNodesLongDiscriminator.argtypes = [ @@ -1270,6 +1357,10 @@ def _InitLib(self): c_void_p] self._dmLib.pychip_DeviceController_PrintDiscoveredDevices.argtypes = [ c_void_p] + self._dmLib.pychip_DeviceController_PrintDiscoveredDevices.argtypes = [ + c_void_p, _ChipDeviceController_IterateDiscoveredCommissionableNodesFunct] + self._dmLib.pychip_DeviceController_HasDiscoveredCommissionableNode.argtypes = [c_void_p] + self._dmLib.pychip_DeviceController_HasDiscoveredCommissionableNode.restype = c_bool self._dmLib.pychip_DeviceController_GetIPForDiscoveredDevice.argtypes = [ c_void_p, c_int, c_char_p, c_uint32] diff --git a/src/controller/python/chip/ChipReplStartup.py b/src/controller/python/chip/ChipReplStartup.py index 519c292ba9d9d8..5a33dd7e723ff0 100644 --- a/src/controller/python/chip/ChipReplStartup.py +++ b/src/controller/python/chip/ChipReplStartup.py @@ -14,6 +14,7 @@ import chip.FabricAdmin import chip.CertificateAuthority import chip.native +import chip.discovery from chip.utils import CommissioningBuildingBlocks import atexit diff --git a/src/controller/python/chip/discovery/__init__.py b/src/controller/python/chip/discovery/__init__.py index e41360414bee8b..a6897949c26813 100644 --- a/src/controller/python/chip/discovery/__init__.py +++ b/src/controller/python/chip/discovery/__init__.py @@ -17,6 +17,7 @@ import logging import time import threading +import enum from dataclasses import dataclass from typing import List, Dict, Set, Callable @@ -25,6 +26,19 @@ from chip.discovery.types import DiscoverSuccessCallback_t, DiscoverFailureCallback_t +class FilterType(enum.IntEnum): + # These must match chip::Dnssd::DiscoveryFilterType values (barring the naming convention) + NONE = 0 + SHORT_DISCRIMINATOR = 1 + LONG_DISCRIMINATOR = 2 + VENDOR_ID = 3 + DEVICE_TYPE = 4 + COMMISSIONING_MODE = 5 + INSTANCE_NAME = 6 + COMMISSIONER = 7 + COMPRESSED_FABRIC_ID = 8 + + @dataclass(unsafe_hash=True) class PeerId: """Represents a remote peer id.""" @@ -56,6 +70,25 @@ class PendingDiscovery: firstResultTime: int +@dataclass +class CommissionableNode(): + instanceName: str = None + hostName: str = None + port: int = None + longDiscriminator: int = None + vendorId: int = None + productId: int = None + commissioningMode: int = None + deviceType: int = None + deviceName: str = None + pairingInstruction: str = None + pairingHint: int = None + mrpRetryIntervalIdle: int = None + mrpRetryIntervalActive: int = None + supportsTcp: bool = None + addresses: List[str] = None + + # Milliseconds to wait for additional results onece a single result has # been received _RESULT_WAIT_TIME_SEC = 0.05 diff --git a/src/controller/python/test/test_scripts/base.py b/src/controller/python/test/test_scripts/base.py index 8665c288276603..03249474d799c9 100644 --- a/src/controller/python/test/test_scripts/base.py +++ b/src/controller/python/test/test_scripts/base.py @@ -37,6 +37,7 @@ import chip.native import chip.FabricAdmin import chip.CertificateAuthority +import chip.discovery import copy import secrets import faulthandler @@ -223,15 +224,14 @@ def _WaitForOneDiscoveredDevice(self, timeoutSeconds: int = 2): def TestDiscovery(self, discriminator: int): self.logger.info( f"Discovering commissionable nodes with discriminator {discriminator}") - self.devCtrl.DiscoverCommissionableNodesLongDiscriminator( - ctypes.c_uint16(int(discriminator))) - res = self._WaitForOneDiscoveredDevice() + res = self.devCtrl.DiscoverCommissionableNodes( + chip.discovery.FilterType.LONG_DISCRIMINATOR, discriminator, stopOnFirst=True, timeoutSecond=3) if not res: self.logger.info( f"Device not found") return False - self.logger.info(f"Found device at {res}") - return res + self.logger.info(f"Found device {res[0]}") + return res[0] def TestPaseOnly(self, ip: str, setuppin: int, nodeid: int): self.logger.info( diff --git a/src/controller/python/test/test_scripts/mobile-device-test.py b/src/controller/python/test/test_scripts/mobile-device-test.py index 99f17aabe27363..4f63e8aadefb1e 100755 --- a/src/controller/python/test/test_scripts/mobile-device-test.py +++ b/src/controller/python/test/test_scripts/mobile-device-test.py @@ -59,8 +59,10 @@ def ethernet_commissioning(test: BaseTestHelper, discriminator: int, setup_pin: int, address_override: str, device_nodeid: int): logger.info("Testing discovery") - address = test.TestDiscovery(discriminator=discriminator) - FailIfNot(address, "Failed to discover any devices.") + device = test.TestDiscovery(discriminator=discriminator) + FailIfNot(device, "Failed to discover any devices.") + + address = device.addresses[0] # FailIfNot(test.SetNetworkCommissioningParameters(dataset=TEST_THREAD_NETWORK_DATASET_TLV), # "Failed to finish network commissioning") From 13e6825da2b6bdc13cc2fd86f1d4a30aa4d48b72 Mon Sep 17 00:00:00 2001 From: amitnj <74272437+amitnj@users.noreply.github.com> Date: Tue, 30 Aug 2022 17:49:08 -0700 Subject: [PATCH 10/27] Allow endpoint ID to be specified when adding content app dynamically (#22199) * Allow endpoint ID sto be specified when adding content app dynamically * Restyled by whitespace * Restyled by clang-format * Review comments... * Restyled by whitespace * Restyled by clang-format * Update content apps array only when adding endpoint succeeds. updated documentation. * Restyled by clang-format Co-authored-by: Restyled.io --- .../java/MyUserPrompterResolver-JNI.cpp | 2 + examples/tv-app/android/java/TVApp-JNI.cpp | 1 + src/app/app-platform/ContentAppPlatform.cpp | 112 ++++++++++++++---- src/app/app-platform/ContentAppPlatform.h | 15 ++- 4 files changed, 105 insertions(+), 25 deletions(-) diff --git a/examples/tv-app/android/java/MyUserPrompterResolver-JNI.cpp b/examples/tv-app/android/java/MyUserPrompterResolver-JNI.cpp index 41f2c8f32ebec6..4dc95a2b16b684 100644 --- a/examples/tv-app/android/java/MyUserPrompterResolver-JNI.cpp +++ b/examples/tv-app/android/java/MyUserPrompterResolver-JNI.cpp @@ -48,6 +48,7 @@ JNI_METHOD(void, OnPinCodeDeclined)(JNIEnv *, jobject) JNI_METHOD(void, OnPromptAccepted)(JNIEnv *, jobject) { #if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE + chip::DeviceLayer::StackLock lock; ChipLogProgress(Zcl, "OnPromptAccepted"); GetCommissionerDiscoveryController()->Ok(); #endif @@ -56,6 +57,7 @@ JNI_METHOD(void, OnPromptAccepted)(JNIEnv *, jobject) JNI_METHOD(void, OnPromptDeclined)(JNIEnv *, jobject) { #if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE + chip::DeviceLayer::StackLock lock; ChipLogProgress(Zcl, "OnPromptDeclined"); GetCommissionerDiscoveryController()->Cancel(); #endif diff --git a/examples/tv-app/android/java/TVApp-JNI.cpp b/examples/tv-app/android/java/TVApp-JNI.cpp index aec9759c1f56db..ac1ef7abfd4f66 100644 --- a/examples/tv-app/android/java/TVApp-JNI.cpp +++ b/examples/tv-app/android/java/TVApp-JNI.cpp @@ -193,6 +193,7 @@ JNI_METHOD(void, setChipDeviceEventProvider)(JNIEnv *, jobject, jobject provider JNI_METHOD(jint, addContentApp) (JNIEnv *, jobject, jstring vendorName, jint vendorId, jstring appName, jint productId, jstring appVersion, jobject manager) { + chip::DeviceLayer::StackLock lock; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); JniUtfString vName(env, vendorName); diff --git a/src/app/app-platform/ContentAppPlatform.cpp b/src/app/app-platform/ContentAppPlatform.cpp index de8e53faabcb3b..7865c87c71d0a3 100644 --- a/src/app/app-platform/ContentAppPlatform.cpp +++ b/src/app/app-platform/ContentAppPlatform.cpp @@ -100,6 +100,8 @@ EndpointId ContentAppPlatform::AddContentApp(ContentApp * app, EmberAfEndpointTy if (mContentApps[index] == app) { ChipLogProgress(DeviceLayer, "Already added"); + // already added, return endpointId of already added endpoint. + // desired endpointId does not have any impact return app->GetEndpointId(); } index++; @@ -108,38 +110,102 @@ EndpointId ContentAppPlatform::AddContentApp(ContentApp * app, EmberAfEndpointTy index = 0; while (index < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) { - if (nullptr == mContentApps[index]) + if (mContentApps[index] != nullptr) { - mContentApps[index] = app; - EmberAfStatus ret; - while (1) + index++; + continue; + } + EmberAfStatus ret; + EndpointId initEndpointId = mCurrentEndpointId; + + do + { + ret = emberAfSetDynamicEndpoint(index, mCurrentEndpointId, ep, dataVersionStorage, deviceTypeList); + if (ret == EMBER_ZCL_STATUS_SUCCESS) { - ret = emberAfSetDynamicEndpoint(index, mCurrentEndpointId, ep, dataVersionStorage, deviceTypeList); - if (ret == EMBER_ZCL_STATUS_SUCCESS) - { - ChipLogProgress(DeviceLayer, "Added ContentApp %s to dynamic endpoint %d (index=%d)", vendorApp.applicationId, - mCurrentEndpointId, index); - app->SetEndpointId(mCurrentEndpointId); - return app->GetEndpointId(); - } - else if (ret != EMBER_ZCL_STATUS_DUPLICATE_EXISTS) - { - ChipLogError(DeviceLayer, "Adding ContentApp error=%d", ret); - return kNoCurrentEndpointId; - } - // Handle wrap condition - if (++mCurrentEndpointId < mFirstDynamicEndpointId) - { - mCurrentEndpointId = mFirstDynamicEndpointId; - } + ChipLogProgress(DeviceLayer, "Added ContentApp %s to dynamic endpoint %d (index=%d)", vendorApp.applicationId, + mCurrentEndpointId, index); + app->SetEndpointId(mCurrentEndpointId); + mContentApps[index] = app; + IncrementCurrentEndpointID(); + return app->GetEndpointId(); } + else if (ret != EMBER_ZCL_STATUS_DUPLICATE_EXISTS) + { + ChipLogError(DeviceLayer, "Adding ContentApp error=%d", ret); + return kNoCurrentEndpointId; + } + IncrementCurrentEndpointID(); + } while (initEndpointId != mCurrentEndpointId); + ChipLogError(DeviceLayer, "Failed to add dynamic endpoint: No endpoints available!"); + return kNoCurrentEndpointId; + } + ChipLogError(DeviceLayer, "Failed to add dynamic endpoint: max endpoint count reached!"); + return kNoCurrentEndpointId; +} + +EndpointId ContentAppPlatform::AddContentApp(ContentApp * app, EmberAfEndpointType * ep, + const Span & dataVersionStorage, + const Span & deviceTypeList, EndpointId desiredEndpointId) +{ + CatalogVendorApp vendorApp = app->GetApplicationBasicDelegate()->GetCatalogVendorApp(); + + ChipLogProgress(DeviceLayer, "Adding ContentApp with appid %s ", vendorApp.applicationId); + uint8_t index = 0; + // check if already loaded + while (index < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) + { + if (mContentApps[index] == app) + { + ChipLogProgress(DeviceLayer, "Already added"); + // already added, return endpointId of already added endpoint. + // desired endpointId does not have any impact + return app->GetEndpointId(); } index++; } - ChipLogError(DeviceLayer, "Failed to add dynamic endpoint: No endpoints available!"); + + if (desiredEndpointId < FIXED_ENDPOINT_COUNT || + emberAfGetDynamicIndexFromEndpoint(desiredEndpointId) != kEmberInvalidEndpointIndex) + { + // invalid desiredEndpointId + ChipLogError(DeviceLayer, "Failed to add dynamic endpoint: desired endpointID is invalid!"); + return kNoCurrentEndpointId; + } + + index = 0; + while (index < CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) + { + if (mContentApps[index] != nullptr) + { + index++; + continue; + } + EmberAfStatus ret = emberAfSetDynamicEndpoint(index, desiredEndpointId, ep, dataVersionStorage, deviceTypeList); + if (ret != EMBER_ZCL_STATUS_SUCCESS) + { + ChipLogError(DeviceLayer, "Adding ContentApp error=%d", ret); + return kNoCurrentEndpointId; + } + ChipLogProgress(DeviceLayer, "Added ContentApp %s to dynamic endpoint %d (index=%d)", vendorApp.applicationId, + desiredEndpointId, index); + app->SetEndpointId(desiredEndpointId); + mContentApps[index] = app; + return app->GetEndpointId(); + } + ChipLogError(DeviceLayer, "Failed to add dynamic endpoint: max endpoint count reached!"); return kNoCurrentEndpointId; } +void ContentAppPlatform::IncrementCurrentEndpointID() +{ + // Handle wrap condition + if (++mCurrentEndpointId < mFirstDynamicEndpointId) + { + mCurrentEndpointId = mFirstDynamicEndpointId; + } +} + EndpointId ContentAppPlatform::RemoveContentApp(ContentApp * app) { uint8_t index = 0; diff --git a/src/app/app-platform/ContentAppPlatform.h b/src/app/app-platform/ContentAppPlatform.h index cac2441d46382e..3a39365e95c754 100644 --- a/src/app/app-platform/ContentAppPlatform.h +++ b/src/app/app-platform/ContentAppPlatform.h @@ -80,13 +80,21 @@ class DLL_EXPORT ContentAppPlatform // add apps to the platform. // This will assign the app to an endpoint (if it is not already added) and make it accessible via Matter - // returns the global endpoint for this app, or 0 if an error occurred - // + // returns the global endpoint for this app, or kNoCurrentEndpointId if an error occurred. // dataVersionStorage.size() needs to be at least as big as the number of // server clusters in the EmberAfEndpointType passed in. EndpointId AddContentApp(ContentApp * app, EmberAfEndpointType * ep, const Span & dataVersionStorage, const Span & deviceTypeList); + // add apps to the platform. + // This will assign the app to the desiredEndpointId (if it is not already used) + // and make it accessible via Matter, return the global endpoint for this app(if app is already added) + // , or kNoCurrentEndpointId if an error occurred. desiredEndpointId cannot be less that Fixed endpoint count + // dataVersionStorage.size() needs to be at least as big as the number of + // server clusters in the EmberAfEndpointType passed in. + EndpointId AddContentApp(ContentApp * app, EmberAfEndpointType * ep, const Span & dataVersionStorage, + const Span & deviceTypeList, EndpointId desiredEndpointId); + // remove app from the platform. // returns the endpoint id where the app was, or 0 if app was not loaded EndpointId RemoveContentApp(ContentApp * app); @@ -155,6 +163,9 @@ class DLL_EXPORT ContentAppPlatform EndpointId mCurrentEndpointId; EndpointId mFirstDynamicEndpointId; ContentApp * mContentApps[CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT]; + +private: + void IncrementCurrentEndpointID(); }; } // namespace AppPlatform From 716b95770c0a700285344d857f7d6b93c66feb4e Mon Sep 17 00:00:00 2001 From: Yufeng Wang Date: Tue, 30 Aug 2022 17:59:45 -0700 Subject: [PATCH 11/27] =?UTF-8?q?Don't=20delay=20the=20release=20of=20Lwip?= =?UTF-8?q?=20UDPEndPoint=20if=20there=20is=20no=20pending=20Lw=E2=80=A6?= =?UTF-8?q?=20(#22122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't delay the release of Lwip UDPEndPoint if there is no pending LwIPReceiveUDPMessage * Use std::atomic_int instead of bool * Update src/inet/UDPEndPointImplLwIP.cpp Co-authored-by: Zang MingJie * Update src/inet/UDPEndPointImplLwIP.cpp Co-authored-by: Boris Zbarsky Co-authored-by: Zang MingJie Co-authored-by: Boris Zbarsky --- src/inet/UDPEndPointImplLwIP.cpp | 26 +++++++++++++++++++------- src/inet/UDPEndPointImplLwIP.h | 1 + 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/inet/UDPEndPointImplLwIP.cpp b/src/inet/UDPEndPointImplLwIP.cpp index 2d54324e606fd7..7b9cc6f46415ee 100644 --- a/src/inet/UDPEndPointImplLwIP.cpp +++ b/src/inet/UDPEndPointImplLwIP.cpp @@ -252,17 +252,20 @@ void UDPEndPointImplLwIP::CloseImpl() mUDP = nullptr; mLwIPEndPointType = LwIPEndPointType::Unknown; - // In case that there is a UDPEndPointImplLwIP::LwIPReceiveUDPMessage + // If there is a UDPEndPointImplLwIP::LwIPReceiveUDPMessage // event pending in the event queue (SystemLayer::ScheduleLambda), we // schedule a release call to the end of the queue, to ensure that the // queued pointer to UDPEndPointImplLwIP is not dangling. - Retain(); - CHIP_ERROR err = GetSystemLayer().ScheduleLambda([this] { Release(); }); - if (err != CHIP_NO_ERROR) + if (mDelayReleaseCount != 0) { - ChipLogError(Inet, "Unable scedule lambda: %" CHIP_ERROR_FORMAT, err.Format()); - // There is nothing we can do here, accept the chance of racing - Release(); + Retain(); + CHIP_ERROR err = GetSystemLayer().ScheduleLambda([this] { Release(); }); + if (err != CHIP_NO_ERROR) + { + ChipLogError(Inet, "Unable to schedule lambda: %" CHIP_ERROR_FORMAT, err.Format()); + // There is nothing we can do here, accept the chance of racing + Release(); + } } } @@ -390,8 +393,13 @@ void UDPEndPointImplLwIP::LwIPReceiveUDPMessage(void * arg, struct udp_pcb * pcb pktInfo->SrcPort = port; pktInfo->DestPort = pcb->local_port; + // Increase mDelayReleaseCount to delay release of this UDP EndPoint while the HandleDataReceived call is + // pending on it. + ep->mDelayReleaseCount++; + CHIP_ERROR err = ep->GetSystemLayer().ScheduleLambda( [ep, p = System::LwIPPacketBufferView::UnsafeGetLwIPpbuf(buf), pktInfo = pktInfo.get()] { + ep->mDelayReleaseCount--; ep->HandleDataReceived(System::PacketBufferHandle::Adopt(p), pktInfo); }); @@ -402,6 +410,10 @@ void UDPEndPointImplLwIP::LwIPReceiveUDPMessage(void * arg, struct udp_pcb * pcb // Similarly, ScheduleLambda now has ownership of pktInfo. pktInfo.release(); } + else + { + ep->mDelayReleaseCount--; + } } CHIP_ERROR UDPEndPointImplLwIP::SetMulticastLoopback(IPVersion aIPVersion, bool aLoopback) diff --git a/src/inet/UDPEndPointImplLwIP.h b/src/inet/UDPEndPointImplLwIP.h index 7bc523c913ff3a..3d8aebe1021f52 100644 --- a/src/inet/UDPEndPointImplLwIP.h +++ b/src/inet/UDPEndPointImplLwIP.h @@ -61,6 +61,7 @@ class UDPEndPointImplLwIP : public UDPEndPoint, public EndPointStateLwIP static void LwIPReceiveUDPMessage(void * arg, struct udp_pcb * pcb, struct pbuf * p, const ip_addr_t * addr, u16_t port); udp_pcb * mUDP; // LwIP User datagram protocol (UDP) control block. + std::atomic_int mDelayReleaseCount{ 0 }; }; using UDPEndPointImpl = UDPEndPointImplLwIP; From a2d3f392f3cc8e717e434b49e8f8636507cb25a5 Mon Sep 17 00:00:00 2001 From: Tennessee Carmel-Veilleux Date: Tue, 30 Aug 2022 22:13:37 -0400 Subject: [PATCH 12/27] Fix use-after-free in AndroidDeviceControllerWrapper (#22280) * Fix use-after-fre in AndroidDeviceControllerWrapper - Some JNI array refererences we used beyond their live scope in init of the `AndroidDeviceControllerWrapper`, causing either crashes or errors, in probabilistic situations (not easily reproducible, but seen in larger scale testing) Fixes: #22279 This PR: - Ensures a copy exists of the originally "passed by JNI reference" data, up to the point it is no longer used, for NOC, ICAC, RCAC and IPK. Testing done: - Integrations test pass - Testing done also in field trials by some participants * Restyled --- .../java/AndroidDeviceControllerWrapper.cpp | 31 ++++++++++++++++--- .../java/AndroidDeviceControllerWrapper.h | 5 +++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/controller/java/AndroidDeviceControllerWrapper.cpp b/src/controller/java/AndroidDeviceControllerWrapper.cpp index 2be556d5a2bfd9..dc223d989859df 100644 --- a/src/controller/java/AndroidDeviceControllerWrapper.cpp +++ b/src/controller/java/AndroidDeviceControllerWrapper.cpp @@ -20,6 +20,9 @@ #include #include +#include + +#include #include #include @@ -224,9 +227,24 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( JniByteArray jniIcac(env, intermediateCertificate); JniByteArray jniNoc(env, nodeOperationalCertificate); - setupParams.controllerRCAC = jniRcac.byteSpan(); - setupParams.controllerICAC = jniIcac.byteSpan(); - setupParams.controllerNOC = jniNoc.byteSpan(); + // Make copies of the cert that outlive the scope so that future factor init does not + // cause loss of scope from the JNI refs going away. Also, this keeps the certs + // handy for debugging commissioner init. + wrapper->mRcacCertificate = std::vector(jniRcac.byteSpan().begin(), jniRcac.byteSpan().end()); + if (!jniIcac.byteSpan().empty()) + { + wrapper->mIcacCertificate = std::vector(jniIcac.byteSpan().begin(), jniIcac.byteSpan().end()); + } + else + { + wrapper->mIcacCertificate.clear(); + } + + wrapper->mNocCertificate = std::vector(jniNoc.byteSpan().begin(), jniNoc.byteSpan().end()); + + setupParams.controllerRCAC = chip::ByteSpan(wrapper->mRcacCertificate.data(), wrapper->mRcacCertificate.size()); + setupParams.controllerICAC = chip::ByteSpan(wrapper->mIcacCertificate.data(), wrapper->mIcacCertificate.size()); + setupParams.controllerNOC = chip::ByteSpan(wrapper->mNocCertificate.data(), wrapper->mNocCertificate.size()); } else { @@ -276,10 +294,12 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( ChipLogByteSpan(Support, compressedFabricIdSpan); chip::ByteSpan ipkSpan; + std::vector ipkBuffer; if (ipkEpochKey != nullptr) { JniByteArray jniIpk(env, ipkEpochKey); - ipkSpan = jniIpk.byteSpan(); + ipkBuffer = std::vector(jniIpk.byteSpan().begin(), jniIpk.byteSpan().end()); + ipkSpan = chip::ByteSpan(ipkBuffer.data(), ipkBuffer.size()); } else { @@ -288,6 +308,9 @@ AndroidDeviceControllerWrapper * AndroidDeviceControllerWrapper::AllocateNew( *errInfoOnFailure = chip::Credentials::SetSingleIpkEpochKey( &wrapper->mGroupDataProvider, wrapper->Controller()->GetFabricIndex(), ipkSpan, compressedFabricIdSpan); + + memset(ipkBuffer.data(), 0, ipkBuffer.size()); + if (*errInfoOnFailure != CHIP_NO_ERROR) { return nullptr; diff --git a/src/controller/java/AndroidDeviceControllerWrapper.h b/src/controller/java/AndroidDeviceControllerWrapper.h index 8c0697b024170a..c1421863bbf29d 100644 --- a/src/controller/java/AndroidDeviceControllerWrapper.h +++ b/src/controller/java/AndroidDeviceControllerWrapper.h @@ -20,6 +20,7 @@ #include #include +#include #include @@ -178,6 +179,10 @@ class AndroidDeviceControllerWrapper : public chip::Controller::DevicePairingDel jbyteArray operationalDatasetBytes = nullptr; jbyte * operationalDataset = nullptr; + std::vector mNocCertificate; + std::vector mIcacCertificate; + std::vector mRcacCertificate; + chip::Controller::AutoCommissioner mAutoCommissioner; chip::Credentials::PartialDACVerifier mPartialDACVerifier; From 08830a594d735fc037b0af1aa9292bfd3f43a74a Mon Sep 17 00:00:00 2001 From: Mikhail Burshteyn Date: Tue, 30 Aug 2022 21:15:03 -0600 Subject: [PATCH 13/27] Expose `DeviceProxy::GetAttestationChallenge` to Obj-C. (#22111) * Expose `DeviceCommissioner::GetAttestationChallenge` to Obj-C. * Update PR based on comments from bzbarsky. * Restyled by whitespace * Restyled by clang-format * Fix typo in comment. Co-authored-by: Restyled.io Co-authored-by: Boris Zbarsky --- .../Framework/CHIP/MTRDeviceController.h | 8 ++++++ .../Framework/CHIP/MTRDeviceController.mm | 28 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.h b/src/darwin/Framework/CHIP/MTRDeviceController.h index e53a3a86732958..f1ca55bb9001c4 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController.h @@ -134,6 +134,14 @@ typedef void (^MTRDeviceConnectionCallback)(MTRBaseDevice * _Nullable device, NS */ - (void)setNocChainIssuer:(id)nocChainIssuer queue:(dispatch_queue_t)queue; +/** + * Return the attestation challenge for the secure session of the device being commissioned. + * + * Attempts to retrieve the generated attestation challenge from a commissionee with the given Device ID. + * Returns nil if given Device ID does not match an active commissionee, or if a Secure Session is not availale. + */ +- (nullable NSData *)generateAttestationChallengeForDeviceId:(uint64_t)deviceId; + /** * Compute a PASE verifier and passcode ID for the desired setup pincode. * diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 7e4aa25ad14d79..d122d28f93e16f 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -71,6 +71,8 @@ static NSString * const kErrorGenerateNOC = @"Generating operational certificate failed"; static NSString * const kErrorKeyAllocation = @"Generating new operational key failed"; static NSString * const kErrorCSRValidation = @"Extracting public key from CSR failed"; +static NSString * const kErrorGetCommissionee = @"Failure obtaining device being commissioned"; +static NSString * const kErrorGetAttestationChallenge = @"Failure getting attestation challenge"; @interface MTRDeviceController () @@ -703,6 +705,32 @@ - (nullable NSData *)computePaseVerifier:(uint32_t)setupPincode iterations:(uint return result; } +- (nullable NSData *)generateAttestationChallengeForDeviceId:(uint64_t)deviceId +{ + VerifyOrReturnValue([self checkIsRunning], nil); + + __block NSData * attestationChallenge; + dispatch_sync(_chipWorkQueue, ^{ + VerifyOrReturn([self checkIsRunning]); + + chip::CommissioneeDeviceProxy * deviceProxy; + auto errorCode = self.cppCommissioner->GetDeviceBeingCommissioned(deviceId, &deviceProxy); + auto success = ![self checkForError:errorCode logMsg:kErrorGetCommissionee error:nil]; + VerifyOrReturn(success); + + uint8_t challengeBuffer[chip::Crypto::kAES_CCM128_Key_Length]; + chip::ByteSpan challenge(challengeBuffer); + + errorCode = deviceProxy->GetAttestationChallenge(challenge); + success = ![self checkForError:errorCode logMsg:kErrorGetAttestationChallenge error:nil]; + VerifyOrReturn(success); + + attestationChallenge = AsData(challenge); + }); + + return attestationChallenge; +} + - (BOOL)checkForInitError:(BOOL)condition logMsg:(NSString *)logMsg { if (condition) { From 4bb79cca1e75ff49bc61c530f7fc9739606bb52d Mon Sep 17 00:00:00 2001 From: jmartinez-silabs <67972863+jmartinez-silabs@users.noreply.github.com> Date: Wed, 31 Aug 2022 00:24:32 -0400 Subject: [PATCH 14/27] Add openthread lib with coap api enabled (#22276) --- scripts/examples/gn_efr32_example.sh | 4 ++++ third_party/openthread/ot-efr32 | 2 +- third_party/silabs/BUILD.gn | 11 +++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/scripts/examples/gn_efr32_example.sh b/scripts/examples/gn_efr32_example.sh index 5b47c945c771a8..2169332984236d 100755 --- a/scripts/examples/gn_efr32_example.sh +++ b/scripts/examples/gn_efr32_example.sh @@ -156,6 +156,10 @@ else optArgs+="use_silabs_thread_lib=true chip_openthread_target=$SILABS_THREAD_TARGET openthread_external_platform=\"""\" " shift ;; + --use_ot_coap_lib) + optArgs+="use_silabs_thread_lib=true chip_openthread_target=$SILABS_THREAD_TARGET openthread_external_platform=\"""\" use_thread_coap_lib=true " + shift + ;; *) if [ "$1" =~ *"use_rs911x=true"* ] || [ "$1" =~ *"use_wf200=true"* ]; then USE_WIFI=true diff --git a/third_party/openthread/ot-efr32 b/third_party/openthread/ot-efr32 index 1e10a32228c96f..038475dcc21c51 160000 --- a/third_party/openthread/ot-efr32 +++ b/third_party/openthread/ot-efr32 @@ -1 +1 @@ -Subproject commit 1e10a32228c96f273603612ef7d5ce693ecdf887 +Subproject commit 038475dcc21c51448d35309496a2f7401eb2ccfe diff --git a/third_party/silabs/BUILD.gn b/third_party/silabs/BUILD.gn index 7e885642cdd6f2..552fbe923e352f 100644 --- a/third_party/silabs/BUILD.gn +++ b/third_party/silabs/BUILD.gn @@ -23,6 +23,7 @@ declare_args() { efr32_sdk_target = "" sl_ot_efr32_root = "${chip_root}/third_party/openthread/ot-efr32" sl_openthread_root = "${chip_root}/third_party/openthread/ot-efr32/openthread" + use_thread_coap_lib = false } assert(efr32_sdk_target != "", "efr32_sdk_target must be specified") @@ -131,7 +132,7 @@ if (use_silabs_thread_lib) { ":libopenthread-platform", ":openthread_core_config_efr32", "${segger_rtt_root}:segger_rtt", - "${sl_openthread_root}/include/openthread:openthread-platform", + "${sl_openthread_root}/include/openthread:openthread", "${sl_openthread_root}/src/core/:libopenthread_core_headers", ] @@ -143,10 +144,16 @@ if (use_silabs_thread_lib) { XTD = "mtd" } + # Use silabs openthread library stack with or without coap api enabled + COAP_API = "" + if (use_thread_coap_lib) { + COAP_API = "coap_" + } + public_configs += [ "${sl_openthread_root}:openthread_${XTD}_config" ] libs = [ - "${sl_ot_efr32_root}/libs/libsl_ot_stack_${XTD}_${efr32_family}_gcc.a", + "${sl_ot_efr32_root}/libs/libsl_ot_stack_${XTD}_${COAP_API}${efr32_family}_gcc.a", "${sl_ot_efr32_root}/libs/libsl_platform_${XTD}_dmp_${efr32_family}_gcc.a", ] } From 0a36d9f3676ae81fb5aaf30fd58f58dbbd6e02c8 Mon Sep 17 00:00:00 2001 From: Tennessee Carmel-Veilleux Date: Wed, 31 Aug 2022 02:17:01 -0400 Subject: [PATCH 15/27] Add missing null checks on PacketBufferHandle::New calls (#22274) - Some callers of PacketBufferHandle::New did not null-check on failure to allocate. This is strongly linked to some crashes Fixes #22262 This PR: - Adds missing null checks required by API contract Testing done: - Unit tests still pass - Conditions under which a crash previously occured no longer see a crash occur in manual testing against a real DUT --- examples/chip-tool/commands/pairing/CloseSessionCommand.cpp | 4 +++- src/app/BufferedReadCallback.cpp | 1 + src/app/ClusterStateCache.cpp | 1 + src/protocols/secure_channel/PairingSession.h | 5 ++++- src/setup_payload/AdditionalDataPayloadGenerator.cpp | 4 +++- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/examples/chip-tool/commands/pairing/CloseSessionCommand.cpp b/examples/chip-tool/commands/pairing/CloseSessionCommand.cpp index 6509c84922a270..0eb95540c039c3 100644 --- a/examples/chip-tool/commands/pairing/CloseSessionCommand.cpp +++ b/examples/chip-tool/commands/pairing/CloseSessionCommand.cpp @@ -44,7 +44,9 @@ CHIP_ERROR CloseSessionCommand::CloseSession(Messaging::ExchangeManager & exchan SecureChannel::kProtocolCodeCloseSession); size_t reportSize = statusReport.Size(); - Encoding::LittleEndian::PacketBufferWriter bbuf(MessagePacketBuffer::New(reportSize), reportSize); + auto packetBuffer = MessagePacketBuffer::New(reportSize); + VerifyOrReturnError(!packetBuffer.IsNull(), CHIP_ERROR_NO_MEMORY); + Encoding::LittleEndian::PacketBufferWriter bbuf(std::move(packetBuffer), reportSize); statusReport.WriteToBuffer(bbuf); System::PacketBufferHandle msg = bbuf.Finalize(); diff --git a/src/app/BufferedReadCallback.cpp b/src/app/BufferedReadCallback.cpp index e1188a4c268ebb..3251d924c7c7b0 100644 --- a/src/app/BufferedReadCallback.cpp +++ b/src/app/BufferedReadCallback.cpp @@ -117,6 +117,7 @@ CHIP_ERROR BufferedReadCallback::BufferListItem(TLV::TLVReader & reader) // we can improve this. // handle = System::PacketBufferHandle::New(chip::app::kMaxSecureSduLengthBytes); + VerifyOrReturnError(!handle.IsNull(), CHIP_ERROR_NO_MEMORY); writer.Init(std::move(handle), false); diff --git a/src/app/ClusterStateCache.cpp b/src/app/ClusterStateCache.cpp index 8dc38301bad74d..acb6a0623db140 100644 --- a/src/app/ClusterStateCache.cpp +++ b/src/app/ClusterStateCache.cpp @@ -128,6 +128,7 @@ CHIP_ERROR ClusterStateCache::UpdateEventCache(const EventHeader & aEventHeader, return CHIP_NO_ERROR; } System::PacketBufferHandle handle = System::PacketBufferHandle::New(chip::app::kMaxSecureSduLengthBytes); + VerifyOrReturnError(!handle.IsNull(), CHIP_ERROR_NO_MEMORY); System::PacketBufferTLVWriter writer; writer.Init(std::move(handle), false); diff --git a/src/protocols/secure_channel/PairingSession.h b/src/protocols/secure_channel/PairingSession.h index e220346e11b4a6..78e7727eb2f55e 100644 --- a/src/protocols/secure_channel/PairingSession.h +++ b/src/protocols/secure_channel/PairingSession.h @@ -142,7 +142,10 @@ class DLL_EXPORT PairingSession : public SessionDelegate Protocols::SecureChannel::StatusReport statusReport(generalCode, Protocols::SecureChannel::Id, protocolCode); - Encoding::LittleEndian::PacketBufferWriter bbuf(System::PacketBufferHandle::New(statusReport.Size())); + auto handle = System::PacketBufferHandle::New(statusReport.Size()); + VerifyOrReturn(!handle.IsNull(), ChipLogError(SecureChannel, "Failed to allocate status report message")); + Encoding::LittleEndian::PacketBufferWriter bbuf(std::move(handle)); + statusReport.WriteToBuffer(bbuf); System::PacketBufferHandle msg = bbuf.Finalize(); diff --git a/src/setup_payload/AdditionalDataPayloadGenerator.cpp b/src/setup_payload/AdditionalDataPayloadGenerator.cpp index b293fc25ce7b15..f223d1df4b9e3a 100644 --- a/src/setup_payload/AdditionalDataPayloadGenerator.cpp +++ b/src/setup_payload/AdditionalDataPayloadGenerator.cpp @@ -53,7 +53,9 @@ AdditionalDataPayloadGenerator::generateAdditionalDataPayload(AdditionalDataPayl TLVWriter innerWriter; // Initialize TLVWriter - writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize)); + auto tempBuffer = chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize); + VerifyOrReturnError(!tempBuffer.IsNull(), CHIP_ERROR_NO_MEMORY); + writer.Init(std::move(tempBuffer)); ReturnErrorOnFailure(writer.OpenContainer(AnonymousTag(), kTLVType_Structure, innerWriter)); From 1dc0b35d6dde8f5a582251c4f0a16d8d79666e14 Mon Sep 17 00:00:00 2001 From: kowsisoundhar12 <57476670+kowsisoundhar12@users.noreply.github.com> Date: Wed, 31 Aug 2022 20:01:16 +0530 Subject: [PATCH 16/27] Test added aug29 (#22234) * Aded Updated Manual scripts * Added Auto generated file * Restyled by clang-format * Added Ajuto generated file * Restyled by clang-format * Added Auto generated File * Restyled by clang-format * Added updated DGGEN 3.1 scripts * Added Auto generated file * Restyled by clang-format * Added Auto generated file * Restyled by clang-format Co-authored-by: Restyled.io --- .../suites/certification/Test_TC_BR_4.yaml | 30 +- .../certification/Test_TC_CNET_4_9.yaml | 2 +- .../suites/certification/Test_TC_DA_1_1.yaml | 34 +- .../certification/Test_TC_DGETH_3_1.yaml | 2 +- .../certification/Test_TC_DGGEN_2_2.yaml | 3 +- .../certification/Test_TC_DGGEN_3_1.yaml | 609 ++++-------- .../certification/Test_TC_DGSW_3_1.yaml | 27 +- .../certification/Test_TC_DGSW_3_2.yaml | 2 +- .../certification/Test_TC_DGTHREAD_3_1.yaml | 2 +- .../certification/Test_TC_DRLK_2_1.yaml | 16 +- .../certification/Test_TC_DRLK_2_10.yaml | 1 - .../certification/Test_TC_DRLK_3_3.yaml | 1 - .../suites/certification/Test_TC_IDM_4_2.yaml | 15 +- .../suites/certification/Test_TC_IDM_8_1.yaml | 924 +++++++++--------- .../certification/Test_TC_LCFG_2_1.yaml | 80 +- .../suites/certification/Test_TC_LVL_7_1.yaml | 61 +- .../certification/Test_TC_SWTCH_3_2.yaml | 1 - .../certification/Test_TC_TSUIC_3_1.yaml | 52 +- 18 files changed, 805 insertions(+), 1057 deletions(-) diff --git a/src/app/tests/suites/certification/Test_TC_BR_4.yaml b/src/app/tests/suites/certification/Test_TC_BR_4.yaml index 298ed854fb7598..ff5b5fa052e1ad 100644 --- a/src/app/tests/suites/certification/Test_TC_BR_4.yaml +++ b/src/app/tests/suites/certification/Test_TC_BR_4.yaml @@ -1724,19 +1724,19 @@ tests: [1659973152.263905][3652:3652] CHIP:IM: Received Read request [1659973152.264002][3652:3652] CHIP:DMG: ReadRequestMessage = [1659973152.264053][3652:3652] CHIP:DMG: { - [1659973152.264083][3652:3652] CHIP:DMG: AttributePathIBs = - [1659973152.264130][3652:3652] CHIP:DMG: [ - [1659973152.264163][3652:3652] CHIP:DMG: AttributePathIB = - [1659973152.264214][3652:3652] CHIP:DMG: { - [1659973152.264255][3652:3652] CHIP:DMG: Endpoint = 0x3, - [1659973152.264308][3652:3652] CHIP:DMG: Cluster = 0x6, - [1659973152.264350][3652:3652] CHIP:DMG: Attribute = 0x0000_0000, - [1659973152.264404][3652:3652] CHIP:DMG: } + [1659973152.264083][3652:3652] CHIP:DMG: AttributePathIBs = + [1659973152.264130][3652:3652] CHIP:DMG: [ + [1659973152.264163][3652:3652] CHIP:DMG: AttributePathIB = + [1659973152.264214][3652:3652] CHIP:DMG: { + [1659973152.264255][3652:3652] CHIP:DMG: Endpoint = 0x3, + [1659973152.264308][3652:3652] CHIP:DMG: Cluster = 0x6, + [1659973152.264350][3652:3652] CHIP:DMG: Attribute = 0x0000_0000, + [1659973152.264404][3652:3652] CHIP:DMG: } [1659973152.264457][3652:3652] CHIP:DMG: - [1659973152.264494][3652:3652] CHIP:DMG: ], + [1659973152.264494][3652:3652] CHIP:DMG: ], [1659973152.264541][3652:3652] CHIP:DMG: - [1659973152.264577][3652:3652] CHIP:DMG: isFabricFiltered = true, - [1659973152.264622][3652:3652] CHIP:DMG: InteractionModelRevision = 1 + [1659973152.264577][3652:3652] CHIP:DMG: isFabricFiltered = true, + [1659973152.264622][3652:3652] CHIP:DMG: InteractionModelRevision = 1 [1659973152.264654][3652:3652] CHIP:DMG: }, [1659973152.264756][3652:3652] CHIP:DMG: IM RH moving to [GeneratingReports] [1659973152.264871][3652:3652] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 @@ -1919,7 +1919,7 @@ tests: [1659973028.617533][3652:3652] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 [1659973028.617572][3652:3652] CHIP:DMG: Cluster 39, Attribute 5 is dirty - Verify on DUT(chip-tool) Log + Verify on TH(chip-tool) Log "b [1659089470.077297][12236:12241] CHIP:DL: Device[Light 1]: New Name=""Light 1b"" @@ -1953,7 +1953,7 @@ tests: - label: "Verify DUT contains the added device in the list of devices" PICS: MCORE.DEVLIST.UseDeviceNames verification: | - Verify on DUT(chip-tool) Log + Verify on TH(chip-tool) Log b @@ -2073,7 +2073,7 @@ tests: - label: "Verify DUT contains the added device in the list of devices" PICS: MCORE.DEVLIST.UseDevices verification: | - Verify on DUT(chip-tool) Log + Verify on TH(chip-tool) Log 2 [1659352274.915018][14237:14242] CHIP:DMG: Endpoint 1, Cluster 0x0000_001D update version to 7e918bae @@ -2141,7 +2141,7 @@ tests: devices" PICS: MCORE.DEVLIST.UseDevices verification: | - Verify on DUT(chip-tool) Log + Verify on TH(chip-tool) Log 4 [1659352426.184434][14237:14242] CHIP:DMG: Endpoint 1, Cluster 0x0000_001D update version to 7e918baf diff --git a/src/app/tests/suites/certification/Test_TC_CNET_4_9.yaml b/src/app/tests/suites/certification/Test_TC_CNET_4_9.yaml index 4a1dfefa8cd73e..7f814d445035cb 100644 --- a/src/app/tests/suites/certification/Test_TC_CNET_4_9.yaml +++ b/src/app/tests/suites/certification/Test_TC_CNET_4_9.yaml @@ -90,7 +90,7 @@ tests: [1653478044.911109][30351:30356] CHIP:TOO: Networks: 1 entries [1653478044.911192][30351:30356] CHIP:TOO: [1]: { [1653478044.911238][30351:30356] CHIP:TOO: NetworkID: 47524C50726976617465 - [1653478044.911280][30351:30356] CHIP:TOO: Connected: FALSE + [1653478044.911280][30351:30356] CHIP:TOO: Connected: TRUE [1653478044.911322][30351:30356] CHIP:TOO: } [1653478044.911474][30351:30356] CHIP:EM: Sending Standalone Ack for MessageCounter:3575760 on exchange 51774i disabled: true diff --git a/src/app/tests/suites/certification/Test_TC_DA_1_1.yaml b/src/app/tests/suites/certification/Test_TC_DA_1_1.yaml index 486bdf4bc9a00f..543111e93f45ce 100644 --- a/src/app/tests/suites/certification/Test_TC_DA_1_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DA_1_1.yaml @@ -41,6 +41,23 @@ tests: "TH1 does a non-fabric filtered read of the NOCs attribute from the Node Operational Credentials cluster and saves the returned list as noc_th1" + verification: | + ./chip-tool operationalcredentials read nocs 1 0 + + Verify there is single entry and Fabric ID matches FabricID of TH1 on TH(chip-tool) log: + + [1658392350.745452][3254:3259] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0000 DataVersion: 1660110003 + [1658392350.748972][3254:3259] CHIP:TOO: NOCs: 1 entries + [1658392350.749041][3254:3259] CHIP:TOO: [1]: { + [1658392350.749086][3254:3259] CHIP:TOO: Noc: 1530010101240201370324130118260480228127260580254D3A37062415012411011824070124080130094104C983D16057AA6B80F551CE7686F96EA2D2C0787A2C22B1D746B13A85C67A2BEAAF9485C72F12F770D59FC0E1FF59D21EF988209249C07B229F84CFD4F51E9611370A3501280118240201360304020401183004142BC90AF48A63F83F7E8F2BAFB6703795028429BB3005149B9F5879F33019C19B6796BD02FD13D044E2AA2818300B4061D02714DC750BE3524C8DE04AFC971CC1B25AE98C366809D1257052B91DA6B252A3CF035DD55980B4E3C865FD933B2F19151379122A50599E8A869A0EC29AD318 + [1658392350.749133][3254:3259] CHIP:TOO: Icac: 1530010100240201370324140018260480228127260580254D3A37062413011824070124080130094104AD24B19A35BD1B1808EFF5F46C6D3AC98B57FF0F55BC5AF7BB6B09905A1B66AD1DFBC2511EBF4DC40033A4676EF056A498F599DA98507A14F82490D6EE0B22C5370A35012901182402603004149B9F5879F33019C19B6796BD02FD13D044E2AA283005141590E75A2828F170F5670E51629ACFF8E4D37B9218300B40FACB9C9CD92EB1C595C21C17371E15D1E2F7F58CF3E9A17636CDEDAF1EF18D6F88CB0C3D45682FDEBEA58F5926DCC72872DB545B77F4961292B849D05AA659AF18 + [1658392350.749168][3254:3259] CHIP:TOO: FabricIndex: 1 + [1658392350.749194][3254:3259] CHIP:TOO: } + disabled: true + + - label: + "TH1 does a non-fabric-filtered read of the Fabrics attribute from the + Node Operational Credentials cluster" verification: | ./chip-tool operationalcredentials read fabrics 1 0 @@ -58,23 +75,6 @@ tests: [1655471672.386750][13377:13382] CHIP:TOO: } disabled: true - - label: - "TH1 does a non-fabric-filtered read of the Fabrics attribute from the - Node Operational Credentials cluster" - verification: | - ./chip-tool operationalcredentials read nocs 1 0 - - Verify there is single entry and Fabric ID matches FabricID of TH1 on TH(chip-tool) log: - - [1658392350.745452][3254:3259] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0000 DataVersion: 1660110003 - [1658392350.748972][3254:3259] CHIP:TOO: NOCs: 1 entries - [1658392350.749041][3254:3259] CHIP:TOO: [1]: { - [1658392350.749086][3254:3259] CHIP:TOO: Noc: 1530010101240201370324130118260480228127260580254D3A37062415012411011824070124080130094104C983D16057AA6B80F551CE7686F96EA2D2C0787A2C22B1D746B13A85C67A2BEAAF9485C72F12F770D59FC0E1FF59D21EF988209249C07B229F84CFD4F51E9611370A3501280118240201360304020401183004142BC90AF48A63F83F7E8F2BAFB6703795028429BB3005149B9F5879F33019C19B6796BD02FD13D044E2AA2818300B4061D02714DC750BE3524C8DE04AFC971CC1B25AE98C366809D1257052B91DA6B252A3CF035DD55980B4E3C865FD933B2F19151379122A50599E8A869A0EC29AD318 - [1658392350.749133][3254:3259] CHIP:TOO: Icac: 1530010100240201370324140018260480228127260580254D3A37062413011824070124080130094104AD24B19A35BD1B1808EFF5F46C6D3AC98B57FF0F55BC5AF7BB6B09905A1B66AD1DFBC2511EBF4DC40033A4676EF056A498F599DA98507A14F82490D6EE0B22C5370A35012901182402603004149B9F5879F33019C19B6796BD02FD13D044E2AA283005141590E75A2828F170F5670E51629ACFF8E4D37B9218300B40FACB9C9CD92EB1C595C21C17371E15D1E2F7F58CF3E9A17636CDEDAF1EF18D6F88CB0C3D45682FDEBEA58F5926DCC72872DB545B77F4961292B849D05AA659AF18 - [1658392350.749168][3254:3259] CHIP:TOO: FabricIndex: 1 - [1658392350.749194][3254:3259] CHIP:TOO: } - disabled: true - - label: "Factory reset DUT Perform the device discovery flow checks as covered in TC-DD-2.2" diff --git a/src/app/tests/suites/certification/Test_TC_DGETH_3_1.yaml b/src/app/tests/suites/certification/Test_TC_DGETH_3_1.yaml index 736ff0899969c0..9d6ce69da622cc 100644 --- a/src/app/tests/suites/certification/Test_TC_DGETH_3_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGETH_3_1.yaml @@ -232,7 +232,7 @@ tests: verification: | ./chip-tool ethernetnetworkdiagnostics read overrun-count 1 0 - Verify on TH(all-clusters-app) Log + Verify the value of OverrunCount is in range uint64 on TH(all-clusters-app) Log [1659971467.437214][3458:3458] CHIP:IM: Received Read request [1659971467.437292][3458:3458] CHIP:DMG: ReadRequestMessage = diff --git a/src/app/tests/suites/certification/Test_TC_DGGEN_2_2.yaml b/src/app/tests/suites/certification/Test_TC_DGGEN_2_2.yaml index e9426841124b86..3d863c10062229 100644 --- a/src/app/tests/suites/certification/Test_TC_DGGEN_2_2.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGGEN_2_2.yaml @@ -30,8 +30,7 @@ tests: "NOTE: https://github.com/project-chip/connectedhomeip/tree/master/examples/all-clusters-app/linux#readme Events to be executed as following 1. Compile app using below command in connectedhomeip folder - a. ./scripts/run_in_build_env.sh ""./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-clang build"" - b. ./scripts/run_in_build_env.sh ""./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-libfuzzer-clang build"" + a. ./scripts/run_in_build_env.sh "./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-clang build" 2. Build respective app (all-clusters-app) 3. Commission DUT to TH 4. Open 2nd terminal of DUT and provide the below command to obtain PID of DUT diff --git a/src/app/tests/suites/certification/Test_TC_DGGEN_3_1.yaml b/src/app/tests/suites/certification/Test_TC_DGGEN_3_1.yaml index d9bac3b570cf3a..1568bc776cdcc2 100644 --- a/src/app/tests/suites/certification/Test_TC_DGGEN_3_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGGEN_3_1.yaml @@ -26,7 +26,7 @@ config: tests: - label: "Note" verification: | - Chip-tool command used below are an example to verify the DUT as client test cases. For certification test, we expect DUT should have a capability or way to run the equivalent command. + For DUT as client test cases, Chip-tool command used below are an example to verify the functionality. For certification test, we expect DUT should have a capability or way to run the equivalent command. disabled: true - label: "Commission TH to DUT" @@ -44,189 +44,28 @@ tests: verify that list of supported NetworkInterfaces structures, Structure data includes Name, IsOperational, OffPremiseServicesReachableIPv4, OffPremiseServicesReachableIPv6, HardwareAddress, IPv4Addresses, IPv6Addresses and type on TH(all-clusters-app) - 1659772635.992784][17263:17263] CHIP:DMG: } - [1659772635.992786][17263:17263] CHIP:DMG: - [1659772635.992848][17263:17263] CHIP:DMG: ReportDataMessage = - [1659772635.992851][17263:17263] CHIP:DMG: { - [1659772635.992853][17263:17263] CHIP:DMG: AttributeReportIBs = - [1659772635.992858][17263:17263] CHIP:DMG: [ - [1659772635.992860][17263:17263] CHIP:DMG: AttributeReportIB = - [1659772635.992865][17263:17263] CHIP:DMG: { - [1659772635.992868][17263:17263] CHIP:DMG: AttributeDataIB = - [1659772635.992871][17263:17263] CHIP:DMG: { - [1659772635.992874][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659772635.992877][17263:17263] CHIP:DMG: AttributePathIB = - [1659772635.992880][17263:17263] CHIP:DMG: { - [1659772635.992885][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659772635.992890][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659772635.992894][17263:17263] CHIP:DMG: Attribute = 0x0000_0000, - [1659772635.992898][17263:17263] CHIP:DMG: } - [1659772635.992902][17263:17263] CHIP:DMG: - [1659772635.992906][17263:17263] CHIP:DMG: Data = [ - [1659772635.992910][17263:17263] CHIP:DMG: - [1659772635.992914][17263:17263] CHIP:DMG: ], - [1659772635.992918][17263:17263] CHIP:DMG: }, - [1659772635.992923][17263:17263] CHIP:DMG: - [1659772635.992926][17263:17263] CHIP:DMG: }, - [1659772635.992935][17263:17263] CHIP:DMG: - [1659772635.992939][17263:17263] CHIP:DMG: AttributeReportIB = - [1659772635.992946][17263:17263] CHIP:DMG: { - [1659772635.992949][17263:17263] CHIP:DMG: AttributeDataIB = - [1659772635.992953][17263:17263] CHIP:DMG: { - [1659772635.992957][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659772635.992960][17263:17263] CHIP:DMG: AttributePathIB = - [1659772635.992964][17263:17263] CHIP:DMG: { - [1659772635.992968][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659772635.992973][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659772635.992977][17263:17263] CHIP:DMG: Attribute = 0x0000_0000, - [1659772635.992981][17263:17263] CHIP:DMG: ListIndex = Null, - [1659772635.992986][17263:17263] CHIP:DMG: } - [1659772635.992990][17263:17263] CHIP:DMG: - [1659772635.992994][17263:17263] CHIP:DMG: Data = - [1659772635.992998][17263:17263] CHIP:DMG: { - [1659772635.993003][17263:17263] CHIP:DMG: 0x0 = "docker0" (7 chars), - [1659772635.993007][17263:17263] CHIP:DMG: 0x1 = false, - [1659772635.993012][17263:17263] CHIP:DMG: 0x2 = NULL - [1659772635.993016][17263:17263] CHIP:DMG: 0x3 = NULL - [1659772635.993021][17263:17263] CHIP:DMG: 0x4 = [ - [1659772635.993025][17263:17263] CHIP:DMG: 0x2, 0x42, 0x2d, 0x7f, 0xa5, 0x93, - [1659772635.993031][17263:17263] CHIP:DMG: ] (6 bytes) - [1659772635.993035][17263:17263] CHIP:DMG: 0x5 = [ - [1659772635.993041][17263:17263] CHIP:DMG: [ - [1659772635.993045][17263:17263] CHIP:DMG: 0xac, 0x11, 0x0, 0x1, - [1659772635.993051][17263:17263] CHIP:DMG: ] (4 bytes) - [1659772635.993057][17263:17263] CHIP:DMG: ], - [1659772635.993060][17263:17263] CHIP:DMG: 0x6 = [ - [1659772635.993064][17263:17263] CHIP:DMG: [ - [1659772635.993068][17263:17263] CHIP:DMG: - [1659772635.993074][17263:17263] CHIP:DMG: ] (0 bytes) - [1659772635.993080][17263:17263] CHIP:DMG: ], - [1659772635.993084][17263:17263] CHIP:DMG: 0x7 = 0, - [1659772635.993088][17263:17263] CHIP:DMG: }, - [1659772635.993091][17263:17263] CHIP:DMG: }, - [1659772635.993098][17263:17263] CHIP:DMG: - [1659772635.993101][17263:17263] CHIP:DMG: }, - [1659772635.993113][17263:17263] CHIP:DMG: - [1659772635.993116][17263:17263] CHIP:DMG: AttributeReportIB = - [1659772635.993125][17263:17263] CHIP:DMG: { - [1659772635.993128][17263:17263] CHIP:DMG: AttributeDataIB = - [1659772635.993131][17263:17263] CHIP:DMG: { - [1659772635.993135][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659772635.993139][17263:17263] CHIP:DMG: AttributePathIB = - [1659772635.993143][17263:17263] CHIP:DMG: { - [1659772635.993146][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659772635.993150][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659772635.993154][17263:17263] CHIP:DMG: Attribute = 0x0000_0000, - [1659772635.993159][17263:17263] CHIP:DMG: ListIndex = Null, - [1659772635.993163][17263:17263] CHIP:DMG: } - [1659772635.993167][17263:17263] CHIP:DMG: - [1659772635.993171][17263:17263] CHIP:DMG: Data = - [1659772635.993175][17263:17263] CHIP:DMG: { - [1659772635.993179][17263:17263] CHIP:DMG: 0x0 = "wlp0s20f3" (9 chars), - [1659772635.993183][17263:17263] CHIP:DMG: 0x1 = true, - [1659772635.993188][17263:17263] CHIP:DMG: 0x2 = NULL - [1659772635.993193][17263:17263] CHIP:DMG: 0x3 = NULL - [1659772635.993197][17263:17263] CHIP:DMG: 0x4 = [ - [1659772635.993202][17263:17263] CHIP:DMG: 0x8, 0x71, 0x90, 0x45, 0x8b, 0x2f, - [1659772635.993207][17263:17263] CHIP:DMG: ] (6 bytes) - [1659772635.993211][17263:17263] CHIP:DMG: 0x5 = [ - [1659772635.993216][17263:17263] CHIP:DMG: [ - [1659772635.993220][17263:17263] CHIP:DMG: 0xc0, 0xa8, 0x64, 0xa, - [1659772635.993226][17263:17263] CHIP:DMG: ] (4 bytes) - [1659772635.993231][17263:17263] CHIP:DMG: ], - [1659772635.993235][17263:17263] CHIP:DMG: 0x6 = [ - [1659772635.993239][17263:17263] CHIP:DMG: [ - [1659772635.993246][17263:17263] CHIP:DMG: 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0xd5, 0x79, 0x10, 0xe8, 0x45, 0xb5, - [1659772635.993252][17263:17263] CHIP:DMG: ] (16 bytes) - [1659772635.993257][17263:17263] CHIP:DMG: ], - [1659772635.993261][17263:17263] CHIP:DMG: 0x7 = 1, - [1659772635.993264][17263:17263] CHIP:DMG: }, - [1659772635.993268][17263:17263] CHIP:DMG: }, - [1659772635.993275][17263:17263] CHIP:DMG: - [1659772635.993278][17263:17263] CHIP:DMG: }, - [1659772635.993289][17263:17263] CHIP:DMG: - [1659772635.993292][17263:17263] CHIP:DMG: AttributeReportIB = - [1659772635.993299][17263:17263] CHIP:DMG: { - [1659772635.993302][17263:17263] CHIP:DMG: AttributeDataIB = - [1659772635.993306][17263:17263] CHIP:DMG: { - [1659772635.993310][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659772635.993314][17263:17263] CHIP:DMG: AttributePathIB = - [1659772635.993317][17263:17263] CHIP:DMG: { - [1659772635.993321][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659772635.993326][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659772635.993330][17263:17263] CHIP:DMG: Attribute = 0x0000_0000, - [1659772635.993335][17263:17263] CHIP:DMG: ListIndex = Null, - [1659772635.993338][17263:17263] CHIP:DMG: } - [1659772635.993343][17263:17263] CHIP:DMG: - [1659772635.993347][17263:17263] CHIP:DMG: Data = - [1659772635.993351][17263:17263] CHIP:DMG: { - [1659772635.993355][17263:17263] CHIP:DMG: 0x0 = "enp3s0" (6 chars), - [1659772635.993359][17263:17263] CHIP:DMG: 0x1 = true, - [1659772635.993363][17263:17263] CHIP:DMG: 0x2 = NULL - [1659772635.993367][17263:17263] CHIP:DMG: 0x3 = NULL - [1659772635.993372][17263:17263] CHIP:DMG: 0x4 = [ - [1659772635.993376][17263:17263] CHIP:DMG: 0xe4, 0x54, 0xe8, 0x15, 0x1d, 0xb3, - [1659772635.993382][17263:17263] CHIP:DMG: ] (6 bytes) - [1659772635.993385][17263:17263] CHIP:DMG: 0x5 = [ - [1659772635.993390][17263:17263] CHIP:DMG: [ - [1659772635.993394][17263:17263] CHIP:DMG: 0xc0, 0xa8, 0x64, 0xb, - [1659772635.993400][17263:17263] CHIP:DMG: ] (4 bytes) - [1659772635.993406][17263:17263] CHIP:DMG: ], - [1659772635.993410][17263:17263] CHIP:DMG: 0x6 = [ - [1659772635.993414][17263:17263] CHIP:DMG: [ - [1659772635.993420][17263:17263] CHIP:DMG: 0xfe, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x54, 0xe8, 0xff, 0xfe, 0x15, 0x1d, 0xb3, - [1659772635.993426][17263:17263] CHIP:DMG: ] (16 bytes) - [1659772635.993430][17263:17263] CHIP:DMG: ], - [1659772635.993434][17263:17263] CHIP:DMG: 0x7 = 2, - [1659772635.993438][17263:17263] CHIP:DMG: }, - [1659772635.993442][17263:17263] CHIP:DMG: }, - [1659772635.993450][17263:17263] CHIP:DMG: - [1659772635.993453][17263:17263] CHIP:DMG: }, - [1659772635.993463][17263:17263] CHIP:DMG: - [1659772635.993466][17263:17263] CHIP:DMG: AttributeReportIB = - [1659772635.993474][17263:17263] CHIP:DMG: { - [1659772635.993477][17263:17263] CHIP:DMG: AttributeDataIB = - [1659772635.993480][17263:17263] CHIP:DMG: { - [1659772635.993484][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659772635.993488][17263:17263] CHIP:DMG: AttributePathIB = - [1659772635.993492][17263:17263] CHIP:DMG: { - [1659772635.993496][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659772635.993501][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659772635.993505][17263:17263] CHIP:DMG: Attribute = 0x0000_0000, - [1659772635.993509][17263:17263] CHIP:DMG: ListIndex = Null, - [1659772635.993513][17263:17263] CHIP:DMG: } - [1659772635.993517][17263:17263] CHIP:DMG: - [1659772635.993521][17263:17263] CHIP:DMG: Data = - [1659772635.993525][17263:17263] CHIP:DMG: { - [1659772635.993529][17263:17263] CHIP:DMG: 0x0 = "lo" (2 chars), - [1659772635.993534][17263:17263] CHIP:DMG: 0x1 = true, - [1659772635.993538][17263:17263] CHIP:DMG: 0x2 = NULL - [1659772635.993542][17263:17263] CHIP:DMG: 0x3 = NULL - [1659772635.993545][17263:17263] CHIP:DMG: 0x4 = [ - [1659772635.993550][17263:17263] CHIP:DMG: 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - [1659772635.993556][17263:17263] CHIP:DMG: ] (6 bytes) - [1659772635.993559][17263:17263] CHIP:DMG: 0x5 = [ - [1659772635.993565][17263:17263] CHIP:DMG: [ - [1659772635.993570][17263:17263] CHIP:DMG: 0x7f, 0x0, 0x0, 0x1, - [1659772635.993575][17263:17263] CHIP:DMG: ] (4 bytes) - [1659772635.993579][17263:17263] CHIP:DMG: ], - [1659772635.993583][17263:17263] CHIP:DMG: 0x6 = [ - [1659772635.993587][17263:17263] CHIP:DMG: [ - [1659772635.993594][17263:17263] CHIP:DMG: 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - [1659772635.993600][17263:17263] CHIP:DMG: ] (16 bytes) - [1659772635.993605][17263:17263] CHIP:DMG: ], - [1659772635.993609][17263:17263] CHIP:DMG: 0x7 = 0, - [1659772635.993613][17263:17263] CHIP:DMG: }, - [1659772635.993617][17263:17263] CHIP:DMG: }, - [1659772635.993623][17263:17263] CHIP:DMG: - [1659772635.993627][17263:17263] CHIP:DMG: }, - [1659772635.993634][17263:17263] CHIP:DMG: - [1659772635.993637][17263:17263] CHIP:DMG: ], - [1659772635.993656][17263:17263] CHIP:DMG: - [1659772635.993659][17263:17263] CHIP:DMG: SuppressResponse = true, - [1659772635.993662][17263:17263] CHIP:DMG: InteractionModelRevision = 1 - [1659772635.993665][17263:17263] CHIP:DMG: } - [1659772635.993669][17263:17263] CHIP:DMG: + ReadRequestMessage = + [1661421334.265953][2362:2362] CHIP:DMG: { + [1661421334.266009][2362:2362] CHIP:DMG: AttributePathIBs = + [1661421334.266074][2362:2362] CHIP:DMG: [ + [1661421334.266135][2362:2362] CHIP:DMG: AttributePathIB = + [1661421334.266206][2362:2362] CHIP:DMG: { + [1661421334.266288][2362:2362] CHIP:DMG: Endpoint = 0x0, + [1661421334.266370][2362:2362] CHIP:DMG: Cluster = 0x33, + [1661421334.266450][2362:2362] CHIP:DMG: Attribute = 0x0000_0000, + [1661421334.266528][2362:2362] CHIP:DMG: } + [1661421334.266605][2362:2362] CHIP:DMG: + [1661421334.266675][2362:2362] CHIP:DMG: ], + [1661421334.266748][2362:2362] CHIP:DMG: + [1661421334.266814][2362:2362] CHIP:DMG: isFabricFiltered = true, + [1661421334.266884][2362:2362] CHIP:DMG: InteractionModelRevision = 1 + [1661421334.266944][2362:2362] CHIP:DMG: }, + [1661421334.267126][2362:2362] CHIP:DMG: IM RH moving to [GeneratingReports] + [1661421334.267365][2362:2362] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 + [1661421334.267437][2362:2362] CHIP:DMG: Cluster 33, Attribute 0 is dirty + [1661421334.267491][2362:2362] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0000 (expanded=0) + [1661421334.267558][2362:2362] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v + [1661421334.267638][2362:2362] CHIP:DMG: AccessControl: allowed disabled: true - label: @@ -237,40 +76,31 @@ tests: Product maker needs to provide instructions for how to trigger the command on the DUT. For comparison, the DUT behavior for this test step can be simulated using chip-tool (when DUT is a commissioner/Client) ./chip-tool generaldiagnostics read reboot-count 1 0 - Verify in DUT as client side: verify that RebootCount attribute data type must be UINT16 and the count should match with the number of rebooted times. - - [1659772809.009830][17263:17263] CHIP:DMG: buffer_ptr = 94267919976192 - [1659772809.009842][17263:17263] CHIP:DMG: } - [1659772809.009854][17263:17263] CHIP:DMG: - [1659772809.009924][17263:17263] CHIP:DMG: ReportDataMessage = - [1659772809.009939][17263:17263] CHIP:DMG: { - [1659772809.009951][17263:17263] CHIP:DMG: AttributeReportIBs = - [1659772809.009973][17263:17263] CHIP:DMG: [ - [1659772809.009987][17263:17263] CHIP:DMG: AttributeReportIB = - [1659772809.010008][17263:17263] CHIP:DMG: { - [1659772809.010022][17263:17263] CHIP:DMG: AttributeDataIB = - [1659772809.010036][17263:17263] CHIP:DMG: { - [1659772809.010052][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659772809.010068][17263:17263] CHIP:DMG: AttributePathIB = - [1659772809.010084][17263:17263] CHIP:DMG: { - [1659772809.010107][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659772809.010124][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659772809.010141][17263:17263] CHIP:DMG: Attribute = 0x0000_0001, - [1659772809.010156][17263:17263] CHIP:DMG: } - [1659772809.010173][17263:17263] CHIP:DMG: - [1659772809.010190][17263:17263] CHIP:DMG: Data = 2, - [1659772809.010205][17263:17263] CHIP:DMG: }, - [1659772809.010223][17263:17263] CHIP:DMG: - [1659772809.010236][17263:17263] CHIP:DMG: }, - [1659772809.010256][17263:17263] CHIP:DMG: - [1659772809.010269][17263:17263] CHIP:DMG: ], - [1659772809.010289][17263:17263] CHIP:DMG: - [1659772809.010303][17263:17263] CHIP:DMG: SuppressResponse = true, - [1659772809.010315][17263:17263] CHIP:DMG: InteractionModelRevision = 1 - [1659772809.010327][17263:17263] CHIP:DMG: } - [1659772809.010340][17263:17263] CHIP:DMG: - [1659772809.010472][17263:17263] CHIP:DMG: OnReportConfirm: NumReports = 0 - [1659772809.010651][17263:17263] CHIP:DMG: ReportsIn + verify that RebootCount attribute data type must be UINT16 and the count should match with the number of rebooted times on TH(all-clusters-app). + + Received Read request + [1661421488.051680][2362:2362] CHIP:DMG: ReadRequestMessage = + [1661421488.051755][2362:2362] CHIP:DMG: { + [1661421488.051811][2362:2362] CHIP:DMG: AttributePathIBs = + [1661421488.051876][2362:2362] CHIP:DMG: [ + [1661421488.051937][2362:2362] CHIP:DMG: AttributePathIB = + [1661421488.052025][2362:2362] CHIP:DMG: { + [1661421488.052098][2362:2362] CHIP:DMG: Endpoint = 0x0, + [1661421488.052185][2362:2362] CHIP:DMG: Cluster = 0x33, + [1661421488.052266][2362:2362] CHIP:DMG: Attribute = 0x0000_0001, + [1661421488.052355][2362:2362] CHIP:DMG: } + [1661421488.052430][2362:2362] CHIP:DMG: + [1661421488.052496][2362:2362] CHIP:DMG: ], + [1661421488.052570][2362:2362] CHIP:DMG: + [1661421488.052637][2362:2362] CHIP:DMG: isFabricFiltered = true, + [1661421488.052701][2362:2362] CHIP:DMG: InteractionModelRevision = 1 + [1661421488.052763][2362:2362] CHIP:DMG: }, + [1661421488.052936][2362:2362] CHIP:DMG: IM RH moving to [GeneratingReports] + [1661421488.053176][2362:2362] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 + [1661421488.053301][2362:2362] CHIP:DMG: Cluster 33, Attribute 1 is dirty + [1661421488.053361][2362:2362] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0001 (expanded=0) + [1661421488.053431][2362:2362] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v + [1661421488.053510][2362:2362] CHIP:DMG: AccessControl: allowed disabled: true - label: @@ -282,37 +112,30 @@ tests: ./chip-tool generaldiagnostics read up-time 1 0 - Verify in DUT as client side: Verify that UpTime attribute data type must be UINT64 and the time duratoin should be represented in seconds since DUT (node) has been rebooted. - - 659772924.705797][17263:17263] CHIP:DMG: } - [1659772924.705813][17263:17263] CHIP:DMG: - [1659772924.705907][17263:17263] CHIP:DMG: ReportDataMessage = - [1659772924.705928][17263:17263] CHIP:DMG: { - [1659772924.705943][17263:17263] CHIP:DMG: AttributeReportIBs = - [1659772924.705973][17263:17263] CHIP:DMG: [ - [1659772924.705990][17263:17263] CHIP:DMG: AttributeReportIB = - [1659772924.706019][17263:17263] CHIP:DMG: { - [1659772924.706037][17263:17263] CHIP:DMG: AttributeDataIB = - [1659772924.706060][17263:17263] CHIP:DMG: { - [1659772924.706084][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659772924.706105][17263:17263] CHIP:DMG: AttributePathIB = - [1659772924.706128][17263:17263] CHIP:DMG: { - [1659772924.706152][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659772924.706173][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659772924.706195][17263:17263] CHIP:DMG: Attribute = 0x0000_0002, - [1659772924.706221][17263:17263] CHIP:DMG: } - [1659772924.706248][17263:17263] CHIP:DMG: - [1659772924.706273][17263:17263] CHIP:DMG: Data = 804, - [1659772924.706293][17263:17263] CHIP:DMG: }, - [1659772924.706318][17263:17263] CHIP:DMG: - [1659772924.706335][17263:17263] CHIP:DMG: }, - [1659772924.706361][17263:17263] CHIP:DMG: - [1659772924.706375][17263:17263] CHIP:DMG: ], - [1659772924.706401][17263:17263] CHIP:DMG: - [1659772924.706422][17263:17263] CHIP:DMG: SuppressResponse = true, - [1659772924.706441][17263:17263] CHIP:DMG: InteractionModelRevision = 1 - [1659772924.706461][17263:17263] CHIP:DMG: } - [1659772924.706480][17263:17263] CHIP:DMG: + Verify that UpTime attribute data type must be UINT64 and the time duratoin should be represented in seconds since DUT (node) has been rebooted on TH(all-clusters-app). + + ReadRequestMessage = + [1661421563.809563][2362:2362] CHIP:DMG: { + [1661421563.809617][2362:2362] CHIP:DMG: AttributePathIBs = + [1661421563.809681][2362:2362] CHIP:DMG: [ + [1661421563.809741][2362:2362] CHIP:DMG: AttributePathIB = + [1661421563.809812][2362:2362] CHIP:DMG: { + [1661421563.809885][2362:2362] CHIP:DMG: Endpoint = 0x0, + [1661421563.809983][2362:2362] CHIP:DMG: Cluster = 0x33, + [1661421563.810076][2362:2362] CHIP:DMG: Attribute = 0x0000_0002, + [1661421563.810155][2362:2362] CHIP:DMG: } + [1661421563.810228][2362:2362] CHIP:DMG: + [1661421563.810293][2362:2362] CHIP:DMG: ], + [1661421563.810366][2362:2362] CHIP:DMG: + [1661421563.810433][2362:2362] CHIP:DMG: isFabricFiltered = true, + [1661421563.810497][2362:2362] CHIP:DMG: InteractionModelRevision = 1 + [1661421563.810557][2362:2362] CHIP:DMG: }, + [1661421563.810736][2362:2362] CHIP:DMG: IM RH moving to [GeneratingReports] + [1661421563.810990][2362:2362] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 + [1661421563.811066][2362:2362] CHIP:DMG: Cluster 33, Attribute 2 is dirty + [1661421563.811120][2362:2362] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0002 (expanded=0) + [1661421563.811190][2362:2362] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v + [1661421563.811271][2362:2362] CHIP:DMG: AccessControl: allowed disabled: true - label: "DUT reads a TotalOperationalHours attribute value from TH." @@ -321,31 +144,30 @@ tests: Product maker needs to provide instructions for how to trigger the command on the DUT. For comparison, the DUT behavior for this test step can be simulated using chip-tool (when DUT is a commissioner/Client) ./chip-tool generaldiagnostics read total-operational-hours 1 0 - Verify in DUT as client side: verify that TotalOperationalHours attribute data type must be UINT32 and the value indicates the number of hours the node has been operational since DUT (node) has been rebooted. - - [1659971129.330245][3458:3458] CHIP:IM: Received Read request - [1659971129.330322][3458:3458] CHIP:DMG: ReadRequestMessage = - [1659971129.330349][3458:3458] CHIP:DMG: { - [1659971129.330370][3458:3458] CHIP:DMG: AttributePathIBs = - [1659971129.330397][3458:3458] CHIP:DMG: [ - [1659971129.330420][3458:3458] CHIP:DMG: AttributePathIB = - [1659971129.330454][3458:3458] CHIP:DMG: { - [1659971129.330483][3458:3458] CHIP:DMG: Endpoint = 0x0, - [1659971129.330513][3458:3458] CHIP:DMG: Cluster = 0x33, - [1659971129.330545][3458:3458] CHIP:DMG: Attribute = 0x0000_0003, - [1659971129.330574][3458:3458] CHIP:DMG: } - [1659971129.330602][3458:3458] CHIP:DMG: - [1659971129.330626][3458:3458] CHIP:DMG: ], - [1659971129.330654][3458:3458] CHIP:DMG: - [1659971129.330680][3458:3458] CHIP:DMG: isFabricFiltered = true, - [1659971129.330705][3458:3458] CHIP:DMG: InteractionModelRevision = 1 - [1659971129.330727][3458:3458] CHIP:DMG: }, - [1659971129.330800][3458:3458] CHIP:DMG: IM RH moving to [GeneratingReports] - [1659971129.330881][3458:3458] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 - [1659971129.330910][3458:3458] CHIP:DMG: Cluster 33, Attribute 3 is dirty - [1659971129.330931][3458:3458] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0003 (expanded=0) - [1659971129.330958][3458:3458] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v - [1659971129.330990][3458:3458] CHIP:DMG: AccessControl: allowed + verify that TotalOperationalHours attribute data type must be UINT32 and the value indicates the number of hours the node has been operational since DUT (node) has been rebooted on TH(all-clusters-app). + + ReadRequestMessage = + [1661421632.317370][2362:2362] CHIP:DMG: { + [1661421632.317431][2362:2362] CHIP:DMG: AttributePathIBs = + [1661421632.317490][2362:2362] CHIP:DMG: [ + [1661421632.317551][2362:2362] CHIP:DMG: AttributePathIB = + [1661421632.317652][2362:2362] CHIP:DMG: { + [1661421632.317733][2362:2362] CHIP:DMG: Endpoint = 0x0, + [1661421632.317830][2362:2362] CHIP:DMG: Cluster = 0x33, + [1661421632.317923][2362:2362] CHIP:DMG: Attribute = 0x0000_0003, + [1661421632.318008][2362:2362] CHIP:DMG: } + [1661421632.318090][2362:2362] CHIP:DMG: + [1661421632.318163][2362:2362] CHIP:DMG: ], + [1661421632.318235][2362:2362] CHIP:DMG: + [1661421632.318304][2362:2362] CHIP:DMG: isFabricFiltered = true, + [1661421632.318368][2362:2362] CHIP:DMG: InteractionModelRevision = 1 + [1661421632.318428][2362:2362] CHIP:DMG: }, + [1661421632.318615][2362:2362] CHIP:DMG: IM RH moving to [GeneratingReports] + [1661421632.318881][2362:2362] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 + [1661421632.318960][2362:2362] CHIP:DMG: Cluster 33, Attribute 3 is dirty + [1661421632.319014][2362:2362] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0003 (expanded=0) + [1661421632.319081][2362:2362] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v + [1661421632.319159][2362:2362] CHIP:DMG: AccessControl: allowed disabled: true - label: @@ -356,82 +178,31 @@ tests: ./chip-tool generaldiagnostics read boot-reasons 1 0 - Verify in DUT as client side: verify that bootreason attribute data type must match the value listed in Table 105 BootReason ENUM table in spec - [1659971157.321998][3458:3458] CHIP:IM: Received Read request - [1659971157.322081][3458:3458] CHIP:DMG: ReadRequestMessage = - [1659971157.322109][3458:3458] CHIP:DMG: { - [1659971157.322133][3458:3458] CHIP:DMG: AttributePathIBs = - [1659971157.322160][3458:3458] CHIP:DMG: [ - [1659971157.322185][3458:3458] CHIP:DMG: AttributePathIB = - [1659971157.322217][3458:3458] CHIP:DMG: { - [1659971157.322247][3458:3458] CHIP:DMG: Endpoint = 0x0, - [1659971157.322280][3458:3458] CHIP:DMG: Cluster = 0x33, - [1659971157.322313][3458:3458] CHIP:DMG: Attribute = 0x0000_0004, - [1659971157.322344][3458:3458] CHIP:DMG: } - [1659971157.322374][3458:3458] CHIP:DMG: - [1659971157.322400][3458:3458] CHIP:DMG: ], - [1659971157.322429][3458:3458] CHIP:DMG: - [1659971157.322456][3458:3458] CHIP:DMG: isFabricFiltered = true, - [1659971157.322483][3458:3458] CHIP:DMG: InteractionModelRevision = 1 - [1659971157.322507][3458:3458] CHIP:DMG: }, - [1659971157.322585][3458:3458] CHIP:DMG: IM RH moving to [GeneratingReports] - [1659971157.322672][3458:3458] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 - [1659971157.322703][3458:3458] CHIP:DMG: Cluster 33, Attribute 4 is dirty - [1659971157.322725][3458:3458] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0004 (expanded=0) - [1659971157.322753][3458:3458] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v - [1659971157.322788][3458:3458] CHIP:DMG: AccessControl: allowed - [1659971157.321998][3458:3458] CHIP:IM: Received Read request - [1659971157.322081][3458:3458] CHIP:DMG: ReadRequestMessage = - [1659971157.322109][3458:3458] CHIP:DMG: { - [1659971157.322133][3458:3458] CHIP:DMG: AttributePathIBs = - [1659971157.322160][3458:3458] CHIP:DMG: [ - [1659971157.322185][3458:3458] CHIP:DMG: AttributePathIB = - [1659971157.322217][3458:3458] CHIP:DMG: { - [1659971157.322247][3458:3458] CHIP:DMG: Endpoint = 0x0, - [1659971157.322280][3458:3458] CHIP:DMG: Cluster = 0x33, - [1659971157.322313][3458:3458] CHIP:DMG: Attribute = 0x0000_0004, - [1659971157.322344][3458:3458] CHIP:DMG: } - [1659971157.322374][3458:3458] CHIP:DMG: - [1659971157.322400][3458:3458] CHIP:DMG: ], - [1659971157.322429][3458:3458] CHIP:DMG: - [1659971157.322456][3458:3458] CHIP:DMG: isFabricFiltered = true, - [1659971157.322483][3458:3458] CHIP:DMG: InteractionModelRevision = 1 - [1659971157.322507][3458:3458] CHIP:DMG: }, - [1659971157.322585][3458:3458] CHIP:DMG: IM RH moving to [GeneratingReports] - [1659971157.322672][3458:3458] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 - [1659971157.322703][3458:3458] CHIP:DMG: Cluster 33, Attribute 4 is dirty - [1659971157.322725][3458:3458] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0004 (expanded=0) - [1659971157.322753][3458:3458] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v - [1659971157.322788][3458:3458] CHIP:DMG: AccessControl: allowed - - - 1659773092.660797][17263:17263] CHIP:DMG: ReportDataMessage = - [1659773092.660823][17263:17263] CHIP:DMG: { - [1659773092.660855][17263:17263] CHIP:DMG: AttributeReportIBs = - [1659773092.660879][17263:17263] CHIP:DMG: [ - [1659773092.660893][17263:17263] CHIP:DMG: AttributeReportIB = - [1659773092.660917][17263:17263] CHIP:DMG: { - [1659773092.660931][17263:17263] CHIP:DMG: AttributeDataIB = - [1659773092.660948][17263:17263] CHIP:DMG: { - [1659773092.660964][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659773092.660983][17263:17263] CHIP:DMG: AttributePathIB = - [1659773092.660999][17263:17263] CHIP:DMG: { - [1659773092.661017][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659773092.661053][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659773092.661082][17263:17263] CHIP:DMG: Attribute = 0x0000_0004, - [1659773092.661104][17263:17263] CHIP:DMG: } - [1659773092.661130][17263:17263] CHIP:DMG: - [1659773092.661152][17263:17263] CHIP:DMG: Data = 0, - [1659773092.661168][17263:17263] CHIP:DMG: }, - [1659773092.661212][17263:17263] CHIP:DMG: - [1659773092.661230][17263:17263] CHIP:DMG: }, - [1659773092.661251][17263:17263] CHIP:DMG: - [1659773092.661263][17263:17263] CHIP:DMG: ], - [1659773092.661284][17263:17263] CHIP:DMG: - [1659773092.661297][17263:17263] CHIP:DMG: SuppressResponse = true, - [1659773092.661311][17263:17263] CHIP:DMG: InteractionModelRevision = 1 - [1659773092.661323][17263:17263] CHIP:DMG: } - [1659773092.661337][17263:17263] CHIP:DMG: + verify that bootreason attribute data type must match the value listed in Table 105 BootReason ENUM table in spec on TH(all-clusters-app). + + + ReadRequestMessage = + [1661421678.360282][2362:2362] CHIP:DMG: { + [1661421678.360336][2362:2362] CHIP:DMG: AttributePathIBs = + [1661421678.360400][2362:2362] CHIP:DMG: [ + [1661421678.360461][2362:2362] CHIP:DMG: AttributePathIB = + [1661421678.360531][2362:2362] CHIP:DMG: { + [1661421678.360605][2362:2362] CHIP:DMG: Endpoint = 0x0, + [1661421678.360688][2362:2362] CHIP:DMG: Cluster = 0x33, + [1661421678.360767][2362:2362] CHIP:DMG: Attribute = 0x0000_0004, + [1661421678.360843][2362:2362] CHIP:DMG: } + [1661421678.360914][2362:2362] CHIP:DMG: + [1661421678.360978][2362:2362] CHIP:DMG: ], + [1661421678.361048][2362:2362] CHIP:DMG: + [1661421678.361114][2362:2362] CHIP:DMG: isFabricFiltered = true, + [1661421678.361178][2362:2362] CHIP:DMG: InteractionModelRevision = 1 + [1661421678.361322][2362:2362] CHIP:DMG: }, + [1661421678.361498][2362:2362] CHIP:DMG: IM RH moving to [GeneratingReports] + [1661421678.361719][2362:2362] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 + [1661421678.361792][2362:2362] CHIP:DMG: Cluster 33, Attribute 4 is dirty + [1661421678.361847][2362:2362] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0004 (expanded=0) + [1661421678.361912][2362:2362] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v + [1661421678.361988][2362:2362] CHIP:DMG: AccessControl: allowed disabled: true - label: @@ -442,8 +213,7 @@ tests: Product maker needs to provide instructions for how to trigger the command on the DUT. For comparison, the DUT behavior for this test step can be simulated using chip-tool (when DUT is a commissioner/Client) ./chip-tool generaldiagnostics read active-hardware-faults 1 0 - - Verify in DUT as client side: verify that ActiveHardwareFaults attribute the attribute response should be empty. But when a hardware fault occurs, the return attribute value must match the value listed in the HardwareFault ENUM table 11.11.6.1 + verify that ActiveHardwareFaults attribute the attribute response should be empty. But when a hardware fault occurs, the return attribute value must match the value listed in the HardwareFault ENUM table 11.11.6.1 on TH(all-clusters-app). [1659773303.234177][17263:17263] CHIP:DMG: [1659773303.234225][17263:17263] CHIP:DMG: ReportDataMessage = @@ -485,24 +255,24 @@ tests: Product maker needs to provide instructions for how to trigger the command on the DUT. For comparison, the DUT behavior for this test step can be simulated using chip-tool (when DUT is a commissioner/Client) ./chip-tool generaldiagnostics read active-radio-faults 1 0 - Verify in DUT as client side:verify that the attribute response should be empty. But when a radio fault occurs, the return attribute value must match the value listed in the RadioFault ENUM table. 11.11.6.2 + verify that the attribute response should be empty. But when a radio fault occurs, the return attribute value must match the value listed in the RadioFault ENUM table. 11.11.6.2 on TH(all-clusters-app). [1659971190.358722][3458:3458] CHIP:IM: Received Read request [1659971190.358800][3458:3458] CHIP:DMG: ReadRequestMessage = [1659971190.358827][3458:3458] CHIP:DMG: { - [1659971190.358848][3458:3458] CHIP:DMG: AttributePathIBs = - [1659971190.358874][3458:3458] CHIP:DMG: [ - [1659971190.358897][3458:3458] CHIP:DMG: AttributePathIB = - [1659971190.358924][3458:3458] CHIP:DMG: { - [1659971190.358952][3458:3458] CHIP:DMG: Endpoint = 0x0, - [1659971190.358988][3458:3458] CHIP:DMG: Cluster = 0x33, - [1659971190.359019][3458:3458] CHIP:DMG: Attribute = 0x0000_0006, - [1659971190.359049][3458:3458] CHIP:DMG: } + [1659971190.358848][3458:3458] CHIP:DMG: AttributePathIBs = + [1659971190.358874][3458:3458] CHIP:DMG: [ + [1659971190.358897][3458:3458] CHIP:DMG: AttributePathIB = + [1659971190.358924][3458:3458] CHIP:DMG: { + [1659971190.358952][3458:3458] CHIP:DMG: Endpoint = 0x0, + [1659971190.358988][3458:3458] CHIP:DMG: Cluster = 0x33, + [1659971190.359019][3458:3458] CHIP:DMG: Attribute = 0x0000_0006, + [1659971190.359049][3458:3458] CHIP:DMG: } [1659971190.359077][3458:3458] CHIP:DMG: - [1659971190.359101][3458:3458] CHIP:DMG: ], + [1659971190.359101][3458:3458] CHIP:DMG: ], [1659971190.359129][3458:3458] CHIP:DMG: - [1659971190.359154][3458:3458] CHIP:DMG: isFabricFiltered = true, - [1659971190.359178][3458:3458] CHIP:DMG: InteractionModelRevision = 1 + [1659971190.359154][3458:3458] CHIP:DMG: isFabricFiltered = true, + [1659971190.359178][3458:3458] CHIP:DMG: InteractionModelRevision = 1 [1659971190.359201][3458:3458] CHIP:DMG: }, [1659971190.359274][3458:3458] CHIP:DMG: IM RH moving to [GeneratingReports] [1659971190.359356][3458:3458] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 @@ -520,38 +290,30 @@ tests: Product maker needs to provide instructions for how to trigger the command on the DUT. For comparison, the DUT behavior for this test step can be simulated using chip-tool (when DUT is a commissioner/Client) ./chip-tool generaldiagnostics read active-network-faults 1 0 - Verify in DUT as client side: verify that ActiveNetworkFaults attribute value attribute response should be empty. But when a network fault occurs, the return attribute value must match the value listed in the NetworkFault ENUM ta - - [1659773398.933596][17263:17263] CHIP:DMG: } - [1659773398.933607][17263:17263] CHIP:DMG: - [1659773398.933677][17263:17263] CHIP:DMG: ReportDataMessage = - [1659773398.933692][17263:17263] CHIP:DMG: { - [1659773398.933703][17263:17263] CHIP:DMG: AttributeReportIBs = - [1659773398.933725][17263:17263] CHIP:DMG: [ - [1659773398.933738][17263:17263] CHIP:DMG: AttributeReportIB = - [1659773398.933759][17263:17263] CHIP:DMG: { - [1659773398.933773][17263:17263] CHIP:DMG: AttributeDataIB = - [1659773398.933787][17263:17263] CHIP:DMG: { - [1659773398.933803][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659773398.933818][17263:17263] CHIP:DMG: AttributePathIB = - [1659773398.933834][17263:17263] CHIP:DMG: { - [1659773398.933850][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659773398.933867][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659773398.933883][17263:17263] CHIP:DMG: Attribute = 0x0000_0006, - [1659773398.933898][17263:17263] CHIP:DMG: } - [1659773398.933916][17263:17263] CHIP:DMG: - [1659773398.933931][17263:17263] CHIP:DMG: Data = [ - [1659773398.933947][17263:17263] CHIP:DMG: - [1659773398.933963][17263:17263] CHIP:DMG: ], - [1659773398.933977][17263:17263] CHIP:DMG: }, - [1659773398.933996][17263:17263] CHIP:DMG: - [1659773398.934009][17263:17263] CHIP:DMG: }, - [1659773398.934029][17263:17263] CHIP:DMG: - [1659773398.934042][17263:17263] CHIP:DMG: ], - [1659773398.934062][17263:17263] CHIP:DMG: - [1659773398.934076][17263:17263] CHIP:DMG: SuppressResponse = true, - [1659773398.934090][17263:17263] CHIP:DMG: InteractionModelRevision = 1 - [1659773398.934102][17263:17263] CHIP:DMG: } + verify that ActiveNetworkFaults attribute value attribute response should be empty. But when a network fault occurs, the return attribute value must match the value listed in the NetworkFault ENUM on TH(all-clusters-app) + + ReadRequestMessage = + [1661422339.662496][2220:2220] CHIP:DMG: { + [1661422339.662554][2220:2220] CHIP:DMG: AttributePathIBs = + [1661422339.662619][2220:2220] CHIP:DMG: [ + [1661422339.662681][2220:2220] CHIP:DMG: AttributePathIB = + [1661422339.662752][2220:2220] CHIP:DMG: { + [1661422339.662825][2220:2220] CHIP:DMG: Endpoint = 0x0, + [1661422339.662926][2220:2220] CHIP:DMG: Cluster = 0x33, + [1661422339.663022][2220:2220] CHIP:DMG: Attribute = 0x0000_0007, + [1661422339.663110][2220:2220] CHIP:DMG: } + [1661422339.663184][2220:2220] CHIP:DMG: + [1661422339.663249][2220:2220] CHIP:DMG: ], + [1661422339.663321][2220:2220] CHIP:DMG: + [1661422339.663389][2220:2220] CHIP:DMG: isFabricFiltered = true, + [1661422339.663454][2220:2220] CHIP:DMG: InteractionModelRevision = 1 + [1661422339.663514][2220:2220] CHIP:DMG: }, + [1661422339.663697][2220:2220] CHIP:DMG: IM RH moving to [GeneratingReports] + [1661422339.663957][2220:2220] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 + [1661422339.664032][2220:2220] CHIP:DMG: Cluster 33, Attribute 7 is dirty + [1661422339.664088][2220:2220] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0007 (expanded=0) + [1661422339.664157][2220:2220] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v + [1661422339.664234][2220:2220] CHIP:DMG: AccessControl: allowed disabled: true - label: @@ -563,35 +325,28 @@ tests: Product maker needs to provide instructions for how to trigger the command on the DUT. For comparison, the DUT behavior for this test step can be simulated using chip-tool (when DUT is a commissioner/Client) ./chip-tool generaldiagnostics read test-event-triggers-enabled 1 0 - Verify in DUT as client side: verify that TestEventTriggersEnabled attribute value should be data type bool - - [1659773457.295991][17263:17263] CHIP:DMG: ReportDataMessage = - [1659773457.296017][17263:17263] CHIP:DMG: { - [1659773457.296036][17263:17263] CHIP:DMG: AttributeReportIBs = - [1659773457.296068][17263:17263] CHIP:DMG: [ - [1659773457.296087][17263:17263] CHIP:DMG: AttributeReportIB = - [1659773457.296119][17263:17263] CHIP:DMG: { - [1659773457.296139][17263:17263] CHIP:DMG: AttributeDataIB = - [1659773457.296162][17263:17263] CHIP:DMG: { - [1659773457.296187][17263:17263] CHIP:DMG: DataVersion = 0x4dcd1218, - [1659773457.296210][17263:17263] CHIP:DMG: AttributePathIB = - [1659773457.296235][17263:17263] CHIP:DMG: { - [1659773457.296259][17263:17263] CHIP:DMG: Endpoint = 0x0, - [1659773457.296284][17263:17263] CHIP:DMG: Cluster = 0x33, - [1659773457.296315][17263:17263] CHIP:DMG: Attribute = 0x0000_0008, - [1659773457.296339][17263:17263] CHIP:DMG: } - [1659773457.296366][17263:17263] CHIP:DMG: - [1659773457.296390][17263:17263] CHIP:DMG: Data = false, - [1659773457.296405][17263:17263] CHIP:DMG: }, - [1659773457.296428][17263:17263] CHIP:DMG: - [1659773457.296446][17263:17263] CHIP:DMG: }, - [1659773457.296468][17263:17263] CHIP:DMG: - [1659773457.296481][17263:17263] CHIP:DMG: ], - [1659773457.296510][17263:17263] CHIP:DMG: - [1659773457.296531][17263:17263] CHIP:DMG: SuppressResponse = true, - [1659773457.296549][17263:17263] CHIP:DMG: InteractionModelRevision = 1 - [1659773457.296566][17263:17263] CHIP:DMG: } - [1659773457.296585][17263:17263] CHIP:DMG: - [1659773457.296794][17263:17263] CHIP:DMG: OnReportConfirm: NumReports = 0 - [1659773457.296849][17263:17263] CHIP:DMG: ReportsInFlight = 0 with readHandle + verify that TestEventTriggersEnabled attribute value should be data type bool on TH(all-clusters-app) + + ReadRequestMessage = + [1661422384.680672][2220:2220] CHIP:DMG: { + [1661422384.680728][2220:2220] CHIP:DMG: AttributePathIBs = + [1661422384.680794][2220:2220] CHIP:DMG: [ + [1661422384.680856][2220:2220] CHIP:DMG: AttributePathIB = + [1661422384.680937][2220:2220] CHIP:DMG: { + [1661422384.681020][2220:2220] CHIP:DMG: Endpoint = 0x0, + [1661422384.681105][2220:2220] CHIP:DMG: Cluster = 0x33, + [1661422384.681189][2220:2220] CHIP:DMG: Attribute = 0x0000_0008, + [1661422384.681267][2220:2220] CHIP:DMG: } + [1661422384.681348][2220:2220] CHIP:DMG: + [1661422384.681421][2220:2220] CHIP:DMG: ], + [1661422384.681494][2220:2220] CHIP:DMG: + [1661422384.681562][2220:2220] CHIP:DMG: isFabricFiltered = true, + [1661422384.681627][2220:2220] CHIP:DMG: InteractionModelRevision = 1 + [1661422384.681688][2220:2220] CHIP:DMG: }, + [1661422384.681857][2220:2220] CHIP:DMG: IM RH moving to [GeneratingReports] + [1661422384.682101][2220:2220] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 + [1661422384.682174][2220:2220] CHIP:DMG: Cluster 33, Attribute 8 is dirty + [1661422384.682229][2220:2220] CHIP:DMG: Reading attribute: Cluster=0x0000_0033 Endpoint=0 AttributeId=0x0000_0008 (expanded=0) + [1661422384.682297][2220:2220] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0033 e=0 p=v + [1661422384.682364][2220:2220] CHIP:DMG: AccessControl: allowed disabled: true diff --git a/src/app/tests/suites/certification/Test_TC_DGSW_3_1.yaml b/src/app/tests/suites/certification/Test_TC_DGSW_3_1.yaml index 9771f051c5759c..f59e19c6b8c057 100644 --- a/src/app/tests/suites/certification/Test_TC_DGSW_3_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGSW_3_1.yaml @@ -70,24 +70,25 @@ tests: PICS: DGSW.C.A0001 verification: | ./chip-tool softwarediagnostics read current-heap-free 1 0 - Verify the thread-metrics attribute has entries with ThreadMetrics Struct on TH(all-clusters-app) Log: + + Verify the value of CurrentHeapFree is in range uint64 on TH(all-clusters-app) Log: [1659972026.540043][3458:3458] CHIP:IM: Received Read request [1659972026.540208][3458:3458] CHIP:DMG: ReadRequestMessage = [1659972026.540273][3458:3458] CHIP:DMG: { - [1659972026.540325][3458:3458] CHIP:DMG: AttributePathIBs = - [1659972026.540387][3458:3458] CHIP:DMG: [ - [1659972026.540444][3458:3458] CHIP:DMG: AttributePathIB = - [1659972026.540510][3458:3458] CHIP:DMG: { - [1659972026.540577][3458:3458] CHIP:DMG: Endpoint = 0x0, - [1659972026.540661][3458:3458] CHIP:DMG: Cluster = 0x34, - [1659972026.540737][3458:3458] CHIP:DMG: Attribute = 0x0000_0001, - [1659972026.540810][3458:3458] CHIP:DMG: } + [1659972026.540325][3458:3458] CHIP:DMG: AttributePathIBs = + [1659972026.540387][3458:3458] CHIP:DMG: [ + [1659972026.540444][3458:3458] CHIP:DMG: AttributePathIB = + [1659972026.540510][3458:3458] CHIP:DMG: { + [1659972026.540577][3458:3458] CHIP:DMG: Endpoint = 0x0, + [1659972026.540661][3458:3458] CHIP:DMG: Cluster = 0x34, + [1659972026.540737][3458:3458] CHIP:DMG: Attribute = 0x0000_0001, + [1659972026.540810][3458:3458] CHIP:DMG: } [1659972026.540878][3458:3458] CHIP:DMG: - [1659972026.540939][3458:3458] CHIP:DMG: ], + [1659972026.540939][3458:3458] CHIP:DMG: ], [1659972026.541006][3458:3458] CHIP:DMG: - [1659972026.541118][3458:3458] CHIP:DMG: isFabricFiltered = true, - [1659972026.541182][3458:3458] CHIP:DMG: InteractionModelRevision = 1 + [1659972026.541118][3458:3458] CHIP:DMG: isFabricFiltered = true, + [1659972026.541182][3458:3458] CHIP:DMG: InteractionModelRevision = 1 [1659972026.541239][3458:3458] CHIP:DMG: }, [1659972026.541397][3458:3458] CHIP:DMG: IM RH moving to [GeneratingReports] [1659972026.541584][3458:3458] CHIP:DMG: Building Reports for ReadHandler with LastReportGeneration = 0 DirtyGeneration = 0 @@ -102,7 +103,7 @@ tests: verification: | ./chip-tool softwarediagnostics read current-heap-used 1 0 - Verify the value of CurrentHeapUsed is in range uint6 on TH(all-clusters-app) Log: + Verify the value of CurrentHeapUsed is in range uint64 on TH(all-clusters-app) Log: [1659972063.411625][3458:3458] CHIP:IM: Received Read request [1659972063.411702][3458:3458] CHIP:DMG: ReadRequestMessage = diff --git a/src/app/tests/suites/certification/Test_TC_DGSW_3_2.yaml b/src/app/tests/suites/certification/Test_TC_DGSW_3_2.yaml index 49715b155c022b..8e04e498052098 100644 --- a/src/app/tests/suites/certification/Test_TC_DGSW_3_2.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGSW_3_2.yaml @@ -26,7 +26,7 @@ config: tests: - label: "Note" verification: | - Chip-tool command used below are an example to verify the DUT as client test cases. For certification test, we expect DUT should have a capability or way to run the equivalent command. + For DUT as client test cases, Chip-tool command used below are an example to verify the functionality. For certification test, we expect DUT should have a capability or way to run the equivalent command. disabled: true - label: "Commission TH to DUT" diff --git a/src/app/tests/suites/certification/Test_TC_DGTHREAD_3_1.yaml b/src/app/tests/suites/certification/Test_TC_DGTHREAD_3_1.yaml index 868372c7a4c9b0..001f2a99646552 100644 --- a/src/app/tests/suites/certification/Test_TC_DGTHREAD_3_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DGTHREAD_3_1.yaml @@ -507,7 +507,7 @@ tests: - label: "DUT reads ChannelPage0Mask attribute value from TH" PICS: DGTHREAD.C.A003c verification: | - ./chip-tool threadnetworkdiagnostics read channel-mask 54 0 + ./chip-tool threadnetworkdiagnostics read channel-page0mask 54 0 Verify "ChannelMask response" on the TH(All-cluster-app) Log: diff --git a/src/app/tests/suites/certification/Test_TC_DRLK_2_1.yaml b/src/app/tests/suites/certification/Test_TC_DRLK_2_1.yaml index 379c95d8385008..9903e4b342bd5e 100644 --- a/src/app/tests/suites/certification/Test_TC_DRLK_2_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_DRLK_2_1.yaml @@ -24,6 +24,12 @@ config: endpoint: 0 tests: + - label: "Pre-Conditions" + verification: | + TH is commissioned with the DUT + Lock device is the DUT + disabled: true + - label: "TH reads LockState attribute from DUT" PICS: DRLK.S.A0000 verification: | @@ -120,7 +126,7 @@ tests: - label: "TH sends a Unlock Door command to the DUT." PICS: DRLK.S.A0000 verification: | - ./chip-tool doorlock unlock-door 1 1 --timedInteractionTimeoutMs 100 + ./chip-tool doorlock unlock-door 1 1 --timedInteractionTimeoutMs 1000 Verify "DUT performs the door unlock action" on the TH(Chip-tool) Log: @@ -328,7 +334,7 @@ tests: verification: | This is an Optional attribute, so its not compulsory to get the expected outcome - ./chip-tool doorlock write-by-id 4 10 1 1 + ./chip-tool doorlock write-by-id 4 0 1 1 Verify " DUT sends SUCCESS response " on the TH(Chip-tool) Log: @@ -398,7 +404,7 @@ tests: verification: | This is an Optional attribute, so its not compulsory to get the expected outcome - ./chip-tool doorlock write-by-id 5 11 1 1 + ./chip-tool doorlock write-by-id 5 0 1 1 Verify " DUT sends SUCCESS response" on the TH(Chip-tool) Log: @@ -1049,7 +1055,7 @@ tests: verification: | This is an Optional attribute, so its not compulsory to get the expected outcome - ./chip-tool doorlock write ledsettings 1 1 1 + ./chip-tool doorlock write ledsettings 2 1 1 Verify " DUT responds with UNSUPPORTED_WRITE " on the TH(Chip-tool) Log: @@ -2009,7 +2015,7 @@ tests: - label: "TH writes NumberOfCredentials SupportedPerUser attribute as 85" verification: | - ./chip-tool doorlock write-by-id 28 10 1 1 + ./chip-tool doorlock write-by-id 28 85 1 1 Verify " DUT responds with UNSUPPORTED_WRITE" on the TH(Chip-tool) Log: [1654683627.680196][4148:4153] CHIP:DMG: StatusIB = diff --git a/src/app/tests/suites/certification/Test_TC_DRLK_2_10.yaml b/src/app/tests/suites/certification/Test_TC_DRLK_2_10.yaml index 0ecf3c718743cc..ac3e56a27d585c 100644 --- a/src/app/tests/suites/certification/Test_TC_DRLK_2_10.yaml +++ b/src/app/tests/suites/certification/Test_TC_DRLK_2_10.yaml @@ -31,7 +31,6 @@ tests: Events to be executed as following 1. Compile app using below command in connectedhomeip folder a. ./scripts/run_in_build_env.sh ./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-clang build - b. ./scripts/run_in_build_env.sh ./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-libfuzzer-clang build 2. Build respective app (lock-app) 3. Commission DUT to TH 4. Open 2nd terminal of DUT and provide the below command to obtain PID of DUT diff --git a/src/app/tests/suites/certification/Test_TC_DRLK_3_3.yaml b/src/app/tests/suites/certification/Test_TC_DRLK_3_3.yaml index ced573eba94550..3b55deac358bbe 100644 --- a/src/app/tests/suites/certification/Test_TC_DRLK_3_3.yaml +++ b/src/app/tests/suites/certification/Test_TC_DRLK_3_3.yaml @@ -36,7 +36,6 @@ tests: Events to be executed as following 1. Compile app using below command in connectedhomeip folder a. ./scripts/run_in_build_env.sh ./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-clang build - b. ./scripts/run_in_build_env.sh ./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-libfuzzer-clang build 2. Build respective app (lock-app) 3. Commission DUT to TH 4. Open 2nd terminal of DUT and provide the below command to obtain PID of DUT diff --git a/src/app/tests/suites/certification/Test_TC_IDM_4_2.yaml b/src/app/tests/suites/certification/Test_TC_IDM_4_2.yaml index d8783a1caa0a4c..a6b78a9c57ad9b 100644 --- a/src/app/tests/suites/certification/Test_TC_IDM_4_2.yaml +++ b/src/app/tests/suites/certification/Test_TC_IDM_4_2.yaml @@ -315,14 +315,13 @@ tests: onoff subscribe on-time 500 100 1 1 On TH Verify that the DUT sends an error message - [1657451028.957761][11635:11640] CHIP:EM: Removed CHIP MessageCounter:190733056 from RetransTable on exchange 33632i - [1657451028.957867][11635:11640] CHIP:DMG: StatusResponseMessage = - [1657451028.957963][11635:11640] CHIP:DMG: { - [1657451028.958028][11635:11640] CHIP:DMG: Status = 0x01 (FAILURE), - [1657451028.958094][11635:11640] CHIP:DMG: InteractionModelRevision = 1 - [1657451028.958175][11635:11640] CHIP:DMG: } - [1657451028.958236][11635:11640] CHIP:IM: Received status response, status is 0x01 (FAILURE) - [1657451028.958324][11635:11640] CHIP:DMG: mResubscribePolicy is null + [1661754615.089845][103654:103659] CHIP:DMG: StatusResponseMessage = + [1661754615.089857][103654:103659] CHIP:DMG: { + [1661754615.089868][103654:103659] CHIP:DMG: Status = 0x80 (INVALID_ACTION), + [1661754615.089879][103654:103659] CHIP:DMG: InteractionModelRevision = 1 + [1661754615.089889][103654:103659] CHIP:DMG: } + [1661754615.089901][103654:103659] CHIP:IM: Received status response, status is 0x80 (INVALID_ACTION) + [1661754615.089927][103654:103659] CHIP:EM: Piggybacking Ack for MessageCounter:223396916 on exchange: 6193i disabled: true - label: diff --git a/src/app/tests/suites/certification/Test_TC_IDM_8_1.yaml b/src/app/tests/suites/certification/Test_TC_IDM_8_1.yaml index a3e3dcd5463521..0320f91139cd10 100644 --- a/src/app/tests/suites/certification/Test_TC_IDM_8_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_IDM_8_1.yaml @@ -30,6 +30,20 @@ tests: Here the command to enter interactive mode:-- ./chip-tool interactive start disabled: true + - label: "Precondition" + verification: | + To Provision the DUT using ethernet + ./chip-all-clusters-app + + *Provision the device using chip tool on first controller(RC1) + *./chip-tool pairing ethernet node-id setup-pin-code discriminator device-remote-ip device-remote-port(5540) + on first controller open a commissioning window using below command (In RC1) + ./chip-tool pairing open-commissioning-window 1 1 400 2000 3840 (Save the manualcode for 2nd Provision) + + *Provision the device using chip tool on 2nd controller(RC2) + * ./chip-tool pairing code 2 mannualcode –commissioner name beta + disabled: true + - label: "Send a Read Request Message from RC1 and RC2 to read the ACL attribute, which is a fabric scoped list, from the DUT. Fabric @@ -38,49 +52,51 @@ tests: On RC1 and RC2, Verify that the number of entries returned by the DUT for both the reads are same.By sending below commands - ./chip-tool accesscontrol read acl 1 0 --fabric-filtered 0 - On RC1, verify that the number of entries - [1657779742.905642][2620:2625] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 4140182590 - [1657779742.905736][2620:2625] CHIP:TOO: ACL: 2 entries - [1657779742.905794][2620:2625] CHIP:TOO: [1]: { - [1657779742.905845][2620:2625] CHIP:TOO: Privilege: 5 - [1657779742.905877][2620:2625] CHIP:TOO: AuthMode: 2 - [1657779742.905913][2620:2625] CHIP:TOO: Subjects: 1 entries - [1657779742.905952][2620:2625] CHIP:TOO: [1]: 112233 - [1657779742.905986][2620:2625] CHIP:TOO: Targets: null - [1657779742.906017][2620:2625] CHIP:TOO: FabricIndex: 1 - [1657779742.906047][2620:2625] CHIP:TOO: } - [1657779742.906083][2620:2625] CHIP:TOO: [2]: { - [1657779742.906114][2620:2625] CHIP:TOO: Privilege: 0 - [1657779742.906144][2620:2625] CHIP:TOO: AuthMode: 0 - [1657779742.906174][2620:2625] CHIP:TOO: Subjects: null - [1657779742.906203][2620:2625] CHIP:TOO: Targets: null - [1657779742.906233][2620:2625] CHIP:TOO: FabricIndex: 2 - [1657779742.906262][2620:2625] CHIP:TOO: } - [1657779742.906365][2620:2625] CHIP:EM: Sending Standalone Ack for MessageCounter:156304177 on exchange 7994i - - - - ./chip-tool accesscontrol read acl 2 0 --fabric-filtered 0 - On RC2, verify that the number of entries - [1657777306.528148][2474:2479] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 3942609879 - [1657777306.529101][2474:2479] CHIP:TOO: ACL: 2 entries - [1657777306.529144][2474:2479] CHIP:TOO: [1]: { - [1657777306.531412][2474:2479] CHIP:TOO: Privilege: 0 - [1657777306.531449][2474:2479] CHIP:TOO: AuthMode: 0 - [1657777306.531476][2474:2479] CHIP:TOO: Subjects: null - [1657777306.531502][2474:2479] CHIP:TOO: Targets: null - [1657777306.531527][2474:2479] CHIP:TOO: FabricIndex: 1 - [1657777306.531551][2474:2479] CHIP:TOO: } - [1657777306.531596][2474:2479] CHIP:TOO: [2]: { - [1657777306.531623][2474:2479] CHIP:TOO: Privilege: 5 - [1657777306.531647][2474:2479] CHIP:TOO: AuthMode: 2 - [1657777306.531675][2474:2479] CHIP:TOO: Subjects: 1 entries - [1657777306.531708][2474:2479] CHIP:TOO: [1]: 112233 - [1657777306.531736][2474:2479] CHIP:TOO: Targets: null - [1657777306.531761][2474:2479] CHIP:TOO: FabricIndex: 2 - [1657777306.531785][2474:2479] CHIP:TOO: } - [1657777306.531885][2474:2479] CHIP:EM: Sending Standalone Ack for MessageCounter:98574249 on exchange 20274i + ./chip-tool accesscontrol read acl 1 0 --fabric-filtered 0 + On RC1, Verify that the number of entries returned by the DUT + [1660734999.949283][8689:8694] CHIP:DMG: } + [1660734999.949728][8689:8694] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 1094083523 + [1660734999.949818][8689:8694] CHIP:TOO: ACL: 2 entries + [1660734999.949889][8689:8694] CHIP:TOO: [1]: { + [1660734999.949964][8689:8694] CHIP:TOO: Privilege: 5 + [1660734999.949995][8689:8694] CHIP:TOO: AuthMode: 2 + [1660734999.950029][8689:8694] CHIP:TOO: Subjects: 1 entries + [1660734999.950066][8689:8694] CHIP:TOO: [1]: 112233 + [1660734999.950098][8689:8694] CHIP:TOO: Targets: null + [1660734999.950127][8689:8694] CHIP:TOO: FabricIndex: 1 + [1660734999.950155][8689:8694] CHIP:TOO: } + [1660734999.950189][8689:8694] CHIP:TOO: [2]: { + [1660734999.950219][8689:8694] CHIP:TOO: Privilege: 0 + [1660734999.950248][8689:8694] CHIP:TOO: AuthMode: 0 + [1660734999.950276][8689:8694] CHIP:TOO: Subjects: null + [1660734999.950304][8689:8694] CHIP:TOO: Targets: null + [1660734999.950332][8689:8694] CHIP:TOO: FabricIndex: 2 + [1660734999.950359][8689:8694] CHIP:TOO: } + [1660734999.950462][8689:8694] CHIP:EM: Sending Standalone Ack for MessageCounter:145020876 on exchange 52587i + + + + + ./chip-tool accesscontrol read acl 2 0 --fabric-filtered 0 --commissioner-name beta + On RC2, Verify that the number of entries returned by the DUT + [1660735145.069516][16316:16321] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 1094083523 + [1660735145.069525][16316:16321] CHIP:TOO: ACL: 2 entries + [1660735145.069530][16316:16321] CHIP:TOO: [1]: { + [1660735145.069535][16316:16321] CHIP:TOO: Privilege: 0 + [1660735145.069538][16316:16321] CHIP:TOO: AuthMode: 0 + [1660735145.069540][16316:16321] CHIP:TOO: Subjects: null + [1660735145.069542][16316:16321] CHIP:TOO: Targets: null + [1660735145.069545][16316:16321] CHIP:TOO: FabricIndex: 1 + [1660735145.069547][16316:16321] CHIP:TOO: } + [1660735145.069552][16316:16321] CHIP:TOO: [2]: { + [1660735145.069554][16316:16321] CHIP:TOO: Privilege: 5 + [1660735145.069556][16316:16321] CHIP:TOO: AuthMode: 2 + [1660735145.069559][16316:16321] CHIP:TOO: Subjects: 1 entries + [1660735145.069562][16316:16321] CHIP:TOO: [1]: 112233 + [1660735145.069565][16316:16321] CHIP:TOO: Targets: null + [1660735145.069567][16316:16321] CHIP:TOO: FabricIndex: 2 + [1660735145.069569][16316:16321] CHIP:TOO: } + [1660735145.069588][16316:16321] CHIP:EM: Sending Standalone Ack for MessageCounter:58627510 on exchange 63634i disabled: true - label: @@ -94,121 +110,139 @@ tests: verification: | By sending the command mentioned below, change attribute values on DUT to create events multiple times.Send a fabric-filtered Read Request Message from each of RC1 and RC2 - ./chip-tool accesscontrol read acl 1 0 --commissioner-name beta - On RC1, verify that acl atrribute reading an entries from DUT - [1657781757.866389][2878:2883] CHIP:DMG: } - [1657781757.866649][2878:2883] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 4140182590 - [1657781757.866722][2878:2883] CHIP:TOO: ACL: 1 entries - [1657781757.866769][2878:2883] CHIP:TOO: [1]: { - [1657781757.866809][2878:2883] CHIP:TOO: Privilege: 5 - [1657781757.866832][2878:2883] CHIP:TOO: AuthMode: 2 - [1657781757.866859][2878:2883] CHIP:TOO: Subjects: 1 entries - [1657781757.866887][2878:2883] CHIP:TOO: [1]: 112233 - [1657781757.866913][2878:2883] CHIP:TOO: Targets: null - [1657781757.866935][2878:2883] CHIP:TOO: FabricIndex: 1 - [1657781757.866958][2878:2883] CHIP:TOO: } - [1657781757.867038][2878:2883] CHIP:EM: Sending Standalone Ack for MessageCounter:31035884 on exchange 64038i - - - ./chip-tool accesscontrol read acl 2 0 --commissioner-name gamma + ./chip-tool accesscontrol read acl 1 0 + On RC1, verify that acl atrribute reading an entries from DUT + [1660736093.612611][8743:8748] CHIP:DMG: } + [1660736093.612923][8743:8748] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 1094083523 + [1660736093.613008][8743:8748] CHIP:TOO: ACL: 1 entries + [1660736093.613080][8743:8748] CHIP:TOO: [1]: { + [1660736093.613129][8743:8748] CHIP:TOO: Privilege: 5 + [1660736093.613161][8743:8748] CHIP:TOO: AuthMode: 2 + [1660736093.613196][8743:8748] CHIP:TOO: Subjects: 1 entries + [1660736093.613232][8743:8748] CHIP:TOO: [1]: 112233 + [1660736093.613265][8743:8748] CHIP:TOO: Targets: null + [1660736093.613294][8743:8748] CHIP:TOO: FabricIndex: 1 + [1660736093.613323][8743:8748] CHIP:TOO: } + [1660736093.613424][8743:8748] CHIP:EM: Sending Standalone Ack for MessageCounter:107756092 on exchange 62143i + i + + + ./chip-tool accesscontrol read acl 2 0 --commissioner-name beta On RC2, verify that acl atrribute reading an entries from DUT - [1657781810.474993][2821:2826] CHIP:DMG: } - [1657781810.475304][2821:2826] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 4140182590 - [1657781810.475389][2821:2826] CHIP:TOO: ACL: 1 entries - [1657781810.475442][2821:2826] CHIP:TOO: [1]: { - [1657781810.475488][2821:2826] CHIP:TOO: Privilege: 5 - [1657781810.475517][2821:2826] CHIP:TOO: AuthMode: 2 - [1657781810.475549][2821:2826] CHIP:TOO: Subjects: 1 entries - [1657781810.475583][2821:2826] CHIP:TOO: [1]: 112233 - [1657781810.475614][2821:2826] CHIP:TOO: Targets: null - [1657781810.475643][2821:2826] CHIP:TOO: FabricIndex: 2 - [1657781810.475670][2821:2826] CHIP:TOO: } - [1657781810.475763][2821:2826] CHIP:EM: Sending Standalone Ack for MessageCounter:227198602 on exchange 37948i + [1660736154.632572][16573:16579] CHIP:DMG: } + [1660736154.632618][16573:16579] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 1094083523 + [1660736154.632629][16573:16579] CHIP:TOO: ACL: 1 entries + [1660736154.632641][16573:16579] CHIP:TOO: [1]: { + [1660736154.632647][16573:16579] CHIP:TOO: Privilege: 5 + [1660736154.632649][16573:16579] CHIP:TOO: AuthMode: 2 + [1660736154.632653][16573:16579] CHIP:TOO: Subjects: 1 entries + [1660736154.632656][16573:16579] CHIP:TOO: [1]: 112233 + [1660736154.632659][16573:16579] CHIP:TOO: Targets: null + [1660736154.632661][16573:16579] CHIP:TOO: FabricIndex: 2 + [1660736154.632664][16573:16579] CHIP:TOO: } + [1660736154.632680][16573:16579] CHIP:EM: Sending Standalone Ack for MessageCounter:29510790 on exchange 4088i + From RC1 send a Write Request message to the DUT to write to an entry in the fabric scoped list associated with its own fabric. - ./chip-tool accesscontrol write acl "[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets":[{ "cluster": 3, "endpoint": 1, "deviceType": null }]}]" 1 0 --commissioner-name beta - - On RC1, Verify that DUT responds as success - - [1657782547.448455][2974:2979] CHIP:DMG: WriteResponseMessage = - [1657782547.448486][2974:2979] CHIP:DMG: { - [1657782547.448513][2974:2979] CHIP:DMG: AttributeStatusIBs = - [1657782547.448551][2974:2979] CHIP:DMG: [ - [1657782547.448581][2974:2979] CHIP:DMG: AttributeStatusIB = - [1657782547.448619][2974:2979] CHIP:DMG: { - [1657782547.448651][2974:2979] CHIP:DMG: AttributePathIB = - [1657782547.448690][2974:2979] CHIP:DMG: { - [1657782547.448730][2974:2979] CHIP:DMG: Endpoint = 0x0, - [1657782547.448776][2974:2979] CHIP:DMG: Cluster = 0x1f, - [1657782547.448818][2974:2979] CHIP:DMG: Attribute = 0x0000_0000, - [1657782547.448857][2974:2979] CHIP:DMG: } - [1657782547.448899][2974:2979] CHIP:DMG: - [1657782547.448941][2974:2979] CHIP:DMG: StatusIB = - [1657782547.448980][2974:2979] CHIP:DMG: { - [1657782547.449018][2974:2979] CHIP:DMG: status = 0x00 (SUCCESS), - [1657782547.449061][2974:2979] CHIP:DMG: }, - [1657782547.449100][2974:2979] CHIP:DMG: - [1657782547.449134][2974:2979] CHIP:DMG: }, - [1657782547.449178][2974:2979] CHIP:DMG: - [1657782547.449208][2974:2979] CHIP:DMG: AttributeStatusIB = - [1657782547.449244][2974:2979] CHIP:DMG: { - [1657782547.449278][2974:2979] CHIP:DMG: AttributePathIB = - [1657782547.449316][2974:2979] CHIP:DMG: { - [1657782547.449356][2974:2979] CHIP:DMG: Endpoint = 0x0, - [1657782547.449397][2974:2979] CHIP:DMG: Cluster = 0x1f, - [1657782547.449439][2974:2979] CHIP:DMG: Attribute = 0x0000_0000, - [1657782547.449483][2974:2979] CHIP:DMG: ListIndex = Null, - [1657782547.449525][2974:2979] CHIP:DMG: } - [1657782547.449568][2974:2979] CHIP:DMG: - [1657782547.449642][2974:2979] CHIP:DMG: StatusIB = - [1657782547.449687][2974:2979] CHIP:DMG: { - [1657782547.449727][2974:2979] CHIP:DMG: status = 0x00 (SUCCESS), - [1657782547.449766][2974:2979] CHIP:DMG: }, - [1657782547.449805][2974:2979] CHIP:DMG: - [1657782547.449838][2974:2979] CHIP:DMG: }, - [1657782547.449878][2974:2979] CHIP:DMG: - [1657782547.449907][2974:2979] CHIP:DMG: ], - [1657782547.449948][2974:2979] CHIP:DMG: - [1657782547.449978][2974:2979] CHIP:DMG: InteractionModelRevision = 1 - [1657782547.450006][2974:2979] CHIP:DMG: } - [1657782547.450127][2974:2979] CHIP:DMG: WriteClient moving to [AwaitingDe] - - - - Send a fabric-filtered Read Request Message from each of RC1 and RC2 to read the fabric scoped list from the DUT. - - ./chip-tool accesscontrol read acl 2 0 --fabric-filtered 0 --commissioner-name gamma - On RC2, Verify that the data received from DUT is same as the data received in first read request - [1657782203.827787][2957:2962] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 4140182592 - [1657782203.827866][2957:2962] CHIP:TOO: ACL: 2 entries - [1657782203.827914][2957:2962] CHIP:TOO: [1]: { - [1657782203.827956][2957:2962] CHIP:TOO: Privilege: 5 - [1657782203.827982][2957:2962] CHIP:TOO: AuthMode: 2 - [1657782203.828011][2957:2962] CHIP:TOO: Subjects: 1 entries - [1657782203.828042][2957:2962] CHIP:TOO: [1]: 112233 - [1657782203.828070][2957:2962] CHIP:TOO: Targets: null - [1657782203.828095][2957:2962] CHIP:TOO: FabricIndex: 1 - [1657782203.828115][2957:2962] CHIP:TOO: } - [1657782203.828140][2957:2962] CHIP:TOO: [2]: { - [1657782203.828159][2957:2962] CHIP:TOO: Privilege: 0 - [1657782203.828178][2957:2962] CHIP:TOO: AuthMode: 0 - [1657782203.828198][2957:2962] CHIP:TOO: Subjects: null - [1657782203.828216][2957:2962] CHIP:TOO: Targets: null - [1657782203.828235][2957:2962] CHIP:TOO: FabricIndex: 2 - [1657782203.828253][2957:2962] CHIP:TOO: } - [1657782203.828346][2957:2962] CHIP:EM: Sending Standalone Ack for MessageCounter:211465645 on exchange 51184i - - - ./chip-tool accesscontrol read acl 1 0 --commissioner-name beta - - On RC1, Verify that DUT responds as UNSUPPORTED_ACCESS - [1657782688.737945][2996:3001] CHIP:DMG: SuppressResponse = true, - [1657782688.737974][2996:3001] CHIP:DMG: InteractionModelRevision = 1 - [1657782688.737999][2996:3001] CHIP:DMG: } - [1657782688.738108][2996:3001] CHIP:TOO: Response Failure: IM Error 0x0000057E: General error: 0x7e (UNSUPPORTED_ACCESS) - [1657782688.738197][2996:3001] CHIP:EM: Sending Standalone Ack for MessageCounter:110177776 on exchange 22939i + ./chip-tool accesscontrol write acl "[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects":[1,112233], "targets": [{ "cluster":31, "endpoint":0, "deviceType":null }]}]" 1 0 + + On RC1, Verify the success response from DUT + + [1659419722.669629][1915:1920] CHIP:DMG: WriteResponseMessage = + [1659419722.669657][1915:1920] CHIP:DMG: { + [1659419722.669687][1915:1920] CHIP:DMG: AttributeStatusIBs = + [1659419722.669727][1915:1920] CHIP:DMG: [ + [1659419722.669758][1915:1920] CHIP:DMG: AttributeStatusIB = + [1659419722.669796][1915:1920] CHIP:DMG: { + [1659419722.669833][1915:1920] CHIP:DMG: AttributePathIB = + [1659419722.669871][1915:1920] CHIP:DMG: { + [1659419722.669912][1915:1920] CHIP:DMG: Endpoint = 0x0, + [1659419722.669953][1915:1920] CHIP:DMG: Cluster = 0x1f, + [1659419722.669993][1915:1920] CHIP:DMG: Attribute = 0x0000_0000, + [1659419722.670034][1915:1920] CHIP:DMG: } + [1659419722.670077][1915:1920] CHIP:DMG: + [1659419722.670114][1915:1920] CHIP:DMG: StatusIB = + [1659419722.670153][1915:1920] CHIP:DMG: { + [1659419722.670191][1915:1920] CHIP:DMG: status = 0x00 (SUCCESS), + [1659419722.670229][1915:1920] CHIP:DMG: }, + [1659419722.670266][1915:1920] CHIP:DMG: + [1659419722.670300][1915:1920] CHIP:DMG: }, + [1659419722.670343][1915:1920] CHIP:DMG: + [1659419722.670373][1915:1920] CHIP:DMG: AttributeStatusIB = + [1659419722.670405][1915:1920] CHIP:DMG: { + [1659419722.670436][1915:1920] CHIP:DMG: AttributePathIB = + [1659419722.670471][1915:1920] CHIP:DMG: { + [1659419722.670510][1915:1920] CHIP:DMG: Endpoint = 0x0, + [1659419722.670550][1915:1920] CHIP:DMG: Cluster = 0x1f, + [1659419722.670590][1915:1920] CHIP:DMG: Attribute = 0x0000_0000, + [1659419722.670661][1915:1920] CHIP:DMG: ListIndex = Null, + [1659419722.670700][1915:1920] CHIP:DMG: } + [1659419722.670740][1915:1920] CHIP:DMG: + [1659419722.670776][1915:1920] CHIP:DMG: StatusIB = + [1659419722.670813][1915:1920] CHIP:DMG: { + [1659419722.670851][1915:1920] CHIP:DMG: status = 0x00 (SUCCESS), + [1659419722.670888][1915:1920] CHIP:DMG: }, + [1659419722.670925][1915:1920] CHIP:DMG: + [1659419722.670958][1915:1920] CHIP:DMG: }, + [1659419722.670994][1915:1920] CHIP:DMG: + [1659419722.671022][1915:1920] CHIP:DMG: ], + [1659419722.671062][1915:1920] CHIP:DMG: + [1659419722.671092][1915:1920] CHIP:DMG: InteractionModelRevision = 1 + [1659419722.671120][1915:1920] CHIP:DMG: } + [1659419722.671244][1915:1920] CHIP:DMG: WriteClient moving to [AwaitingDe] + [1659419722.671314][1915:1920] CHIP:EM: Sending Standalone Ack for MessageCounter:153124628 on + + + + Send fabric-filtered Read Request Message from each of RC1 and RC2 to read the fabric scoped list from the DUT. + + ./chip-tool accesscontrol read acl 1 0 + + On RC1 verify modified data which is based the write request message sent in above command + [1660817711.424566][8879:8884] CHIP:DMG: } + [1660817711.424711][8879:8884] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 2820130624 + [1660817711.424742][8879:8884] CHIP:TOO: ACL: 1 entries + [1660817711.424770][8879:8884] CHIP:TOO: [1]: { + [1660817711.424777][8879:8884] CHIP:TOO: Privilege: 5 + [1660817711.424784][8879:8884] CHIP:TOO: AuthMode: 2 + [1660817711.424793][8879:8884] CHIP:TOO: Subjects: 2 entries + [1660817711.424803][8879:8884] CHIP:TOO: [1]: 1 + [1660817711.424810][8879:8884] CHIP:TOO: [2]: 112233 + [1660817711.424820][8879:8884] CHIP:TOO: Targets: 1 entries + [1660817711.424846][8879:8884] CHIP:TOO: [1]: { + [1660817711.424854][8879:8884] CHIP:TOO: Cluster: 31 + [1660817711.424862][8879:8884] CHIP:TOO: Endpoint: 0 + [1660817711.424868][8879:8884] CHIP:TOO: DeviceType: null + [1660817711.424875][8879:8884] CHIP:TOO: } + [1660817711.424883][8879:8884] CHIP:TOO: FabricIndex: 1 + [1660817711.424889][8879:8884] CHIP:TOO: } + [1660817711.424930][8879:8884] CHIP:EM: Sending Standalone Ack for MessageCounter:9593070 on exchange 29150i + + + + ./chip-tool accesscontrol read acl 2 0 --commissioner-name beta + On RC2, Verify that the data received from DUT is same as the data received in first read request + [1660736551.755490][16621:16626] CHIP:DMG: } + [1660736551.755536][16621:16626] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Attribute 0x0000_0000 DataVersion: 1094083525 + [1660736551.755550][16621:16626] CHIP:TOO: ACL: 1 entries + [1660736551.755560][16621:16626] CHIP:TOO: [1]: { + [1660736551.755565][16621:16626] CHIP:TOO: Privilege: 5 + [1660736551.755567][16621:16626] CHIP:TOO: AuthMode: 2 + [1660736551.755571][16621:16626] CHIP:TOO: Subjects: 1 entries + [1660736551.755574][16621:16626] CHIP:TOO: [1]: 112233 + [1660736551.755577][16621:16626] CHIP:TOO: Targets: null + [1660736551.755579][16621:16626] CHIP:TOO: FabricIndex: 2 + [1660736551.755581][16621:16626] CHIP:TOO: } + [1660736551.755597][16621:16626] CHIP:EM: Sending Standalone Ack for MessageCounter:197256549 on exchange 34220i + + + + + With the above command, we are overwriting the default privilege that chip-tool has as an admin. After this test step you need to send below mentioned command to Grant access to all clusters again. + + ./chip-tool accesscontrol write acl "[{"fabricIndex": 1, "privilege": 5, "authMode":2, "subjects":[112233], "targets":null}]" 1 0 disabled: true - label: @@ -221,108 +255,108 @@ tests: verification: | Send a Read Request Message to the DUT from RC1 and RC2 to read the fabric scoped list "Fabrics" from OperationalCredentialsCluster. Fabric filtered should be set to false. - ./chip-tool operationalcredentials read fabrics 1 0 --fabric-filtered 0 --commissioner-name beta + ./chip-tool operationalcredentials read fabrics 1 0 --fabric-filtered 0 On RC1 verify the Fabrics entries [1657780124.975404][2664:2669] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0001 DataVersion: 1307873919 - [1657780124.975642][2664:2669] CHIP:TOO: Fabrics: 2 entries - [1657780124.975710][2664:2669] CHIP:TOO: [1]: { - [1657780124.975747][2664:2669] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED - [1657780124.975791][2664:2669] CHIP:TOO: VendorId: 65521 - [1657780124.975829][2664:2669] CHIP:TOO: FabricId: 2 - [1657780124.975854][2664:2669] CHIP:TOO: NodeId: 1 - [1657780124.975891][2664:2669] CHIP:TOO: Label: - [1657780124.975916][2664:2669] CHIP:TOO: FabricIndex: 1 - [1657780124.975940][2664:2669] CHIP:TOO: } - [1657780124.975985][2664:2669] CHIP:TOO: [2]: { - [1657780124.976026][2664:2669] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC - [1657780124.976053][2664:2669] CHIP:TOO: VendorId: 65521 - [1657780124.976088][2664:2669] CHIP:TOO: FabricId: 3 - [1657780124.976112][2664:2669] CHIP:TOO: NodeId: 2 - [1657780124.976135][2664:2669] CHIP:TOO: Label: - [1657780124.976217][2664:2669] CHIP:TOO: FabricIndex: 2 - [1657780124.976242][2664:2669] CHIP:TOO: } + [1657780124.975642][2664:2669] CHIP:TOO: Fabrics: 2 entries + [1657780124.975710][2664:2669] CHIP:TOO: [1]: { + [1657780124.975747][2664:2669] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED + [1657780124.975791][2664:2669] CHIP:TOO: VendorId: 65521 + [1657780124.975829][2664:2669] CHIP:TOO: FabricId: 2 + [1657780124.975854][2664:2669] CHIP:TOO: NodeId: 1 + [1657780124.975891][2664:2669] CHIP:TOO: Label: + [1657780124.975916][2664:2669] CHIP:TOO: FabricIndex: 1 + [1657780124.975940][2664:2669] CHIP:TOO: } + [1657780124.975985][2664:2669] CHIP:TOO: [2]: { + [1657780124.976026][2664:2669] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC + [1657780124.976053][2664:2669] CHIP:TOO: VendorId: 65521 + [1657780124.976088][2664:2669] CHIP:TOO: FabricId: 3 + [1657780124.976112][2664:2669] CHIP:TOO: NodeId: 2 + [1657780124.976135][2664:2669] CHIP:TOO: Label: + [1657780124.976217][2664:2669] CHIP:TOO: FabricIndex: 2 + [1657780124.976242][2664:2669] CHIP:TOO: } [1657780124.976356][2664:2669] CHIP:EM: Sending Standalone Ack for MessageCounter:266273154 on exchange 62310i - ./chip-tool operationalcredentials read fabrics 2 0 --fabric-filtered 0 --commissioner-name gamma + ./chip-tool operationalcredentials read fabrics 2 0 --fabric-filtered 0 --commissioner-name beta On RC2 verify the Fabrics entries [1657780154.150519][2728:2733] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0001 DataVersion: 1307873919 - [1657780154.150627][2728:2733] CHIP:TOO: Fabrics: 2 entries - [1657780154.150694][2728:2733] CHIP:TOO: [1]: { - [1657780154.150734][2728:2733] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED - [1657780154.150782][2728:2733] CHIP:TOO: VendorId: 65521 - [1657780154.150826][2728:2733] CHIP:TOO: FabricId: 2 - [1657780154.150855][2728:2733] CHIP:TOO: NodeId: 1 - [1657780154.150882][2728:2733] CHIP:TOO: Label: - [1657780154.150910][2728:2733] CHIP:TOO: FabricIndex: 1 - [1657780154.150937][2728:2733] CHIP:TOO: } - [1657780154.150977][2728:2733] CHIP:TOO: [2]: { - [1657780154.151011][2728:2733] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC - [1657780154.151041][2728:2733] CHIP:TOO: VendorId: 65521 - [1657780154.151069][2728:2733] CHIP:TOO: FabricId: 3 - [1657780154.151096][2728:2733] CHIP:TOO: NodeId: 2 - [1657780154.151122][2728:2733] CHIP:TOO: Label: - [1657780154.151149][2728:2733] CHIP:TOO: FabricIndex: 2 - [1657780154.151176][2728:2733] CHIP:TOO: } + [1657780154.150627][2728:2733] CHIP:TOO: Fabrics: 2 entries + [1657780154.150694][2728:2733] CHIP:TOO: [1]: { + [1657780154.150734][2728:2733] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED + [1657780154.150782][2728:2733] CHIP:TOO: VendorId: 65521 + [1657780154.150826][2728:2733] CHIP:TOO: FabricId: 2 + [1657780154.150855][2728:2733] CHIP:TOO: NodeId: 1 + [1657780154.150882][2728:2733] CHIP:TOO: Label: + [1657780154.150910][2728:2733] CHIP:TOO: FabricIndex: 1 + [1657780154.150937][2728:2733] CHIP:TOO: } + [1657780154.150977][2728:2733] CHIP:TOO: [2]: { + [1657780154.151011][2728:2733] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC + [1657780154.151041][2728:2733] CHIP:TOO: VendorId: 65521 + [1657780154.151069][2728:2733] CHIP:TOO: FabricId: 3 + [1657780154.151096][2728:2733] CHIP:TOO: NodeId: 2 + [1657780154.151122][2728:2733] CHIP:TOO: Label: + [1657780154.151149][2728:2733] CHIP:TOO: FabricIndex: 2 + [1657780154.151176][2728:2733] CHIP:TOO: } [1657780154.151277][2728:2733] CHIP:EM: Sending Standalone Ack for MessageCounter:218603951 on exchange 21910i RC1 sends an Invoke command(UpdateFabricLabel) to update the label of its fabric. - ./chip-tool operationalcredentials update-fabric-label 1 1 0 --commissioner-name beta + ./chip-tool operationalcredentials update-fabric-label 1 1 0 [1657780486.902409][2687:2692] CHIP:DMG: Received Command Response Data, Endpoint=0 Cluster=0x0000_003E Command=0x0000_0008 [1657780486.902474][2687:2692] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Command 0x0000_0008 - [1657780486.902544][2687:2692] CHIP:TOO: NOCResponse: { - [1657780486.902612][2687:2692] CHIP:TOO: statusCode: 0 - [1657780486.902649][2687:2692] CHIP:TOO: fabricIndex: 1 - [1657780486.902684][2687:2692] CHIP:TOO: } + [1657780486.902544][2687:2692] CHIP:TOO: NOCResponse: { + [1657780486.902612][2687:2692] CHIP:TOO: statusCode: 0 + [1657780486.902649][2687:2692] CHIP:TOO: fabricIndex: 1 + [1657780486.902684][2687:2692] CHIP:TOO: } [1657780486.902736][2687:2692] CHIP:DMG: ICR moving to [AwaitingDe] [1657780486.902804][2687:2692] CHIP:EM: Sending Standalone Ack for MessageCounter:243850872 on exchange 45753i - Send a non-filtered Read Request Message from RC1 to read the fabric scoped list from the DUT. - ./chip-tool operationalcredentials read fabrics 1 0 --fabric-filtered 0 --commissioner-name beta + Send a non-filtered Read Request Message from RC1 to read the fabric scoped list from the DUT. + ./chip-tool operationalcredentials read fabrics 1 0 --fabric-filtered 0 [1657780552.471227][2696:2701] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0001 DataVersion: 1307873920 - [1657780552.471361][2696:2701] CHIP:TOO: Fabrics: 2 entries - [1657780552.471450][2696:2701] CHIP:TOO: [1]: { - [1657780552.471503][2696:2701] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED - [1657780552.471566][2696:2701] CHIP:TOO: VendorId: 65521 - [1657780552.471605][2696:2701] CHIP:TOO: FabricId: 2 - [1657780552.471642][2696:2701] CHIP:TOO: NodeId: 1 - [1657780552.471679][2696:2701] CHIP:TOO: Label: 1 - [1657780552.471715][2696:2701] CHIP:TOO: FabricIndex: 1 - [1657780552.471752][2696:2701] CHIP:TOO: } - [1657780552.471805][2696:2701] CHIP:TOO: [2]: { - [1657780552.471850][2696:2701] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC - [1657780552.471891][2696:2701] CHIP:TOO: VendorId: 65521 - [1657780552.471928][2696:2701] CHIP:TOO: FabricId: 3 - [1657780552.471965][2696:2701] CHIP:TOO: NodeId: 2 - [1657780552.472001][2696:2701] CHIP:TOO: Label: - [1657780552.472037][2696:2701] CHIP:TOO: FabricIndex: 2 - [1657780552.472073][2696:2701] CHIP:TOO: } + [1657780552.471361][2696:2701] CHIP:TOO: Fabrics: 2 entries + [1657780552.471450][2696:2701] CHIP:TOO: [1]: { + [1657780552.471503][2696:2701] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED + [1657780552.471566][2696:2701] CHIP:TOO: VendorId: 65521 + [1657780552.471605][2696:2701] CHIP:TOO: FabricId: 2 + [1657780552.471642][2696:2701] CHIP:TOO: NodeId: 1 + [1657780552.471679][2696:2701] CHIP:TOO: Label: 1 + [1657780552.471715][2696:2701] CHIP:TOO: FabricIndex: 1 + [1657780552.471752][2696:2701] CHIP:TOO: } + [1657780552.471805][2696:2701] CHIP:TOO: [2]: { + [1657780552.471850][2696:2701] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC + [1657780552.471891][2696:2701] CHIP:TOO: VendorId: 65521 + [1657780552.471928][2696:2701] CHIP:TOO: FabricId: 3 + [1657780552.471965][2696:2701] CHIP:TOO: NodeId: 2 + [1657780552.472001][2696:2701] CHIP:TOO: Label: + [1657780552.472037][2696:2701] CHIP:TOO: FabricIndex: 2 + [1657780552.472073][2696:2701] CHIP:TOO: } [1657780552.472199][2696:2701] CHIP:EM: Sending Standalone Ack for MessageCounter:2814032 on exchange 31449i Send a non-filtered Read Request Message from RC2 to read the fabric scoped list from the DUT. - ./chip-tool operationalcredentials read fabrics 2 0 --fabric-filtered 0 --commissioner-name gamma + ./chip-tool operationalcredentials read fabrics 2 0 --fabric-filtered 0 --commissioner-name beta [1657780904.261593][2741:2746] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0001 DataVersion: 1307873922 - [1657780904.261701][2741:2746] CHIP:TOO: Fabrics: 2 entries - [1657780904.261761][2741:2746] CHIP:TOO: [1]: { - [1657780904.261797][2741:2746] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED - [1657780904.261840][2741:2746] CHIP:TOO: VendorId: 65521 - [1657780904.261865][2741:2746] CHIP:TOO: FabricId: 2 - [1657780904.261889][2741:2746] CHIP:TOO: NodeId: 1 - [1657780904.261913][2741:2746] CHIP:TOO: Label: - [1657780904.261937][2741:2746] CHIP:TOO: FabricIndex: 1 - [1657780904.261960][2741:2746] CHIP:TOO: } - [1657780904.261994][2741:2746] CHIP:TOO: [2]: { - [1657780904.262023][2741:2746] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC - [1657780904.262049][2741:2746] CHIP:TOO: VendorId: 65521 - [1657780904.262073][2741:2746] CHIP:TOO: FabricId: 3 - [1657780904.262096][2741:2746] CHIP:TOO: NodeId: 2 - [1657780904.262119][2741:2746] CHIP:TOO: Label: 1 - [1657780904.262141][2741:2746] CHIP:TOO: FabricIndex: 2 - [1657780904.262164][2741:2746] CHIP:TOO: } + [1657780904.261701][2741:2746] CHIP:TOO: Fabrics: 2 entries + [1657780904.261761][2741:2746] CHIP:TOO: [1]: { + [1657780904.261797][2741:2746] CHIP:TOO: RootPublicKey: 04100A4370AD71A180C267C29E364FC595A24A0D3CC2EC1A0595B2319E8E65D0BC1C7B62EBB0D91F7207CE306A094EAD0084A8A9359FC568D1279BDD275701F0ED + [1657780904.261840][2741:2746] CHIP:TOO: VendorId: 65521 + [1657780904.261865][2741:2746] CHIP:TOO: FabricId: 2 + [1657780904.261889][2741:2746] CHIP:TOO: NodeId: 1 + [1657780904.261913][2741:2746] CHIP:TOO: Label: + [1657780904.261937][2741:2746] CHIP:TOO: FabricIndex: 1 + [1657780904.261960][2741:2746] CHIP:TOO: } + [1657780904.261994][2741:2746] CHIP:TOO: [2]: { + [1657780904.262023][2741:2746] CHIP:TOO: RootPublicKey: 04BC41C77289C6CCE2752CA88DFE1C1A0EB3742B31A32D32C7185CAE22CC0665889702E82706F952524618EFC34A5462A08B793C5AC3C5B45E55598AD362975FFC + [1657780904.262049][2741:2746] CHIP:TOO: VendorId: 65521 + [1657780904.262073][2741:2746] CHIP:TOO: FabricId: 3 + [1657780904.262096][2741:2746] CHIP:TOO: NodeId: 2 + [1657780904.262119][2741:2746] CHIP:TOO: Label: 1 + [1657780904.262141][2741:2746] CHIP:TOO: FabricIndex: 2 + [1657780904.262164][2741:2746] CHIP:TOO: } [1657780904.262252][2741:2746] CHIP:EM: Sending Standalone Ack for MessageCounter:203207506 on exchange 27504i disabled: true @@ -333,33 +367,7 @@ tests: whose value is a list of structs which contain some fabric-sensitive data. Modify attribute1 on the DUT." verification: | - Please run this test in chip tool interactive mode ./chip-tool interactive start - - - Activate the subscription between RC1 and DUT for an attribute1 whose value is a list of structs which contain some fabric-sensitive data - - operationalcredentials subscribe nocs 10 100 1 0 - - [1657802879.008816][4548:4553] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0000 DataVersion: 567747175 - [1657802879.008927][4548:4553] CHIP:TOO: NOCs: 1 entries - [1657802879.009017][4548:4553] CHIP:TOO: [1]: { - [1657802879.009105][4548:4553] CHIP:TOO: Noc: 1530010101240201370324130118260480228127260580254D3A37062415012411011824070124080130094104EA61A44385992E365092182D59E3DAF164D2B2F1818B071779A8A0C8832720B52691E4100925D0427C7643BDB43D4ECBCF3D740B0DA0D5E00517143E88676E87370A350128011824020136030402040118300414668A31137585F054F68F571251E644FECF98BEEB3005142179BF06A074A00549577FF0F68071038C6019A118300B407E6F0AFEFAF6EA93D8F39B077C97F175B9C417E37816F229C39D2A36F46576E52787E4610075270222053BFDDE853F06EF52F5C4BCC1102A25F089AFA675200418 - [1657802879.009203][4548:4553] CHIP:TOO: Icac: 1530010100240201370324140018260480228127260580254D3A37062413011824070124080130094104E02FFF23357C6B135568AA3E456204672E5BDDF5B68B1A9B39E670E56B9982298B1BBEEBD9F3723C2B58944A11ACD9B2CD8DE7C94DC6FEEFA67E2CBF0A8CCDBC370A35012901182402603004142179BF06A074A00549577FF0F68071038C6019A130051474B77548C9D04E936F951F0775C7AE9F88AF9FA318300B405AB8763179CF1E865E20E19F81E1286EF7B9D417BDC85D536406230816A438EDB48E946D5821FE54D97D1C337505AA6DEC1746C884344A769F63E9DC8318186918 - [1657802879.009273][4548:4553] CHIP:TOO: FabricIndex: 1 - [1657802879.009329][4548:4553] CHIP:TOO: } - [1657802879.009426][4548:4553] CHIP:DMG: MoveToState ReadClient[0xffff7c008e40]: Moving to [AwaitingSu] - - Activate the subscription between RC2 and DUT for the same attribute1 whose value is a list of structs which contain some fabric-sensitive data. - operationalcredentials subscribe nocs 10 100 2 0 --commissioner-name beta - [1657803363.013803][5522:5527] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_003E Attribute 0x0000_0000 DataVersion: 567747179 - [1657803363.013897][5522:5527] CHIP:TOO: NOCs: 1 entries - [1657803363.013971][5522:5527] CHIP:TOO: [1]: { - [1657803363.014015][5522:5527] CHIP:TOO: Noc: 1530010101240201370324130118260480228127260580254D3A37062415022411021824070124080130094104CBB7ECF6D0E5814461597F9EA23B2616F55CA3144225CAFDFA651E88C0C6E79B6E02A734F61F8DA0D0A286C9C6E3C786680E8419C505F07DF431D86F7D900A10370A350128011824020136030402040118300414FE58E8B6E61BD3B492E81DF99EC967B0C26BF711300514A75280F34A91D76EA45936672A84D498FB1D67B418300B40175ECC1BA10A4F90D408468F4E212534B74537AE0178B22E05DBD14048748AD50CB7C5324FFE28356E7D37717384EA500B9B6423D12E64D3B825C4E72CCE199918 - [1657803363.014077][5522:5527] CHIP:TOO: Icac: 1530010100240201370324140018260480228127260580254D3A3706241301182407012408013009410434E10386BC3B08489513C394AC3EFB2151EEAEFC929D157586DD31838D79A2FCED41CCB036D312EBBC879504CA7C5889E447E1F602141F9C9531D6A3178A0B91370A3501290118240260300414A75280F34A91D76EA45936672A84D498FB1D67B43005144DC5ED208AA1EEC31D5C5A52F95EAC45FE6AFA0D18300B40702DEDF1A21987C4675D53F050024AC51BE975CCAC09BC6398522FF337E023AA20185E9D68D7CA22A26B937FD4A9644015AF75EAAB2F43E8415E17F698A48CEA18 - [1657803363.014113][5522:5527] CHIP:TOO: FabricIndex: 2 - [1657803363.014141][5522:5527] CHIP:TOO: } - [1657803363.014189][5522:5527] CHIP:DMG: MoveToState ReadClient[0xffff6c008e70]: Moving to [AwaitingSu] - [1657803363.014248][5522:5527] CHIP:EM: Piggybacking Ack for MessageCounter:84457338 on exchange: 56555i + DUT implementation required to verify the list of structs which contain some fabric-sensitive data disabled: true - label: @@ -368,117 +376,203 @@ tests: same Event1 which is fabric sensitive. Trigger Event1 on DUT on the fabric where RC1 is present." verification: | - Please run this test in chip tool interactive mode ./chip-tool interactive start - - - Activate the subscription between RC1 and DUT for an Event1 which is fabric sensitive - accesscontrol subscribe-event access-control-entry-changed 20 500 1 0 + Please run this test in chip tool interactive mode ./chip-tool interactive start + #1 : Activate the subscription between RC1 and DUT for an Event1 which is fabric sensitive by sending below command + accesscontrol subscribe-event access-control-entry-changed 100 500 1 0 [1657887424.932830][3496:3501] CHIP:DMG: } [1657887424.933020][3496:3501] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1657887424.933049][3496:3501] CHIP:TOO: Event number: 1 - [1657887424.933075][3496:3501] CHIP:TOO: Priority: Info - [1657887424.933100][3496:3501] CHIP:TOO: Timestamp: 10640831 - [1657887424.933204][3496:3501] CHIP:TOO: AccessControlEntryChanged: { - [1657887424.933247][3496:3501] CHIP:TOO: AdminNodeID: null - [1657887424.933287][3496:3501] CHIP:TOO: AdminPasscodeID: 0 - [1657887424.933315][3496:3501] CHIP:TOO: ChangeType: 1 - [1657887424.933342][3496:3501] CHIP:TOO: LatestValue: { - [1657887424.933368][3496:3501] CHIP:TOO: Privilege: 5 - [1657887424.933395][3496:3501] CHIP:TOO: AuthMode: 2 - [1657887424.933426][3496:3501] CHIP:TOO: Subjects: 1 entries - [1657887424.933460][3496:3501] CHIP:TOO: [1]: 112233 - [1657887424.933489][3496:3501] CHIP:TOO: Targets: null - [1657887424.933515][3496:3501] CHIP:TOO: FabricIndex: 1 - [1657887424.933541][3496:3501] CHIP:TOO: } - [1657887424.933567][3496:3501] CHIP:TOO: AdminFabricIndex: 1 - [1657887424.933593][3496:3501] CHIP:TOO: } + [1657887424.933049][3496:3501] CHIP:TOO: Event number: 1 + [1657887424.933075][3496:3501] CHIP:TOO: Priority: Info + [1657887424.933100][3496:3501] CHIP:TOO: Timestamp: 10640831 + [1657887424.933204][3496:3501] CHIP:TOO: AccessControlEntryChanged: { + [1657887424.933247][3496:3501] CHIP:TOO: AdminNodeID: null + [1657887424.933287][3496:3501] CHIP:TOO: AdminPasscodeID: 0 + [1657887424.933315][3496:3501] CHIP:TOO: ChangeType: 1 + [1657887424.933342][3496:3501] CHIP:TOO: LatestValue: { + [1657887424.933368][3496:3501] CHIP:TOO: Privilege: 5 + [1657887424.933395][3496:3501] CHIP:TOO: AuthMode: 2 + [1657887424.933426][3496:3501] CHIP:TOO: Subjects: 1 entries + [1657887424.933460][3496:3501] CHIP:TOO: [1]: 112233 + [1657887424.933489][3496:3501] CHIP:TOO: Targets: null + [1657887424.933515][3496:3501] CHIP:TOO: FabricIndex: 1 + [1657887424.933541][3496:3501] CHIP:TOO: } + [1657887424.933567][3496:3501] CHIP:TOO: AdminFabricIndex: 1 + [1657887424.933593][3496:3501] CHIP:TOO: } [1657887424.933661][3496:3501] CHIP:DMG: MoveToState ReadClient[0xffff940091f0]: Moving to [AwaitingSu] [1657887424.933717][3496:3501] CHIP:EM: Piggybacking Ack for MessageCounter:100554100 on exchange: 44633i + Please run this test in chip tool interactive mode ./chip-tool interactive start --commissioner-name beta - Activate the subscription between RC2 and DUT for an Event1 which is fabric sensitive - accesscontrol subscribe-event access-control-entry-changed 20 700 2 0 --commissioner-name beta + #2: Activate the subscription between RC2 and DUT for an Event1 which is fabric sensitive by sending below command + accesscontrol subscribe-event access-control-entry-changed 100 700 2 0 --commissioner-name beta --keepSubscriptions 1 [1657887441.417553][2862:2867] CHIP:DMG: } [1657887441.417766][2862:2867] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1657887441.417796][2862:2867] CHIP:TOO: Event number: 2 - [1657887441.417822][2862:2867] CHIP:TOO: Priority: Info - [1657887441.417849][2862:2867] CHIP:TOO: Timestamp: 13545202 - [1657887441.417964][2862:2867] CHIP:TOO: AccessControlEntryChanged: { - [1657887441.418020][2862:2867] CHIP:TOO: AdminNodeID: null - [1657887441.418061][2862:2867] CHIP:TOO: AdminPasscodeID: 0 - [1657887441.418090][2862:2867] CHIP:TOO: ChangeType: 1 - [1657887441.418128][2862:2867] CHIP:TOO: LatestValue: { - [1657887441.418156][2862:2867] CHIP:TOO: Privilege: 5 - [1657887441.418193][2862:2867] CHIP:TOO: AuthMode: 2 - [1657887441.418228][2862:2867] CHIP:TOO: Subjects: 1 entries - [1657887441.418273][2862:2867] CHIP:TOO: [1]: 112233 - [1657887441.418305][2862:2867] CHIP:TOO: Targets: null - [1657887441.418344][2862:2867] CHIP:TOO: FabricIndex: 2 - [1657887441.418371][2862:2867] CHIP:TOO: } - [1657887441.418409][2862:2867] CHIP:TOO: AdminFabricIndex: 2 - [1657887441.418436][2862:2867] CHIP:TOO: } + [1657887441.417796][2862:2867] CHIP:TOO: Event number: 2 + [1657887441.417822][2862:2867] CHIP:TOO: Priority: Info + [1657887441.417849][2862:2867] CHIP:TOO: Timestamp: 13545202 + [1657887441.417964][2862:2867] CHIP:TOO: AccessControlEntryChanged: { + [1657887441.418020][2862:2867] CHIP:TOO: AdminNodeID: null + [1657887441.418061][2862:2867] CHIP:TOO: AdminPasscodeID: 0 + [1657887441.418090][2862:2867] CHIP:TOO: ChangeType: 1 + [1657887441.418128][2862:2867] CHIP:TOO: LatestValue: { + [1657887441.418156][2862:2867] CHIP:TOO: Privilege: 5 + [1657887441.418193][2862:2867] CHIP:TOO: AuthMode: 2 + [1657887441.418228][2862:2867] CHIP:TOO: Subjects: 1 entries + [1657887441.418273][2862:2867] CHIP:TOO: [1]: 112233 + [1657887441.418305][2862:2867] CHIP:TOO: Targets: null + [1657887441.418344][2862:2867] CHIP:TOO: FabricIndex: 2 + [1657887441.418371][2862:2867] CHIP:TOO: } + [1657887441.418409][2862:2867] CHIP:TOO: AdminFabricIndex: 2 + [1657887441.418436][2862:2867] CHIP:TOO: } [1657887441.418517][2862:2867] CHIP:DMG: MoveToState ReadClient[0xffff74009260]: Moving to [AwaitingSu] [1657887441.418591][2862:2867] CHIP:EM: Piggybacking Ack for MessageCounter:217452290 on exchange: 44658i - From RC1 send a Write Request message to the DUT to write to an entry in the fabric scoped list associated with its own fabric. - accesscontrol write acl "[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets":[{ "cluster": 3, "endpoint": 1, "deviceType": null }]}]" 1 0 - [1658231022.614323][2305:2310] CHIP:DMG: } - [1658231022.614489][2305:2310] CHIP:TOO: Response Failure: IM Error 0x0000057E: General error: 0x7e (UNSUPPORTED_ACCESS) - [1658231022.614598][2305:2310] CHIP:TOO: Response Failure: IM Error 0x0000057E: General error: 0x7e (UNSUPPORTED_ACCESS) - [1658231022.614699][2305:2310] CHIP:TOO: Response Failure: IM Error 0x0000057E: General error: 0x7e (UNSUPPORTED_ACCESS) - [1658231022.614795][2305:2310] CHIP:DMG: MoveToState ReadClient[0xffff88008e70]: Moving to [AwaitingSu] - [1658231022.614873][2305:2310] CHIP:EM: Piggybacking Ack for MessageCounter:177580574 on exchange: 34289i - [1658231022.614987][2305:2310] CHIP:IN: Prepared secure message 0xffff880057e8 to 0x0000000000000001 (1) of type 0x1 and protocolId (0, 1) on exchange 34289i with MessageCounter:134890885. - [1658231022.615047][2305:2310] CHIP:IN: Sending encrypted msg 0xffff880057e8 with MessageCounter:134890885 to 0x0000000000000001 (1) at monotonic time: 00000000000C7D98 msec - [1658231022.616881][2305:2310] CHIP:EM: Received message of type 0x4 with protocolId (0, 1) and MessageCounter:177580575 on exchange 34289i - [1658231022.616932][2305:2310] CHIP:EM: Found matching exchange: 34289i, Delegate: 0xffff88008e70 - [1658231022.616983][2305:2310] CHIP:EM: Rxd Ack; Removing MessageCounter:134890885 from Retrans Table on exchange 34289i - [1658231022.617023][2305:2310] CHIP:EM: Removed CHIP MessageCounter:134890885 from RetransTable on exchange 34289i - [1658231022.617085][2305:2310] CHIP:DMG: SubscribeResponseMessage = - [1658231022.617129][2305:2310] CHIP:DMG: { - [1658231022.617169][2305:2310] CHIP:DMG: SubscriptionId = 0x1cf72de7, - [1658231022.617214][2305:2310] CHIP:DMG: MaxInterval = 0x1f4, - [1658231022.617257][2305:2310] CHIP:DMG: InteractionModelRevision = 1 - [1658231022.617297][2305:2310] CHIP:DMG: } - [1658231022.617340][2305:2310] CHIP:DMG: Subscription established with SubscriptionID = 0x1cf72de7 MinInterval = 20s MaxInterval = 500s Peer = 01:0000000000000001 - - ON RC1 Verify that the DUT sends a response - [1658231053.511709][10291:10296] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1658231053.511772][10291:10296] CHIP:TOO: Event number: 3 - [1658231053.511828][10291:10296] CHIP:TOO: Priority: Info - [1658231053.511879][10291:10296] CHIP:TOO: Timestamp: 386270 - [1658231053.511997][10291:10296] CHIP:TOO: AccessControlEntryChanged: { - [1658231053.512038][10291:10296] CHIP:TOO: AdminNodeID: null - [1658231053.512076][10291:10296] CHIP:TOO: AdminPasscodeID: 0 - [1658231053.512183][10291:10296] CHIP:TOO: ChangeType: 1 - [1658231053.512222][10291:10296] CHIP:TOO: LatestValue: { - [1658231053.512256][10291:10296] CHIP:TOO: Privilege: 5 - [1658231053.512291][10291:10296] CHIP:TOO: AuthMode: 2 - [1658231053.512333][10291:10296] CHIP:TOO: Subjects: 1 entries - [1658231053.512376][10291:10296] CHIP:TOO: [1]: 112233 - [1658231053.512415][10291:10296] CHIP:TOO: Targets: null - [1658231053.512450][10291:10296] CHIP:TOO: FabricIndex: 2 - [1658231053.512484][10291:10296] CHIP:TOO: } - [1658231053.512519][10291:10296] CHIP:TOO: AdminFabricIndex: 2 - [1658231053.512553][10291:10296] CHIP:TOO: } - [1658231053.512642][10291:10296] CHIP:DMG: MoveToState ReadClient[0xffff98009000]: Moving to [AwaitingSu] - [1658231053.512715][10291:10296] CHIP:EM: Piggybacking Ack for MessageCounter:36331302 on exchange: 58513i - [1658231053.512799][10291:10296] CHIP:IN: Prepared secure message 0xaaaac4ba0828 to 0x0000000000000002 (2) of type 0x1 and protocolId (0, 1) on exchange 58513i with MessageCounter:160830417. - [1658231053.512853][10291:10296] CHIP:IN: Sending encrypted msg 0xaaaac4ba0828 with MessageCounter:160830417 to 0x0000000000000002 (2) at monotonic time: 0000000001A6A793 msec - [1658231053.514813][10291:10296] CHIP:EM: Received message of type 0x4 with protocolId (0, 1) and MessageCounter:36331303 on exchange 58513i - [1658231053.514863][10291:10296] CHIP:EM: Found matching exchange: 58513i, Delegate: 0xffff98009000 - [1658231053.514909][10291:10296] CHIP:EM: Rxd Ack; Removing MessageCounter:160830417 from Retrans Table on exchange 58513i - [1658231053.514946][10291:10296] CHIP:EM: Removed CHIP MessageCounter:160830417 from RetransTable on exchange 58513i - [1658231053.515006][10291:10296] CHIP:DMG: SubscribeResponseMessage = - [1658231053.515046][10291:10296] CHIP:DMG: { - [1658231053.515082][10291:10296] CHIP:DMG: SubscriptionId = 0x8260b5, - [1658231053.515121][10291:10296] CHIP:DMG: MaxInterval = 0x2bc, - [1658231053.515160][10291:10296] CHIP:DMG: InteractionModelRevision = 1 - [1658231053.515195][10291:10296] CHIP:DMG: } - [1658231053.515235][10291:10296] CHIP:DMG: Subscription established with SubscriptionID = 0x008260b5 MinInterval = 20s MaxInterval = 700s Peer = 02:0000000000000002 + #3: From RC1 send a Write Request message to the DUT to write to an entry in the fabric scoped list associated with its own fabric. + accesscontrol write acl "[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets":[{ "cluster": 31, "endpoint": 0, "deviceType": null }]}]" 1 0 + ON RC1 Verify that the DUT sends a changed report data + [1660742282.279163][9069:9074] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 + [1660742282.279187][9069:9074] CHIP:TOO: Event number: 3 + [1660742282.279205][9069:9074] CHIP:TOO: Priority: Info + [1660742282.279222][9069:9074] CHIP:TOO: Timestamp: 26626774 + [1660742282.279281][9069:9074] CHIP:TOO: AccessControlEntryChanged: { + [1660742282.279305][9069:9074] CHIP:TOO: AdminNodeID: null + [1660742282.279341][9069:9074] CHIP:TOO: AdminPasscodeID: 0 + [1660742282.279363][9069:9074] CHIP:TOO: ChangeType: 1 + [1660742282.279383][9069:9074] CHIP:TOO: LatestValue: { + [1660742282.279413][9069:9074] CHIP:TOO: Privilege: 5 + [1660742282.279435][9069:9074] CHIP:TOO: AuthMode: 2 + [1660742282.279468][9069:9074] CHIP:TOO: Subjects: 1 entries + [1660742282.279495][9069:9074] CHIP:TOO: [1]: 112233 + [1660742282.279518][9069:9074] CHIP:TOO: Targets: null + [1660742282.279547][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.279568][9069:9074] CHIP:TOO: } + [1660742282.279588][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.279617][9069:9074] CHIP:TOO: } + [1660742282.279726][9069:9074] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 + [1660742282.279755][9069:9074] CHIP:TOO: Event number: 5 + [1660742282.279772][9069:9074] CHIP:TOO: Priority: Info + [1660742282.279789][9069:9074] CHIP:TOO: Timestamp: 26726736 + [1660742282.279823][9069:9074] CHIP:TOO: AccessControlEntryChanged: { + [1660742282.279846][9069:9074] CHIP:TOO: AdminNodeID: 112233 + [1660742282.279875][9069:9074] CHIP:TOO: AdminPasscodeID: null + [1660742282.279897][9069:9074] CHIP:TOO: ChangeType: 2 + [1660742282.279917][9069:9074] CHIP:TOO: LatestValue: { + [1660742282.279945][9069:9074] CHIP:TOO: Privilege: 5 + [1660742282.279966][9069:9074] CHIP:TOO: AuthMode: 2 + [1660742282.279989][9069:9074] CHIP:TOO: Subjects: 1 entries + [1660742282.280020][9069:9074] CHIP:TOO: [1]: 112233 + [1660742282.280043][9069:9074] CHIP:TOO: Targets: null + [1660742282.280063][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280091][9069:9074] CHIP:TOO: } + [1660742282.280110][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280138][9069:9074] CHIP:TOO: } + [1660742282.280258][9069:9074] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 + [1660742282.280279][9069:9074] CHIP:TOO: Event number: 6 + [1660742282.280296][9069:9074] CHIP:TOO: Priority: Info + [1660742282.280313][9069:9074] CHIP:TOO: Timestamp: 26726740 + [1660742282.280349][9069:9074] CHIP:TOO: AccessControlEntryChanged: { + [1660742282.280371][9069:9074] CHIP:TOO: AdminNodeID: 112233 + [1660742282.280402][9069:9074] CHIP:TOO: AdminPasscodeID: null + [1660742282.280423][9069:9074] CHIP:TOO: ChangeType: 1 + [1660742282.280442][9069:9074] CHIP:TOO: LatestValue: { + [1660742282.280470][9069:9074] CHIP:TOO: Privilege: 5 + [1660742282.280490][9069:9074] CHIP:TOO: AuthMode: 2 + [1660742282.280513][9069:9074] CHIP:TOO: 660742282.279281][9069:9074] CHIP:TOO: AccessControlEntryChanged: { + [1660742282.279305][9069:9074] CHIP:TOO: AdminNodeID: null + [1660742282.279341][9069:9074] CHIP:TOO: AdminPasscodeID: 0 + [1660742282.279363][9069:9074] CHIP:TOO: ChangeType: 1 + [1660742282.279383][9069:9074] CHIP:TOO: LatestValue: { + [1660742282.279413][9069:9074] CHIP:TOO: Privilege: 5 + [1660742282.279435][9069:9074] CHIP:TOO: AuthMode: 2 + [1660742282.279468][9069:9074] CHIP:TOO: Subjects: 1 entries + [1660742282.279495][9069:9074] CHIP:TOO: [1]: 112233 + [1660742282.279518][9069:9074] CHIP:TOO: Targets: null + [1660742282.279547][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.279568][9069:9074] CHIP:TOO: } + [1660742282.279588][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.279617][9069:9074] CHIP:TOO: } + [1660742282.279726][9069:9074] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 + [1660742282.279755][9069:9074] CHIP:TOO: Event number: 5 + [1660742282.279772][9069:9074] CHIP:TOO: Priority: Info + [1660742282.279789][9069:9074] CHIP:TOO: Timestamp: 26726736 + [1660742282.279823][9069:9074] CHIP:TOO: AccessControlEntryChanged: { + [1660742282.279846][9069:9074] CHIP:TOO: AdminNodeID: 112233 + [1660742282.279875][9069:9074] CHIP:TOO: AdminPasscodeID: null + [1660742282.279897][9069:9074] CHIP:TOO: ChangeType: 2 + [1660742282.279917][9069:9074] CHIP:TOO: LatestValue: { + [1660742282.279945][9069:9074] CHIP:TOO: Privilege: 5 + [1660742282.279966][9069:9074] CHIP:TOO: AuthMode: 2 + [1660742282.279989][9069:9074] CHIP:TOO: Subjects: 1 entries + [1660742282.280020][9069:9074] CHIP:TOO: [1]: 112233 + [1660742282.280043][9069:9074] CHIP:TOO: Targets: null + [1660742282.280063][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280091][9069:9074] CHIP:TOO: } + [1660742282.280110][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280138][9069:9074] CHIP:TOO: } + [1660742282.280258][9069:9074] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 + [1660742282.280279][9069:9074] CHIP:TOO: Event number: 6 + [1660742282.280296][9069:9074] CHIP:TOO: Priority: Info + [1660742282.280313][9069:9074] CHIP:TOO: Timestamp: 26726740 + [1660742282.280349][9069:9074] CHIP:TOO: AccessControlEntryChanged: { + [1660742282.280371][9069:9074] CHIP:TOO: AdminNodeID: 112233 + [1660742282.280402][9069:9074] CHIP:TOO: AdminPasscodeID: null + [1660742282.280423][9069:9074] CHIP:TOO: ChangeType: 1 + [1660742282.280442][9069:9074] CHIP:TOO: LatestValue: { + [1660742282.280470][9069:9074] CHIP:TOO: Privilege: 5 + [1660742282.280490][9069:9074] CHIP:TOO: AuthMode: 2 + [1660742282.280513][9069:9074] CHIP:TOO: Subjects: 2 entries + [1660742282.280543][9069:9074] CHIP:TOO: [1]: 1 + [1660742282.280565][9069:9074] CHIP:TOO: [2]: 112233 + [1660742282.280598][9069:9074] CHIP:TOO: Targets: 1 entries + [1660742282.280631][9069:9074] CHIP:TOO: [1]: { + [1660742282.280662][9069:9074] CHIP:TOO: Cluster: 31 + [1660742282.280684][9069:9074] CHIP:TOO: Endpoint: 0 + [1660742282.280705][9069:9074] CHIP:TOO: DeviceType: null + [1660742282.280735][9069:9074] CHIP:TOO: } + [1660742282.280758][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280778][9069:9074] CHIP:TOO: } + [1660742282.280807][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280838][9069:9074] CHIP:TOO: } Subjects: 2 entries + [1660742282.280543][9069:9074] CHIP:TOO: [1]: 1 + [1660742282.280565][9069:9074] CHIP:TOO: [2]: 112233 + [1660742282.280598][9069:9074] CHIP:TOO: Targets: 1 entries + [1660742282.280631][9069:9074] CHIP:TOO: [1]: { + [1660742282.280662][9069:9074] CHIP:TOO: Cluster: 31 + [1660742282.280684][9069:9074] CHIP:TOO: Endpoint: 0 + [1660742282.280705][9069:9074] CHIP:TOO: DeviceType: null + [1660742282.280735][9069:9074] CHIP:TOO: } + [1660742282.280758][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280778][9069:9074] CHIP:TOO: } + [1660742282.280807][9069:9074] CHIP:TOO: FabricIndex: 1 + [1660742282.280838][9069:9074] CHIP:TOO: } + [1660742282.280940][9069:9074] CHIP:DMG: MoveToState ReadClient[0xffff7000ce70]: Moving to [AwaitingSu] + + + ON RC2 Verify that the DUT sends a response remains same as in sub-step #2 + [1660742276.568516][17561:17566] CHIP:DMG: } + [1660742276.568676][17561:17566] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 + [1660742276.568688][17561:17566] CHIP:TOO: Event number: 2 + [1660742276.568697][17561:17566] CHIP:TOO: Priority: Info + [1660742276.568705][17561:17566] CHIP:TOO: Timestamp: 26641130 + [1660742276.568745][17561:17566] CHIP:TOO: AccessControlEntryChanged: { + [1660742276.568757][17561:17566] CHIP:TOO: AdminNodeID: null + [1660742276.568770][17561:17566] CHIP:TOO: AdminPasscodeID: 0 + [1660742276.568782][17561:17566] CHIP:TOO: ChangeType: 1 + [1660742276.568792][17561:17566] CHIP:TOO: LatestValue: { + [1660742276.568803][17561:17566] CHIP:TOO: Privilege: 5 + [1660742276.568813][17561:17566] CHIP:TOO: AuthMode: 2 + [1660742276.568828][17561:17566] CHIP:TOO: Subjects: 1 entries + [1660742276.568844][17561:17566] CHIP:TOO: [1]: 112233 + [1660742276.568856][17561:17566] CHIP:TOO: Targets: null + [1660742276.568867][17561:17566] CHIP:TOO: FabricIndex: 2 + [1660742276.568877][17561:17566] CHIP:TOO: } + [1660742276.568887][17561:17566] CHIP:TOO: FabricIndex: 2 + [1660742276.568897][17561:17566] CHIP:TOO: } + [1660742276.568954][17561:17566] CHIP:DMG: MoveToState ReadClient[0x7f8624024eb0]: Moving to [AwaitingSu] + [1660742276.568986][17561:17566] CHIP:EM: Piggybacking Ack for MessageCounter:39674556 on exchange: 26542i disabled: true - label: @@ -486,125 +580,7 @@ tests: path where an event in the path is fabric-sensitive and the associated fabric does not match the accessing fabric." verification: | - Please run this test in chip tool interactive mode ./chip-tool interactive start - - - Activate the subscription between RC1 and DUT for an Event1 which is fabric sensitive - accesscontrol subscribe-event access-control-entry-changed 1 20 1 0 - [1659010068.961559][7928:7933] CHIP:DMG: } - [1659010068.961735][7928:7933] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1659010068.961767][7928:7933] CHIP:TOO: Event number: 2 - [1659010068.961795][7928:7933] CHIP:TOO: Priority: Info - [1659010068.961822][7928:7933] CHIP:TOO: Timestamp: 12513658 - [1659010068.961889][7928:7933] CHIP:TOO: AccessControlEntryChanged: { - [1659010068.961923][7928:7933] CHIP:TOO: AdminNodeID: null - [1659010068.961955][7928:7933] CHIP:TOO: AdminPasscodeID: 0 - [1659010068.961985][7928:7933] CHIP:TOO: ChangeType: 1 - [1659010068.962014][7928:7933] CHIP:TOO: LatestValue: { - [1659010068.962042][7928:7933] CHIP:TOO: Privilege: 5 - [1659010068.962071][7928:7933] CHIP:TOO: AuthMode: 2 - [1659010068.962106][7928:7933] CHIP:TOO: Subjects: 1 entries - [1659010068.962142][7928:7933] CHIP:TOO: [1]: 112233 - [1659010068.962174][7928:7933] CHIP:TOO: Targets: null - [1659010068.962203][7928:7933] CHIP:TOO: FabricIndex: 1 - [1659010068.962231][7928:7933] CHIP:TOO: } - [1659010068.962260][7928:7933] CHIP:TOO: AdminFabricIndex: 1 - [1659010068.962288][7928:7933] CHIP:TOO: } - [1659010068.962363][7928:7933] CHIP:DMG: MoveToState ReadClient[0xffffa0009e00]: Moving to [AwaitingSu] - [1659010068.962424][7928:7933] CHIP:EM: Piggybacking Ack for MessageCounter:119024590 on exchange: 58655i - - Activate the subscription between RC2 and DUT for an Event1 which is fabric sensitive - accesscontrol subscribe-event access-control-entry-changed 1 20 2 0 - [1659009987.167510][5306:5311] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1659009987.167555][5306:5311] CHIP:TOO: Event number: 3 - [1659009987.167583][5306:5311] CHIP:TOO: Priority: Info - [1659009987.167612][5306:5311] CHIP:TOO: Timestamp: 12804805 - [1659009987.167767][5306:5311] CHIP:TOO: AccessControlEntryChanged: { - [1659009987.168574][5306:5311] CHIP:TOO: AdminNodeID: null - [1659009987.168622][5306:5311] CHIP:TOO: AdminPasscodeID: 0 - [1659009987.168653][5306:5311] CHIP:TOO: ChangeType: 1 - [1659009987.168683][5306:5311] CHIP:TOO: LatestValue: { - [1659009987.168755][5306:5311] CHIP:TOO: Privilege: 5 - [1659009987.168786][5306:5311] CHIP:TOO: AuthMode: 2 - [1659009987.168824][5306:5311] CHIP:TOO: Subjects: 1 entries - [1659009987.168861][5306:5311] CHIP:TOO: [1]: 112233 - [1659009987.168892][5306:5311] CHIP:TOO: Targets: null - [1659009987.168921][5306:5311] CHIP:TOO: FabricIndex: 2 - [1659009987.168949][5306:5311] CHIP:TOO: } - [1659009987.168978][5306:5311] CHIP:TOO: AdminFabricIndex: 2 - [1659009987.169006][5306:5311] CHIP:TOO: } - [1659009987.169089][5306:5311] CHIP:DMG: MoveToState ReadClient[0xffff98009f00]: Moving to [AwaitingSu] - [1659009987.169168][5306:5311] CHIP:EM: Piggybacking Ack for MessageCounter:217147877 on exchange: 52695i - - - From RC2 send a Write Request message to the DUT to write to an entry in the fabric scoped list associated with its own fabric. - accesscontrol write acl "[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233,1111], "targets":null},{"fabricIndex": 1, "privilege": 3, "authMode": 3, "subjects": [3333], "targets":null}]" 2 0 - [1659010027.191655][5306:5311] CHIP:DMG: } - [1659010027.191874][5306:5311] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1659010027.191902][5306:5311] CHIP:TOO: Event number: 4 - [1659010027.191925][5306:5311] CHIP:TOO: Priority: Info - [1659010027.191947][5306:5311] CHIP:TOO: Timestamp: 14468055 - [1659010027.192010][5306:5311] CHIP:TOO: AccessControlEntryChanged: { - [1659010027.192077][5306:5311] CHIP:TOO: AdminNodeID: 112233 - [1659010027.192102][5306:5311] CHIP:TOO: AdminPasscodeID: null - [1659010027.192127][5306:5311] CHIP:TOO: ChangeType: 2 - [1659010027.192150][5306:5311] CHIP:TOO: LatestValue: { - [1659010027.192173][5306:5311] CHIP:TOO: Privilege: 5 - [1659010027.192197][5306:5311] CHIP:TOO: AuthMode: 2 - [1659010027.192225][5306:5311] CHIP:TOO: Subjects: 1 entries - [1659010027.192254][5306:5311] CHIP:TOO: [1]: 112233 - [1659010027.192280][5306:5311] CHIP:TOO: Targets: null - [1659010027.192303][5306:5311] CHIP:TOO: FabricIndex: 2 - [1659010027.192326][5306:5311] CHIP:TOO: } - [1659010027.192349][5306:5311] CHIP:TOO: AdminFabricIndex: 2 - [1659010027.192372][5306:5311] CHIP:TOO: } - [1659010027.192489][5306:5311] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1659010027.192513][5306:5311] CHIP:TOO: Event number: 5 - [1659010027.192535][5306:5311] CHIP:TOO: Priority: Info - [1659010027.192557][5306:5311] CHIP:TOO: Timestamp: 14468057 - [1659010027.192597][5306:5311] CHIP:TOO: AccessControlEntryChanged: { - [1659010027.192623][5306:5311] CHIP:TOO: AdminNodeID: 112233 - [1659010027.192646][5306:5311] CHIP:TOO: AdminPasscodeID: null - [1659010027.192669][5306:5311] CHIP:TOO: ChangeType: 1 - [1659010027.192692][5306:5311] CHIP:TOO: LatestValue: { - [1659010027.192715][5306:5311] CHIP:TOO: Privilege: 5 - [1659010027.192737][5306:5311] CHIP:TOO: AuthMode: 2 - [1659010027.192764][5306:5311] CHIP:TOO: Subjects: 2 entries - [1659010027.192791][5306:5311] CHIP:TOO: [1]: 112233 - [1659010027.192816][5306:5311] CHIP:TOO: [2]: 1111 - [1659010027.192841][5306:5311] CHIP:TOO: Targets: null - [1659010027.192864][5306:5311] CHIP:TOO: FabricIndex: 2 - [1659010027.192886][5306:5311] CHIP:TOO: } - [1659010027.192909][5306:5311] CHIP:TOO: AdminFabricIndex: 2 - [1659010027.192931][5306:5311] CHIP:TOO: } - [1659010027.193044][5306:5311] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_001F Event 0x0000_0000 - [1659010027.193068][5306:5311] CHIP:TOO: Event number: 6 - [1659010027.193090][5306:5311] CHIP:TOO: Priority: Info - [1659010027.193112][5306:5311] CHIP:TOO: Timestamp: 14468058 - [1659010027.193151][5306:5311] CHIP:TOO: AccessControlEntryChanged: { - [1659010027.193176][5306:5311] CHIP:TOO: AdminNodeID: 112233 - [1659010027.193199][5306:5311] CHIP:TOO: AdminPasscodeID: null - [1659010027.193222][5306:5311] CHIP:TOO: ChangeType: 1 - [1659010027.193245][5306:5311] CHIP:TOO: LatestValue: { - [1659010027.193267][5306:5311] CHIP:TOO: Privilege: 3 - [1659010027.193290][5306:5311] CHIP:TOO: AuthMode: 3 - [1659010027.193372][5306:5311] CHIP:TOO: Subjects: 1 entries - [1659010027.193401][5306:5311] CHIP:TOO: [1]: 3333 - [1659010027.193426][5306:5311] CHIP:TOO: Targets: null - [1659010027.193450][5306:5311] CHIP:TOO: FabricIndex: 2 - [1659010027.193472][5306:5311] CHIP:TOO: } - [1659010027.193495][5306:5311] CHIP:TOO: AdminFabricIndex: 2 - [1659010027.193518][5306:5311] CHIP:TOO: } - [1659010027.193624][5306:5311] CHIP:DMG: Refresh LivenessCheckTime for 45000 milliseconds with SubscriptionId = 0xa89e20c1 Peer = 01:0000000000000002 - [1659010027.193682][5306:5311] CHIP:EM: Piggybacking Ack for MessageCounter:217147882 on exchange: 27524r - - On RC1 verify that DUT sends a Report Data Message with no entry for that event in EventReports list. - [1659011129.062422][7928:7933] CHIP:DMG: ReportDataMessage = - [1659011129.062495][7928:7933] CHIP:DMG: { - [1659011129.062558][7928:7933] CHIP:DMG: SubscriptionId = 0x3af80a9c, - [1659011129.062625][7928:7933] CHIP:DMG: InteractionModelRevision = 1 - [1659011129.062687][7928:7933] CHIP:DMG: } - [1659011129.062823][7928:7933] CHIP:DMG: Refresh LivenessCheckTime for 45000 milliseconds with SubscriptionId = 0x3af80a9c Peer = 01:0000000000000001 + Mark this as not testable /NA. Out of Scope for V1.1 disabled: true - label: diff --git a/src/app/tests/suites/certification/Test_TC_LCFG_2_1.yaml b/src/app/tests/suites/certification/Test_TC_LCFG_2_1.yaml index 45e15fe6bfd33d..67facdbb55b9f1 100644 --- a/src/app/tests/suites/certification/Test_TC_LCFG_2_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_LCFG_2_1.yaml @@ -32,16 +32,17 @@ tests: ./chip-tool localizationconfiguration read supported-locales 1 0 On TH(chip-tool) verify that the entry values in the SupportedLocales attribute are not repeated - [1651129546.170573][174082:174087] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_002B Attribute 0x0000_0002 DataVersion: 3111654481 - [1651129546.170622][174082:174087] CHIP:TOO: SupportedLocales: 8 entries - [1651129546.170636][174082:174087] CHIP:TOO: [1]: en-US - [1651129546.170647][174082:174087] CHIP:TOO: [2]: de-DE - [1651129546.170656][174082:174087] CHIP:TOO: [3]: fr-FR - [1651129546.170664][174082:174087] CHIP:TOO: [4]: en-GB - [1651129546.170672][174082:174087] CHIP:TOO: [5]: es-ES - [1651129546.170681][174082:174087] CHIP:TOO: [6]: zh-CN - [1651129546.170689][174082:174087] CHIP:TOO: [7]: it-IT - [1651129546.170697][174082:174087] CHIP:TOO: [8]: ja-JP + [1661759583.481746][104665:104670] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_002B Attribute 0x0000_0001 DataVersion: 3207653748 + [1661759583.482016][104665:104670] CHIP:TOO: SupportedLocales: 8 entries + [1661759583.482037][104665:104670] CHIP:TOO: [1]: en-US + [1661759583.482045][104665:104670] CHIP:TOO: [2]: de-DE + [1661759583.482052][104665:104670] CHIP:TOO: [3]: fr-FR + [1661759583.482059][104665:104670] CHIP:TOO: [4]: en-GB + [1661759583.482069][104665:104670] CHIP:TOO: [5]: es-ES + [1661759583.482080][104665:104670] CHIP:TOO: [6]: zh-CN + [1661759583.482089][104665:104670] CHIP:TOO: [7]: it-IT + [1661759583.482097][104665:104670] CHIP:TOO: [8]: ja-JP + [1661759583.482158][104665:104670] CHIP:EM: Sending Standalone Ack for MessageCounter:46420218 on exchange 20687i disabled: true - label: "TH writes xx-XX to SupportedLocales attribute" @@ -75,12 +76,10 @@ tests: verification: | ./chip-tool localizationconfiguration read active-locale 1 0 On TH(chip-tool) verify that the ActiveLocale Attribute value is present in the SupportedLocales attribute list - - [1651035208.064278][2761:2766] CHIP:DMG: SuppressResponse = true, - [1651035208.064316][2761:2766] CHIP:DMG: InteractionModelRevision = 1 - [1651035208.064350][2761:2766] CHIP:DMG: } - [1651035208.064552][2761:2766] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_002B Attribute 0x0000_0001 DataVersion: 1509240084 - [1651035208.064613][2761:2766] CHIP:TOO: ActiveLocale: en-US + [1661759849.744419][104758:104763] CHIP:DMG: } + [1661759849.744488][104758:104763] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_002B Attribute 0x0000_0000 DataVersion: 3207653748 + [1661759849.744509][104758:104763] CHIP:TOO: ActiveLocale: en-US + [1661759849.744553][104758:104763] CHIP:EM: Sending Standalone Ack for MessageCounter:93577923 on exchange 47198i disabled: true - label: @@ -126,29 +125,40 @@ tests: ./chip-tool localizationconfiguration write active-locale fr-FR 1 0 On TH(chip-tool) verify that DUT responds as SUCCESS - [1651035259.959116][2776:2781] CHIP:DMG: StatusIB = - [1651035259.959158][2776:2781] CHIP:DMG: { - [1651035259.959195][2776:2781] CHIP:DMG: status = 0x00 (SUCCESS), - [1651035259.959234][2776:2781] CHIP:DMG: }, - [1651035259.959271][2776:2781] CHIP:DMG: - [1651035259.959304][2776:2781] CHIP:DMG: }, - [1651035259.959343][2776:2781] CHIP:DMG: - [1651035259.959372][2776:2781] CHIP:DMG: ], - [1651035259.959409][2776:2781] CHIP:DMG: - [1651035259.959438][2776:2781] CHIP:DMG: InteractionModelRevision = 1 - [1651035259.959466][2776:2781] CHIP:DMG: } - [1651035259.959552][2776:2781] CHIP:DMG: WriteClient moving to [AwaitingDe] + [1661759978.806730][104802:104807] CHIP:DMG: WriteResponseMessage = + [1661759978.806741][104802:104807] CHIP:DMG: { + [1661759978.806749][104802:104807] CHIP:DMG: AttributeStatusIBs = + [1661759978.806766][104802:104807] CHIP:DMG: [ + [1661759978.806775][104802:104807] CHIP:DMG: AttributeStatusIB = + [1661759978.806785][104802:104807] CHIP:DMG: { + [1661759978.806794][104802:104807] CHIP:DMG: AttributePathIB = + [1661759978.806805][104802:104807] CHIP:DMG: { + [1661759978.806817][104802:104807] CHIP:DMG: Endpoint = 0x0, + [1661759978.806828][104802:104807] CHIP:DMG: Cluster = 0x2b, + [1661759978.806842][104802:104807] CHIP:DMG: Attribute = 0x0000_0000, + [1661759978.806852][104802:104807] CHIP:DMG: } + [1661759978.806866][104802:104807] CHIP:DMG: + [1661759978.806875][104802:104807] CHIP:DMG: StatusIB = + [1661759978.806887][104802:104807] CHIP:DMG: { + [1661759978.806897][104802:104807] CHIP:DMG: status = 0x00 (SUCCESS), + [1661759978.806909][104802:104807] CHIP:DMG: }, + [1661759978.806921][104802:104807] CHIP:DMG: + [1661759978.806929][104802:104807] CHIP:DMG: }, + [1661759978.806944][104802:104807] CHIP:DMG: + [1661759978.806952][104802:104807] CHIP:DMG: ], + [1661759978.806967][104802:104807] CHIP:DMG: + [1661759978.806976][104802:104807] CHIP:DMG: InteractionModelRevision = 1 + [1661759978.806985][104802:104807] CHIP:DMG: } + [1661759978.807036][104802:104807] CHIP:DMG: WriteClient moving to [AwaitingDe] + [1661759978.807064][104802:104807] CHIP:EM: Sending Standalone Ack for MessageCounter:124959015 on exchange 61726i disabled: true - label: "TH Reads ActiveLocale" verification: | ./chip-tool localizationconfiguration read active-locale 1 0 On TH(chip-tool) Verify that the value of the ActiveLocale attribute is changed - - [1645772597.252904][3816:3821] CHIP:DMG: - [1645772597.252948][3816:3821] CHIP:DMG: SuppressResponse = true, - [1645772597.252981][3816:3821] CHIP:DMG: InteractionModelRevision = 1 - [1645772597.253024][3816:3821] CHIP:DMG: } - [1645772597.253230][3816:3821] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_002B Attribute 0x0000_0001DataVersion: 3479138639 - [1645772597.253293][3816:3821] CHIP:TOO: ActiveLocale: fr-FR + [1661760013.634782][104820:104825] CHIP:DMG: } + [1661760013.634848][104820:104825] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_002B Attribute 0x0000_0000 DataVersion: 3207653749 + [1661760013.634861][104820:104825] CHIP:TOO: ActiveLocale: fr-FR + [1661760013.634901][104820:104825] CHIP:EM: Sending Standalone Ack for MessageCounter:230450777 on exchange 24487i disabled: true diff --git a/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml b/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml index 192c5a04b403a9..18bc441f9e2c37 100644 --- a/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_LVL_7_1.yaml @@ -104,36 +104,37 @@ tests: ./chip-tool levelcontrol move-to-level 253 0 0 0 1 1 On TH(chip-tool) verify that DUT sends a success response - [1654065833.084144][10181:10186] CHIP:DMG: InvokeResponseMessage = - [1654065833.084161][10181:10186] CHIP:DMG: { - [1654065833.084175][10181:10186] CHIP:DMG: suppressResponse = false, - [1654065833.084188][10181:10186] CHIP:DMG: InvokeResponseIBs = - [1654065833.084208][10181:10186] CHIP:DMG: [ - [1654065833.084237][10181:10186] CHIP:DMG: InvokeResponseIB = - [1654065833.084259][10181:10186] CHIP:DMG: { - [1654065833.084274][10181:10186] CHIP:DMG: CommandStatusIB = - [1654065833.084292][10181:10186] CHIP:DMG: { - [1654065833.084310][10181:10186] CHIP:DMG: CommandPathIB = - [1654065833.084331][10181:10186] CHIP:DMG: { - [1654065833.084352][10181:10186] CHIP:DMG: EndpointId = 0x1, - [1654065833.084370][10181:10186] CHIP:DMG: ClusterId = 0x8, - [1654065833.084386][10181:10186] CHIP:DMG: CommandId = 0x4, - [1654065833.084404][10181:10186] CHIP:DMG: }, - [1654065833.084428][10181:10186] CHIP:DMG: - [1654065833.084445][10181:10186] CHIP:DMG: StatusIB = - [1654065833.084467][10181:10186] CHIP:DMG: { - [1654065833.084485][10181:10186] CHIP:DMG: status = 0x00 (SUCCESS), - [1654065833.084503][10181:10186] CHIP:DMG: }, - [1654065833.084523][10181:10186] CHIP:DMG: - [1654065833.084540][10181:10186] CHIP:DMG: }, - [1654065833.084563][10181:10186] CHIP:DMG: - [1654065833.084580][10181:10186] CHIP:DMG: }, - [1654065833.084601][10181:10186] CHIP:DMG: - [1654065833.084617][10181:10186] CHIP:DMG: ], - [1654065833.084640][10181:10186] CHIP:DMG: - [1654065833.084657][10181:10186] CHIP:DMG: InteractionModelRevision = 1 - [1654065833.084672][10181:10186] CHIP:DMG: }, - [1654065833.084734][10181:10186] CHIP:DMG: Received Command Response Status for Endpoint=1 Cluster=0x0000_0008 Command=0x0000_0004 Status=0x0 + [1661759404.121731][104632:104637] CHIP:DMG: InvokeResponseMessage = + [1661759404.121739][104632:104637] CHIP:DMG: { + [1661759404.121750][104632:104637] CHIP:DMG: suppressResponse = false, + [1661759404.121759][104632:104637] CHIP:DMG: InvokeResponseIBs = + [1661759404.121774][104632:104637] CHIP:DMG: [ + [1661759404.121782][104632:104637] CHIP:DMG: InvokeResponseIB = + [1661759404.121797][104632:104637] CHIP:DMG: { + [1661759404.121805][104632:104637] CHIP:DMG: CommandStatusIB = + [1661759404.121817][104632:104637] CHIP:DMG: { + [1661759404.121826][104632:104637] CHIP:DMG: CommandPathIB = + [1661759404.121838][104632:104637] CHIP:DMG: { + [1661759404.121849][104632:104637] CHIP:DMG: EndpointId = 0x1, + [1661759404.121862][104632:104637] CHIP:DMG: ClusterId = 0x8, + [1661759404.121871][104632:104637] CHIP:DMG: CommandId = 0x0, + [1661759404.121878][104632:104637] CHIP:DMG: }, + [1661759404.121889][104632:104637] CHIP:DMG: + [1661759404.121896][104632:104637] CHIP:DMG: StatusIB = + [1661759404.121906][104632:104637] CHIP:DMG: { + [1661759404.121914][104632:104637] CHIP:DMG: status = 0x00 (SUCCESS), + [1661759404.121922][104632:104637] CHIP:DMG: }, + [1661759404.121930][104632:104637] CHIP:DMG: + [1661759404.121937][104632:104637] CHIP:DMG: }, + [1661759404.121947][104632:104637] CHIP:DMG: + [1661759404.121954][104632:104637] CHIP:DMG: }, + [1661759404.121964][104632:104637] CHIP:DMG: + [1661759404.121970][104632:104637] CHIP:DMG: ], + [1661759404.121981][104632:104637] CHIP:DMG: + [1661759404.121988][104632:104637] CHIP:DMG: InteractionModelRevision = 1 + [1661759404.121995][104632:104637] CHIP:DMG: }, + [1661759404.122021][104632:104637] CHIP:DMG: Received Command Response Status for Endpoint=1 Cluster=0x0000_0008 Command=0x0000_0000 Status=0x0 + [1661759404.122040][104632:104637] CHIP:DMG: ICR moving to [AwaitingDe] disabled: true - label: "TH reads CurrentLevel attribute from DUT" diff --git a/src/app/tests/suites/certification/Test_TC_SWTCH_3_2.yaml b/src/app/tests/suites/certification/Test_TC_SWTCH_3_2.yaml index 7a302ef34271d6..1034429074839e 100644 --- a/src/app/tests/suites/certification/Test_TC_SWTCH_3_2.yaml +++ b/src/app/tests/suites/certification/Test_TC_SWTCH_3_2.yaml @@ -35,7 +35,6 @@ tests: Events to be executed as following 1. Compile app using below command in connectedhomeip folder a. ./scripts/run_in_build_env.sh ./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-clang build - b. ./scripts/run_in_build_env.sh ./scripts/build/build_examples.py --target linux-arm64-all-clusters-no-ble-asan-libfuzzer-clang build 2. Build respective app (all-clusters-app) 3. Commission DUT to TH 4. Open 2nd terminal of DUT and provide the below command to obtain PID of DUT diff --git a/src/app/tests/suites/certification/Test_TC_TSUIC_3_1.yaml b/src/app/tests/suites/certification/Test_TC_TSUIC_3_1.yaml index 93899e3ed8eb66..efb786cb64b22d 100644 --- a/src/app/tests/suites/certification/Test_TC_TSUIC_3_1.yaml +++ b/src/app/tests/suites/certification/Test_TC_TSUIC_3_1.yaml @@ -121,30 +121,34 @@ tests: ./chip-tool thermostatuserinterfaceconfiguration write temperature-display-mode 1 1 1 Verify DUT receives temperature-display-mode attribute write response on the TH(all-clusters-app) Log: - [1658143515.699171][13946:13946] CHIP:DMG: WriteRequestMessage = - [1658143515.699197][13946:13946] CHIP:DMG: { - [1658143515.699221][13946:13946] CHIP:DMG: suppressResponse = false, - [1658143515.699248][13946:13946] CHIP:DMG: timedRequest = false, - [1658143515.699272][13946:13946] CHIP:DMG: AttributeDataIBs = - [1658143515.699302][13946:13946] CHIP:DMG: [ - [1658143515.699326][13946:13946] CHIP:DMG: AttributeDataIB = - [1658143515.699362][13946:13946] CHIP:DMG: { - [1658143515.699388][13946:13946] CHIP:DMG: AttributePathIB = - [1658143515.699419][13946:13946] CHIP:DMG: { - [1658143515.699451][13946:13946] CHIP:DMG: Endpoint = 0x1, - [1658143515.699484][13946:13946] CHIP:DMG: Cluster = 0x204, - [1658143515.699514][13946:13946] CHIP:DMG: Attribute = 0x0000_0001, - [1658143515.699544][13946:13946] CHIP:DMG: } - [1658143515.699577][13946:13946] CHIP:DMG: - [1658143515.699609][13946:13946] CHIP:DMG: Data = 1, - [1658143515.699638][13946:13946] CHIP:DMG: }, - [1658143515.699667][13946:13946] CHIP:DMG: - [1658143515.699690][13946:13946] CHIP:DMG: ], - [1658143515.699719][13946:13946] CHIP:DMG: - [1658143515.699743][13946:13946] CHIP:DMG: moreChunkedMessages = false, - [1658143515.699768][13946:13946] CHIP:DMG: InteractionModelRevision = 1 - [1658143515.699792][13946:13946] CHIP:DMG: }, - [1658143515.699876][13946:13946] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0204 e=1 p=m + [1661765030.276401][103574:103574] CHIP:DMG: IM WH moving to [Initialized] + [1661765030.276428][103574:103574] CHIP:DMG: WriteRequestMessage = + [1661765030.276436][103574:103574] CHIP:DMG: { + [1661765030.276443][103574:103574] CHIP:DMG: suppressResponse = false, + [1661765030.276450][103574:103574] CHIP:DMG: timedRequest = false, + [1661765030.276457][103574:103574] CHIP:DMG: AttributeDataIBs = + [1661765030.276469][103574:103574] CHIP:DMG: [ + [1661765030.276476][103574:103574] CHIP:DMG: AttributeDataIB = + [1661765030.276484][103574:103574] CHIP:DMG: { + [1661765030.276492][103574:103574] CHIP:DMG: AttributePathIB = + [1661765030.276500][103574:103574] CHIP:DMG: { + [1661765030.276509][103574:103574] CHIP:DMG: Endpoint = 0x1, + [1661765030.276517][103574:103574] CHIP:DMG: Cluster = 0x204, + [1661765030.276525][103574:103574] CHIP:DMG: Attribute = 0x0000_0000, + [1661765030.276532][103574:103574] CHIP:DMG: } + [1661765030.276542][103574:103574] CHIP:DMG: + [1661765030.276550][103574:103574] CHIP:DMG: Data = 1, + [1661765030.276557][103574:103574] CHIP:DMG: }, + [1661765030.276567][103574:103574] CHIP:DMG: + [1661765030.276573][103574:103574] CHIP:DMG: ], + [1661765030.276582][103574:103574] CHIP:DMG: + [1661765030.276589][103574:103574] CHIP:DMG: moreChunkedMessages = false, + [1661765030.276597][103574:103574] CHIP:DMG: InteractionModelRevision = 1 + [1661765030.276603][103574:103574] CHIP:DMG: }, + [1661765030.276642][103574:103574] CHIP:DMG: AccessControl: checking f=1 a=c s=0x000000000001B669 t= c=0x0000_0204 e=1 p=o + [1661765030.276657][103574:103574] CHIP:DMG: AccessControl: allowed + [1661765030.276675][103574:103574] CHIP:DMG: Endpoint 1, Cluster 0x0000_0204 update version to 929de252 + ./chip-tool thermostatuserinterfaceconfiguration write keypad-lockout 1 1 1 From a880ec3acaf0c09698a5193caa2b6028b1756e6c Mon Sep 17 00:00:00 2001 From: Vivien Nicolas Date: Wed, 31 Aug 2022 17:16:51 +0200 Subject: [PATCH 17/27] Use new (std::nothrow) instead of new where the result is checked against nullptr (#22264) --- src/controller/CommissioningWindowOpener.cpp | 4 ++-- .../python/ChipCommissionableNodeController-ScriptBinding.cpp | 2 +- src/controller/python/chip/interaction_model/Delegate.cpp | 2 +- src/lib/dnssd/minimal_mdns/core/tests/QNameStrings.h | 2 +- src/system/tests/TestSystemPacketBuffer.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/controller/CommissioningWindowOpener.cpp b/src/controller/CommissioningWindowOpener.cpp index c9fd1381927dbf..689717ba9397e7 100644 --- a/src/controller/CommissioningWindowOpener.cpp +++ b/src/controller/CommissioningWindowOpener.cpp @@ -323,7 +323,7 @@ CHIP_ERROR AutoCommissioningWindowOpener::OpenBasicCommissioningWindow(DeviceCon Seconds16 timeout) { // Not using Platform::New because we want to keep our constructor private. - auto * opener = new AutoCommissioningWindowOpener(controller); + auto * opener = new (std::nothrow) AutoCommissioningWindowOpener(controller); if (opener == nullptr) { return CHIP_ERROR_NO_MEMORY; @@ -345,7 +345,7 @@ CHIP_ERROR AutoCommissioningWindowOpener::OpenCommissioningWindow(DeviceControll SetupPayload & payload, bool readVIDPIDAttributes) { // Not using Platform::New because we want to keep our constructor private. - auto * opener = new AutoCommissioningWindowOpener(controller); + auto * opener = new (std::nothrow) AutoCommissioningWindowOpener(controller); if (opener == nullptr) { return CHIP_ERROR_NO_MEMORY; diff --git a/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp b/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp index db49bf6e360917..0fd3df5de89bec 100644 --- a/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp +++ b/src/controller/python/ChipCommissionableNodeController-ScriptBinding.cpp @@ -50,7 +50,7 @@ void pychip_CommissionableNodeController_PrintDiscoveredCommissioners( ChipError::StorageType pychip_CommissionableNodeController_NewController(chip::Controller::CommissionableNodeController ** outCommissionableNodeCtrl) { - *outCommissionableNodeCtrl = new chip::Controller::CommissionableNodeController(); + *outCommissionableNodeCtrl = new (std::nothrow) chip::Controller::CommissionableNodeController(); VerifyOrReturnError(*outCommissionableNodeCtrl != nullptr, CHIP_ERROR_NO_MEMORY.AsInteger()); return CHIP_NO_ERROR.AsInteger(); } diff --git a/src/controller/python/chip/interaction_model/Delegate.cpp b/src/controller/python/chip/interaction_model/Delegate.cpp index 54f73386bfc7fc..20ce1d2747b678 100644 --- a/src/controller/python/chip/interaction_model/Delegate.cpp +++ b/src/controller/python/chip/interaction_model/Delegate.cpp @@ -55,7 +55,7 @@ chip::ChipError::StorageType pychip_InteractionModel_GetCommandSenderHandle(uint { chip::app::CommandSender * commandSenderObj = nullptr; VerifyOrReturnError(commandSender != nullptr, CHIP_ERROR_INVALID_ARGUMENT.AsInteger()); - commandSenderObj = new chip::app::CommandSender(nullptr, nullptr); + commandSenderObj = new (std::nothrow) chip::app::CommandSender(nullptr, nullptr); VerifyOrReturnError(commandSenderObj != nullptr, (CHIP_ERROR_NO_MEMORY).AsInteger()); *commandSender = reinterpret_cast(commandSenderObj); return CHIP_NO_ERROR.AsInteger(); diff --git a/src/lib/dnssd/minimal_mdns/core/tests/QNameStrings.h b/src/lib/dnssd/minimal_mdns/core/tests/QNameStrings.h index aa724573dda04d..9cb7cf6cf03d35 100644 --- a/src/lib/dnssd/minimal_mdns/core/tests/QNameStrings.h +++ b/src/lib/dnssd/minimal_mdns/core/tests/QNameStrings.h @@ -44,7 +44,7 @@ class TestQName mStrings[i] = strdup(data[i]); } - mSerializedQNameBuffer = new uint8_t[neededSize]; + mSerializedQNameBuffer = new (std::nothrow) uint8_t[neededSize]; VerifyOrDie(mSerializedQNameBuffer != nullptr); chip::Encoding::BigEndian::BufferWriter writer(mSerializedQNameBuffer, neededSize); diff --git a/src/system/tests/TestSystemPacketBuffer.cpp b/src/system/tests/TestSystemPacketBuffer.cpp index d3c7bc362dc645..92cedf5f3b9427 100644 --- a/src/system/tests/TestSystemPacketBuffer.cpp +++ b/src/system/tests/TestSystemPacketBuffer.cpp @@ -221,7 +221,7 @@ int PacketBufferTest::TestSetup(void * inContext) return FAILURE; TestContext * const theContext = reinterpret_cast(inContext); - theContext->test = new PacketBufferTest(theContext); + theContext->test = new (std::nothrow) PacketBufferTest(theContext); if (theContext->test == nullptr) { return FAILURE; From dcd89311cd304f005c3af8cff7c44d7ece8fa509 Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Wed, 31 Aug 2022 20:47:34 +0530 Subject: [PATCH 18/27] [ESP32] cmake option to set software version and software version string (#22229) * [ESP32] cmake option to set software version and software version string ESP-IDF lets user set software version string by two ways: Project's CMakeLists.txt file or configuration option. It depends on CONFIG_APP_PROJECT_VER_FROM_CONFIG option so making the same provision for software version number. Also, Reading the software version string from the app description which is set using any one of above method. Setting the default software version as per spec i.e. 0. Setting PROJECT_VER and PROJECT_VER_NUMBER in all the examples * Fix the QEMU tests * Set software version to 0 if not set using cmake or config option * Override GetSoftwareVersion in configuration manager --- config/esp32/components/chip/CMakeLists.txt | 12 ++++++++++++ config/esp32/components/chip/Kconfig | 8 +------- examples/all-clusters-app/esp32/CMakeLists.txt | 4 ++++ .../esp32/CMakeLists.txt | 4 ++++ examples/bridge-app/esp32/CMakeLists.txt | 4 ++++ examples/chef/esp32/CMakeLists.txt | 3 +++ examples/light-switch-app/esp32/CMakeLists.txt | 4 ++++ examples/lighting-app/esp32/CMakeLists.txt | 4 ++++ examples/lock-app/esp32/CMakeLists.txt | 4 ++++ examples/ota-provider-app/esp32/CMakeLists.txt | 3 +++ examples/ota-requestor-app/esp32/CMakeLists.txt | 3 +++ .../persistent-storage/esp32/CMakeLists.txt | 4 ++++ examples/pigweed-app/esp32/CMakeLists.txt | 4 ++++ examples/shell/esp32/CMakeLists.txt | 4 ++++ .../esp32/CMakeLists.txt | 3 +++ src/platform/ESP32/BUILD.gn | 5 +++++ src/platform/ESP32/CHIPDevicePlatformConfig.h | 3 +-- src/platform/ESP32/ConfigurationManagerImpl.cpp | 17 +++++++++++++++++ src/platform/ESP32/ConfigurationManagerImpl.h | 2 ++ src/test_driver/esp32/CMakeLists.txt | 4 ++++ 20 files changed, 90 insertions(+), 9 deletions(-) diff --git a/config/esp32/components/chip/CMakeLists.txt b/config/esp32/components/chip/CMakeLists.txt index 74b79dffc93466..707d23784bc350 100644 --- a/config/esp32/components/chip/CMakeLists.txt +++ b/config/esp32/components/chip/CMakeLists.txt @@ -67,6 +67,18 @@ macro(chip_gn_arg_bool arg boolean) endif() endmacro() +# ESP-IDF lets user set software version string by two ways: +# 1. Project's CMakeLists.txt file and 2. Config option +# It depends on CONFIG_APP_PROJECT_VER_FROM_CONFIG option +# So, below makes the same provision for software version number +if (CONFIG_APP_PROJECT_VER_FROM_CONFIG) + chip_gn_arg_append("chip_config_software_version_number" ${CONFIG_DEVICE_SOFTWARE_VERSION_NUMBER}) +elseif (DEFINED PROJECT_VER_NUMBER) + chip_gn_arg_append("chip_config_software_version_number" ${PROJECT_VER_NUMBER}) +else() + chip_gn_arg_append("chip_config_software_version_number" 0) +endif() + chip_gn_arg_append("esp32_ar" "\"${CMAKE_AR}\"") chip_gn_arg_append("esp32_cc" "\"${CMAKE_C_COMPILER}\"") chip_gn_arg_append("esp32_cxx" "\"${CMAKE_CXX_COMPILER}\"") diff --git a/config/esp32/components/chip/Kconfig b/config/esp32/components/chip/Kconfig index 55cafa1c8a07a8..402d9ad64fe7fc 100644 --- a/config/esp32/components/chip/Kconfig +++ b/config/esp32/components/chip/Kconfig @@ -301,15 +301,9 @@ menu "CHIP Device Layer" This is a default value which is used when a hardware version has not been stored in device persistent storage (e.g. by a factory provisioning process). - config DEVICE_SOFTWARE_VERSION - string "Device Software Version String" - default "v1.0" - help - A string identifying the software version running on the device. - config DEVICE_SOFTWARE_VERSION_NUMBER int "Device Software Version Number" - default 1 + default 0 help Software version number running on the device. diff --git a/examples/all-clusters-app/esp32/CMakeLists.txt b/examples/all-clusters-app/esp32/CMakeLists.txt index de70f669cd1836..fad386531fb057 100644 --- a/examples/all-clusters-app/esp32/CMakeLists.txt +++ b/examples/all-clusters-app/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/all-clusters-minimal-app/esp32/CMakeLists.txt b/examples/all-clusters-minimal-app/esp32/CMakeLists.txt index ca7bbb5b25c0f9..a1d45e27a1df70 100644 --- a/examples/all-clusters-minimal-app/esp32/CMakeLists.txt +++ b/examples/all-clusters-minimal-app/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/bridge-app/esp32/CMakeLists.txt b/examples/bridge-app/esp32/CMakeLists.txt index 9ab16ea66bc35e..1e7c544310462c 100644 --- a/examples/bridge-app/esp32/CMakeLists.txt +++ b/examples/bridge-app/esp32/CMakeLists.txt @@ -15,6 +15,10 @@ # limitations under the License. cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/chef/esp32/CMakeLists.txt b/examples/chef/esp32/CMakeLists.txt index 683e111720f61f..1bb4915047133b 100644 --- a/examples/chef/esp32/CMakeLists.txt +++ b/examples/chef/esp32/CMakeLists.txt @@ -18,6 +18,9 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/../../common/cmake/idf_flashing.cmake) diff --git a/examples/light-switch-app/esp32/CMakeLists.txt b/examples/light-switch-app/esp32/CMakeLists.txt index 2fff0f04eea418..bf879bedfbbe1c 100644 --- a/examples/light-switch-app/esp32/CMakeLists.txt +++ b/examples/light-switch-app/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/../../common/cmake/idf_flashing.cmake) diff --git a/examples/lighting-app/esp32/CMakeLists.txt b/examples/lighting-app/esp32/CMakeLists.txt index 06359e838141bc..30d1000b51b198 100644 --- a/examples/lighting-app/esp32/CMakeLists.txt +++ b/examples/lighting-app/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/lock-app/esp32/CMakeLists.txt b/examples/lock-app/esp32/CMakeLists.txt index 13cc58a23025f3..0c557571f36513 100644 --- a/examples/lock-app/esp32/CMakeLists.txt +++ b/examples/lock-app/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/ota-provider-app/esp32/CMakeLists.txt b/examples/ota-provider-app/esp32/CMakeLists.txt index 16e469b44e2954..d9abb2fe27f3d3 100644 --- a/examples/ota-provider-app/esp32/CMakeLists.txt +++ b/examples/ota-provider-app/esp32/CMakeLists.txt @@ -18,6 +18,9 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/ota-requestor-app/esp32/CMakeLists.txt b/examples/ota-requestor-app/esp32/CMakeLists.txt index 7eccf3fdc0fb42..ca79dd4561b1aa 100644 --- a/examples/ota-requestor-app/esp32/CMakeLists.txt +++ b/examples/ota-requestor-app/esp32/CMakeLists.txt @@ -18,6 +18,9 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) +set(PROJECT_VER "v2.0") +set(PROJECT_VER_NUMBER 2) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/persistent-storage/esp32/CMakeLists.txt b/examples/persistent-storage/esp32/CMakeLists.txt index 946a07627d85ac..372d88c2729db1 100644 --- a/examples/persistent-storage/esp32/CMakeLists.txt +++ b/examples/persistent-storage/esp32/CMakeLists.txt @@ -16,6 +16,10 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/pigweed-app/esp32/CMakeLists.txt b/examples/pigweed-app/esp32/CMakeLists.txt index 1e04ace6022501..fd8c1787569120 100644 --- a/examples/pigweed-app/esp32/CMakeLists.txt +++ b/examples/pigweed-app/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/shell/esp32/CMakeLists.txt b/examples/shell/esp32/CMakeLists.txt index 36e26b691a7b4a..1b1c919acef6ee 100644 --- a/examples/shell/esp32/CMakeLists.txt +++ b/examples/shell/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_LIST_DIR}/third_party/connectedhomeip/examples/common/cmake/idf_flashing.cmake) diff --git a/examples/temperature-measurement-app/esp32/CMakeLists.txt b/examples/temperature-measurement-app/esp32/CMakeLists.txt index 57a4caddb4cb68..dd7332f9661b2d 100644 --- a/examples/temperature-measurement-app/esp32/CMakeLists.txt +++ b/examples/temperature-measurement-app/esp32/CMakeLists.txt @@ -18,6 +18,9 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + set(is_debug true CACHE BOOL "Optimization variable") if(NOT is_debug) set(SDKCONFIG_DEFAULTS "sdkconfig.optimize.defaults") diff --git a/src/platform/ESP32/BUILD.gn b/src/platform/ESP32/BUILD.gn index 7af8b309033771..1100de4948e5ed 100644 --- a/src/platform/ESP32/BUILD.gn +++ b/src/platform/ESP32/BUILD.gn @@ -23,8 +23,13 @@ declare_args() { # DeviceAttestationCredentialsProvider and DeviceInstanceInforProvider chip_use_factory_data_provider = false chip_use_device_info_provider = false + chip_config_software_version_number = 0 } +defines = [ + "CHIP_CONFIG_SOFTWARE_VERSION_NUMBER=${chip_config_software_version_number}", +] + static_library("ESP32") { sources = [ "../SingletonConfigurationManager.cpp", diff --git a/src/platform/ESP32/CHIPDevicePlatformConfig.h b/src/platform/ESP32/CHIPDevicePlatformConfig.h index c40cd8c565e11d..d2777360ee3922 100644 --- a/src/platform/ESP32/CHIPDevicePlatformConfig.h +++ b/src/platform/ESP32/CHIPDevicePlatformConfig.h @@ -44,8 +44,7 @@ #define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID CONFIG_DEVICE_PRODUCT_ID #define CHIP_DEVICE_CONFIG_DEVICE_TYPE CONFIG_DEVICE_TYPE #define CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION -#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING CONFIG_DEVICE_SOFTWARE_VERSION -#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION CONFIG_DEVICE_SOFTWARE_VERSION_NUMBER + #endif /* CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID */ #define CHIP_DEVICE_CONFIG_ENABLE_THREAD CONFIG_OPENTHREAD_ENABLED diff --git a/src/platform/ESP32/ConfigurationManagerImpl.cpp b/src/platform/ESP32/ConfigurationManagerImpl.cpp index 2cf42f7ed141d1..92adb755fb09e3 100644 --- a/src/platform/ESP32/ConfigurationManagerImpl.cpp +++ b/src/platform/ESP32/ConfigurationManagerImpl.cpp @@ -31,6 +31,7 @@ #include #include +#include "esp_ota_ops.h" #include "esp_wifi.h" #include "nvs.h" #include "nvs_flash.h" @@ -204,6 +205,22 @@ CHIP_ERROR ConfigurationManagerImpl::GetProductLabel(char * buf, size_t bufSize) return err; } +CHIP_ERROR ConfigurationManagerImpl::GetSoftwareVersionString(char * buf, size_t bufSize) +{ + memset(buf, 0, bufSize); + const esp_app_desc_t * appDescription = esp_ota_get_app_description(); + ReturnErrorCodeIf(bufSize < sizeof(appDescription->version), CHIP_ERROR_BUFFER_TOO_SMALL); + ReturnErrorCodeIf(sizeof(appDescription->version) > ConfigurationManager::kMaxSoftwareVersionStringLength, CHIP_ERROR_INTERNAL); + strcpy(buf, appDescription->version); + return CHIP_NO_ERROR; +} + +CHIP_ERROR ConfigurationManagerImpl::GetSoftwareVersion(uint32_t & softwareVer) +{ + softwareVer = CHIP_CONFIG_SOFTWARE_VERSION_NUMBER; + return CHIP_NO_ERROR; +} + CHIP_ERROR ConfigurationManagerImpl::GetPrimaryWiFiMACAddress(uint8_t * buf) { #if CHIP_DEVICE_CONFIG_ENABLE_WIFI diff --git a/src/platform/ESP32/ConfigurationManagerImpl.h b/src/platform/ESP32/ConfigurationManagerImpl.h index 2eaa5fac60c648..32f4951473349e 100644 --- a/src/platform/ESP32/ConfigurationManagerImpl.h +++ b/src/platform/ESP32/ConfigurationManagerImpl.h @@ -55,6 +55,8 @@ class ConfigurationManagerImpl : public Internal::GenericConfigurationManagerImp CHIP_ERROR StoreTotalOperationalHours(uint32_t totalOperationalHours) override; CHIP_ERROR GetProductURL(char * buf, size_t bufSize) override; CHIP_ERROR GetProductLabel(char * buf, size_t bufSize) override; + CHIP_ERROR GetSoftwareVersionString(char * buf, size_t bufSize); + CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override; static ConfigurationManagerImpl & GetDefaultInstance(); private: diff --git a/src/test_driver/esp32/CMakeLists.txt b/src/test_driver/esp32/CMakeLists.txt index 6955354e425482..8f303d7f2a572a 100644 --- a/src/test_driver/esp32/CMakeLists.txt +++ b/src/test_driver/esp32/CMakeLists.txt @@ -17,6 +17,10 @@ # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) + +set(PROJECT_VER "v1.0") +set(PROJECT_VER_NUMBER 1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/esp32_unit_tests.cmake) From 297397ca4478922300b242b0ac6c81eab36ae6e4 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 31 Aug 2022 11:31:10 -0400 Subject: [PATCH 19/27] Fix chip-build-vscode after #22022 (#22310) --- integrations/docker/images/chip-build-vscode/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/docker/images/chip-build-vscode/Dockerfile b/integrations/docker/images/chip-build-vscode/Dockerfile index 69cee1937a513c..a1dccdd53390d1 100644 --- a/integrations/docker/images/chip-build-vscode/Dockerfile +++ b/integrations/docker/images/chip-build-vscode/Dockerfile @@ -45,7 +45,7 @@ COPY --from=k32w /opt/sdk /opt/k32w_sdk COPY --from=imx /opt/fsl-imx-xwayland /opt/fsl-imx-xwayland -COPY --from=ti /opt/ti/sysconfig_1.11.0 /opt/ti/sysconfig_1.11.0 +COPY --from=ti /opt/ti/sysconfig_1.13.0 /opt/ti/sysconfig_1.13.0 COPY --from=zap /opt/zap /opt/zap @@ -88,7 +88,7 @@ ENV QEMU_ESP32_DIR=/opt/espressif/qemu ENV SYSROOT_AARCH64=/opt/ubuntu-21.04-aarch64-sysroot ENV TELINK_ZEPHYR_BASE=/opt/telink/zephyrproject/zephyr ENV TELINK_ZEPHYR_SDK_DIR=/opt/telink/zephyr-sdk-0.13.2 -ENV TI_SYSCONFIG_ROOT=/opt/ti/sysconfig_1.11.0 +ENV TI_SYSCONFIG_ROOT=/opt/ti/sysconfig_1.13.0 ENV ZEPHYR_BASE=/opt/NordicSemiconductor/nrfconnect/zephyr ENV ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb From f77eed54ce74c5d49d26a3ab175c5b4fb1e917ce Mon Sep 17 00:00:00 2001 From: Ricardo Casallas <77841255+rcasallas-silabs@users.noreply.github.com> Date: Wed, 31 Aug 2022 12:43:57 -0400 Subject: [PATCH 20/27] EFR32: PSA crypto validations fixed. (#22259) --- src/platform/EFR32/CHIPCryptoPALPsaEfr32.cpp | 90 +++++++++++++++----- src/platform/EFR32/Efr32PsaOpaqueKeypair.cpp | 2 + 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/platform/EFR32/CHIPCryptoPALPsaEfr32.cpp b/src/platform/EFR32/CHIPCryptoPALPsaEfr32.cpp index 0e86023c89d754..91137a58e10723 100644 --- a/src/platform/EFR32/CHIPCryptoPALPsaEfr32.cpp +++ b/src/platform/EFR32/CHIPCryptoPALPsaEfr32.cpp @@ -123,14 +123,34 @@ static bool _isValidTagLength(size_t tag_length) return false; } -static bool _isValidKeyLength(size_t length) -{ - // 16 bytes key for AES-CCM-128, 32 for AES-CCM-256 - if (length == 16 || length == 32) - { - return true; - } - return false; +/** + * @brief Compare two times + * + * @param t1 First time to compare + * @param t2 Second time to compare + * @return int 0 If both times are idential to the second, -1 if t1 < t2, 1 if t1 > t2. + */ +static int timeCompare(mbedtls_x509_time * t1, mbedtls_x509_time * t2) +{ + VerifyOrReturnValue(t1->year >= t2->year, -1); + VerifyOrReturnValue(t1->year <= t2->year, 1); + // Same year + VerifyOrReturnValue(t1->mon >= t2->mon, -1); + VerifyOrReturnValue(t1->mon <= t2->mon, 1); + // Same month + VerifyOrReturnValue(t1->day >= t2->day, -1); + VerifyOrReturnValue(t1->day <= t2->day, 1); + // Same day + VerifyOrReturnValue(t1->hour >= t2->hour, -1); + VerifyOrReturnValue(t1->hour <= t2->hour, 1); + // Same hour + VerifyOrReturnValue(t1->min >= t2->min, -1); + VerifyOrReturnValue(t1->min <= t2->min, 1); + // Same minute + VerifyOrReturnValue(t1->sec >= t2->sec, -1); + VerifyOrReturnValue(t1->sec <= t2->sec, 1); + // Same second + return 0; } CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, const uint8_t * aad, size_t aad_length, @@ -144,6 +164,15 @@ CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, c uint8_t * buffer = nullptr; bool allocated_buffer = false; + VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(key != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(nonce != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(nonce_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(CanCastTo(nonce_length), error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(tag != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); + // If the ciphertext and tag outputs aren't a contiguous buffer, the PSA API requires buffer copying if (Uint8::to_uchar(ciphertext) + plaintext_length != Uint8::to_uchar(tag)) { @@ -152,10 +181,6 @@ CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, c VerifyOrExit(buffer != nullptr, error = CHIP_ERROR_NO_MEMORY); } - // Superimpose tag and key length requirements. The other checks are done by the PSA implementation. - VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrExit(_isValidKeyLength(key_length), error = CHIP_ERROR_UNSUPPORTED_ENCRYPTION_TYPE); - psa_crypto_init(); psa_set_key_type(&attr, PSA_KEY_TYPE_AES); @@ -198,6 +223,13 @@ CHIP_ERROR AES_CCM_decrypt(const uint8_t * ciphertext, size_t ciphertext_len, co uint8_t * buffer = nullptr; bool allocated_buffer = false; + VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(tag != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(key != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(nonce != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrExit(nonce_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT); + // If the ciphertext and tag outputs aren't a contiguous buffer, the PSA API requires buffer copying if (Uint8::to_const_uchar(ciphertext) + ciphertext_len != Uint8::to_const_uchar(tag)) { @@ -206,10 +238,6 @@ CHIP_ERROR AES_CCM_decrypt(const uint8_t * ciphertext, size_t ciphertext_len, co VerifyOrExit(buffer != nullptr, error = CHIP_ERROR_NO_MEMORY); } - // Superimpose tag and key length requirements. The other checks are done by the PSA implementation. - VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT); - VerifyOrExit(_isValidKeyLength(key_length), error = CHIP_ERROR_UNSUPPORTED_ENCRYPTION_TYPE); - psa_crypto_init(); psa_set_key_type(&attr, PSA_KEY_TYPE_AES); @@ -302,6 +330,7 @@ CHIP_ERROR Hash_SHA256_stream::Begin(void) psa_crypto_init(); psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext); + *context = PSA_HASH_OPERATION_INIT; const psa_status_t result = psa_hash_setup(context, PSA_ALG_SHA_256); VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL); @@ -326,6 +355,8 @@ CHIP_ERROR Hash_SHA256_stream::GetDigest(MutableByteSpan & out_buffer) size_t output_length = 0; psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext); + VerifyOrReturnError(out_buffer.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL); + // Clone the context first since calculating the digest finishes the operation psa_hash_operation_t digest_context = PSA_HASH_OPERATION_INIT; status = psa_hash_clone(context, &digest_context); @@ -347,6 +378,7 @@ CHIP_ERROR Hash_SHA256_stream::Finish(MutableByteSpan & out_buffer) psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext); size_t output_length = 0; + VerifyOrReturnError(out_buffer.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL); const psa_status_t status = psa_hash_finish(context, Uint8::to_uchar(out_buffer.data()), out_buffer.size(), &output_length); VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL); @@ -506,8 +538,8 @@ CHIP_ERROR PBKDF2_sha256::pbkdf2_sha256(const uint8_t * password, size_t plen, c // U2 ends up in md1 // - status = psa_driver_wrapper_mac_compute(&attr, password, plen, PSA_ALG_HMAC(PSA_ALG_SHA_256), md1, sizeof(md1), md1, - sizeof(md1), &output_length); + status = psa_driver_wrapper_mac_compute(&attr, password, plen, PSA_ALG_HMAC(PSA_ALG_SHA_256), md1, sizeof(md1_buffer), + md1, sizeof(md1_buffer), &output_length); VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL); VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), error = CHIP_ERROR_INTERNAL); @@ -705,7 +737,7 @@ CHIP_ERROR P256PublicKey::ECDSA_validate_hash_signature(const uint8_t * hash, co status = psa_driver_wrapper_verify_hash(&attr, Uint8::to_const_uchar(*this), Length(), PSA_ALG_ECDSA(PSA_ALG_SHA_256), hash, hash_length, signature.ConstBytes(), signature.Length()); - VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL); + VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INVALID_SIGNATURE); exit: _log_PSA_error(status); psa_reset_key_attributes(&attr); @@ -1275,8 +1307,12 @@ CHIP_ERROR ValidateCertificateChain(const uint8_t * rootCertificate, size_t root CHIP_ERROR error = CHIP_NO_ERROR; mbedtls_x509_crt certChain; mbedtls_x509_crt rootCert; + mbedtls_x509_time leaf_valid_from; + mbedtls_x509_crt * cert = NULL; int mbedResult; uint32_t flags; + int compare_from = 0; + int compare_until = 0; result = CertificateChainValidationResult::kInternalFrameworkError; @@ -1293,6 +1329,7 @@ CHIP_ERROR ValidateCertificateChain(const uint8_t * rootCertificate, size_t root /* Start of chain */ mbedResult = mbedtls_x509_crt_parse(&certChain, Uint8::to_const_uchar(leafCertificate), leafCertificateLen); VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kLeafFormatInvalid, error = CHIP_ERROR_INTERNAL)); + leaf_valid_from = certChain.valid_from; /* Add the intermediate to the chain */ mbedResult = mbedtls_x509_crt_parse(&certChain, Uint8::to_const_uchar(caCertificate), caCertificateLen); @@ -1302,6 +1339,21 @@ CHIP_ERROR ValidateCertificateChain(const uint8_t * rootCertificate, size_t root mbedResult = mbedtls_x509_crt_parse(&rootCert, Uint8::to_const_uchar(rootCertificate), rootCertificateLen); VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kRootFormatInvalid, error = CHIP_ERROR_INTERNAL)); + /* Validates that intermediate and root certificates are valid at the time of the leaf certificate's start time. */ + compare_from = timeCompare(&leaf_valid_from, &rootCert.valid_from); + compare_until = timeCompare(&leaf_valid_from, &rootCert.valid_to); + VerifyOrExit((compare_from >= 0) && (compare_until <= 0), + (result = CertificateChainValidationResult::kChainInvalid, error = CHIP_ERROR_CERT_NOT_TRUSTED)); + cert = certChain.next; + while (cert) + { + compare_from = timeCompare(&leaf_valid_from, &cert->valid_from); + compare_until = timeCompare(&leaf_valid_from, &cert->valid_to); + VerifyOrExit((compare_from >= 0) && (compare_until <= 0), + (result = CertificateChainValidationResult::kChainInvalid, error = CHIP_ERROR_CERT_NOT_TRUSTED)); + cert = cert->next; + } + /* Verify the chain against the root */ mbedResult = mbedtls_x509_crt_verify(&certChain, &rootCert, NULL, NULL, &flags, NULL, NULL); diff --git a/src/platform/EFR32/Efr32PsaOpaqueKeypair.cpp b/src/platform/EFR32/Efr32PsaOpaqueKeypair.cpp index da72af848bab51..ae9a0f66c13cad 100644 --- a/src/platform/EFR32/Efr32PsaOpaqueKeypair.cpp +++ b/src/platform/EFR32/Efr32PsaOpaqueKeypair.cpp @@ -417,6 +417,8 @@ CHIP_ERROR EFR32OpaqueP256Keypair::ECDSA_sign_msg(const uint8_t * msg, size_t ms CHIP_ERROR error = CHIP_NO_ERROR; size_t output_length = 0; + VerifyOrExit((msg != nullptr) && (msg_length > 0), error = CHIP_ERROR_INVALID_ARGUMENT); + error = Sign(msg, msg_length, out_signature.Bytes(), out_signature.Capacity(), &output_length); SuccessOrExit(error); From 1af4af09319fea47816936a2ee8649c1e4a7913b Mon Sep 17 00:00:00 2001 From: rgoliver Date: Wed, 31 Aug 2022 13:16:13 -0400 Subject: [PATCH 21/27] OTA: Fix linux BlockEOF with data length zero (#22309) Spec indicates BlockEOF May have data length zero. --- src/platform/Linux/OTAImageProcessorImpl.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/platform/Linux/OTAImageProcessorImpl.cpp b/src/platform/Linux/OTAImageProcessorImpl.cpp index 51a1a7bf5d650b..4b6695f1fe7d13 100644 --- a/src/platform/Linux/OTAImageProcessorImpl.cpp +++ b/src/platform/Linux/OTAImageProcessorImpl.cpp @@ -68,11 +68,6 @@ CHIP_ERROR OTAImageProcessorImpl::ProcessBlock(ByteSpan & block) return CHIP_ERROR_INTERNAL; } - if ((block.data() == nullptr) || block.empty()) - { - return CHIP_ERROR_INVALID_ARGUMENT; - } - // Store block data for HandleProcessBlock to access CHIP_ERROR err = SetBlock(block); if (err != CHIP_NO_ERROR) From 2288333687b332ee599333fffa726fc09ea88e0a Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 31 Aug 2022 13:21:28 -0400 Subject: [PATCH 22/27] Fix crashes when last controller is shut down while a PASE session is outstanding. (#22282) Commissioner shutdown shuts down the CASE sessions associated with the commissioner, but not the PASE sessions. Those sessions then get shut down much later in shutdown, at which point various objects that are needed to handle the shutdown are no longer present. The fix is to shut down PASE sessions when we destroy CommissioneeDeviceProxy objects, and ensure that we always destroy CommissioneeDeviceProxy via ReleaseCommissioneeDevice, so we don't end up with dangling pointers to the objects. Fixes https://github.com/project-chip/connectedhomeip/issues/16440 Should vastly improve, if not completely fix, https://github.com/project-chip/connectedhomeip/issues/20880 --- src/controller/CHIPDeviceController.cpp | 27 ++++++++++------------ src/controller/CommissioneeDeviceProxy.cpp | 9 +++++++- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index 0bf9ee911359d9..b62ae41e823d8e 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -489,19 +489,13 @@ void DeviceCommissioner::Shutdown() } #endif // CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY - // If we have a commissionee device for the device being commissioned, - // release it now, before we release our whole commissionee pool. - if (mDeviceBeingCommissioned != nullptr) - { - auto * commissionee = FindCommissioneeDevice(mDeviceBeingCommissioned->GetDeviceId()); - if (commissionee) - { - ReleaseCommissioneeDevice(commissionee); - } - } - - // Release everything from the commissionee device pool here. DeviceController::Shutdown releases operational. - mCommissioneeDevicePool.ReleaseAll(); + // Release everything from the commissionee device pool here. + // Make sure to use ReleaseCommissioneeDevice so we don't keep dangling + // pointers to the device objects. + mCommissioneeDevicePool.ForEachActiveObject([this](auto * commissioneeDevice) { + ReleaseCommissioneeDevice(commissioneeDevice); + return Loop::Continue; + }); DeviceController::Shutdown(); } @@ -539,8 +533,6 @@ CommissioneeDeviceProxy * DeviceCommissioner::FindCommissioneeDevice(const Trans void DeviceCommissioner::ReleaseCommissioneeDevice(CommissioneeDeviceProxy * device) { - // TODO: Call CloseSession here see #16440 and #16805 (blocking) - #if CONFIG_NETWORK_LAYER_BLE if (mSystemState->BleLayer() != nullptr && device->GetDeviceTransportType() == Transport::Type::kBle) { @@ -559,6 +551,11 @@ void DeviceCommissioner::ReleaseCommissioneeDevice(CommissioneeDeviceProxy * dev { mDeviceBeingCommissioned = nullptr; } + + // Release the commissionee device after we have nulled out our pointers, + // because that can call back in to us with error notifications as the + // session is released. + mCommissioneeDevicePool.ReleaseObject(device); } CHIP_ERROR DeviceCommissioner::GetDeviceBeingCommissioned(NodeId deviceId, CommissioneeDeviceProxy ** out_device) diff --git a/src/controller/CommissioneeDeviceProxy.cpp b/src/controller/CommissioneeDeviceProxy.cpp index af312f7cf27ca4..45a14eed62a356 100644 --- a/src/controller/CommissioneeDeviceProxy.cpp +++ b/src/controller/CommissioneeDeviceProxy.cpp @@ -109,7 +109,14 @@ CHIP_ERROR CommissioneeDeviceProxy::SetConnected(const SessionHandle & session) return CHIP_NO_ERROR; } -CommissioneeDeviceProxy::~CommissioneeDeviceProxy() {} +CommissioneeDeviceProxy::~CommissioneeDeviceProxy() +{ + auto session = GetSecureSession(); + if (session.HasValue()) + { + session.Value()->AsSecureSession()->MarkForEviction(); + } +} CHIP_ERROR CommissioneeDeviceProxy::SetPeerId(ByteSpan rcac, ByteSpan noc) { From 04eeef1e27efd3d5b9ef3d44f67ddc4a5fdfa028 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 31 Aug 2022 13:27:30 -0400 Subject: [PATCH 23/27] Fix chunking of ACL reads. (#22267) The chunking mechanism relies on errors being propagated as-is from the encoder to the caller of AttributeAccessInterface::Read. So we don't want to do any error mapping on the read errors, unlike write errors. --- .../access-control-server/access-control-server.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/clusters/access-control-server/access-control-server.cpp b/src/app/clusters/access-control-server/access-control-server.cpp index 988f082c8c7cf2..3e3122390c8abb 100644 --- a/src/app/clusters/access-control-server/access-control-server.cpp +++ b/src/app/clusters/access-control-server/access-control-server.cpp @@ -461,7 +461,11 @@ CHIP_ERROR ChipErrorToImErrorMap(CHIP_ERROR err) CHIP_ERROR AccessControlAttribute::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) { - return ChipErrorToImErrorMap(ReadImpl(aPath, aEncoder)); + // Note: We are not generating any errors under ReadImpl ourselves; it's + // just the IM encoding machinery that does it. And we should propagate + // those errors through as-is, without mapping them to other errors, because + // they are used to communicate various state within said enoding machinery. + return ReadImpl(aPath, aEncoder); } CHIP_ERROR AccessControlAttribute::Write(const ConcreteDataAttributePath & aPath, AttributeValueDecoder & aDecoder) From 3cb6025e6ac350e61bb02c81fab532aaefbee4e4 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Wed, 31 Aug 2022 15:20:02 -0400 Subject: [PATCH 24/27] Map CHIP_ERROR_FABRIC_EXISTS into a dedicated Darwin error code. (#22271) This allows detection of this case without having to examine the "underlyingError" of the NSError's userInfo. Fixes https://github.com/project-chip/connectedhomeip/issues/22214 --- src/darwin/Framework/CHIP/MTRError.h | 14 +++++++++++--- src/darwin/Framework/CHIP/MTRError.mm | 5 +++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRError.h b/src/darwin/Framework/CHIP/MTRError.h index 7dc123f2792806..d0c91185b3de41 100644 --- a/src/darwin/Framework/CHIP/MTRError.h +++ b/src/darwin/Framework/CHIP/MTRError.h @@ -23,12 +23,15 @@ FOUNDATION_EXPORT NSErrorDomain const MTRErrorDomain; FOUNDATION_EXPORT NSErrorDomain const MTRInteractionErrorDomain; /** - * ChipErrorDomain contains errors caused by data processing the framework + * MTRErrorDomain contains errors caused by data processing the framework * itself is performing. These can be caused by invalid values provided to a * framework API, failure to decode an incoming message, and so forth. * - * Errors reported by the other side of a Matter interaction use - * MTRInteractionErrorDomain instead. + * This error domain also contains errors that are communicated via success + * responses from a server but mapped to an error on the client. + * + * Errors reported by the server side of a Matter interaction via the normal + * Matter error-reporting mechanisms use MTRInteractionErrorDomain instead. */ // clang-format off typedef NS_ERROR_ENUM(MTRErrorDomain, MTRErrorCode){ @@ -51,6 +54,11 @@ typedef NS_ERROR_ENUM(MTRErrorDomain, MTRErrorCode){ MTRErrorCodeIntegrityCheckFailed = 8, MTRErrorCodeTimeout = 9, MTRErrorCodeBufferTooSmall = 10, + /** + * MTRErrorCodeFabricExists is returned when trying to commission a device + * into a fabric when it's already part of that fabric. + */ + MTRErrorCodeFabricExists = 11, }; // clang-format on diff --git a/src/darwin/Framework/CHIP/MTRError.mm b/src/darwin/Framework/CHIP/MTRError.mm index 153b034d54035b..00bd61d30bb995 100644 --- a/src/darwin/Framework/CHIP/MTRError.mm +++ b/src/darwin/Framework/CHIP/MTRError.mm @@ -80,6 +80,11 @@ + (NSError *)errorForCHIPErrorCode:(CHIP_ERROR)errorCode } else if (errorCode == CHIP_ERROR_BUFFER_TOO_SMALL) { code = MTRErrorCodeBufferTooSmall; [userInfo addEntriesFromDictionary:@{ NSLocalizedDescriptionKey : NSLocalizedString(@"A buffer is too small.", nil) }]; + } else if (errorCode == CHIP_ERROR_FABRIC_EXISTS) { + code = MTRErrorCodeFabricExists; + [userInfo addEntriesFromDictionary:@{ + NSLocalizedDescriptionKey : NSLocalizedString(@"The device is already a member of this fabric.", nil) + }]; } else { code = MTRErrorCodeGeneralError; [userInfo addEntriesFromDictionary:@{ From 6ecdff3ff5852c8b2812eaa4de27e81446385f64 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 31 Aug 2022 15:51:15 -0400 Subject: [PATCH 25/27] Switch stalebot to apply less on issues, for 1.0 stabilization (#22283) --- .github/stale.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/stale.yml b/.github/stale.yml index 2188a6b0b75385..4f6adeea522da6 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -9,10 +9,10 @@ staleLabel: stale pulls: # Number of days of inactivity before a pull request becomes stale - daysUntilStale: 7 + daysUntilStale: 60 # Number of days of inactivity before a stale pull request is closed - daysUntilClose: 7 + daysUntilClose: 30 # Comment to post when marking a pull request as stale. Set to `false` to disable markComment: > From 46443b01ab751105140fa2657202601e110180e4 Mon Sep 17 00:00:00 2001 From: Yufeng Wang Date: Wed, 31 Aug 2022 12:58:44 -0700 Subject: [PATCH 26/27] Disable faultinjection cluster in Darwin and Android API surface (#22289) * Disable faultinjection cluster in Darwin and Android API surface. * Run codegen --- .../data_model/controller-clusters.matter | 27 - .../data_model/controller-clusters.zap | 2 +- .../CHIPAttributeTLVValueDecoder.cpp | 112 ---- .../java/zap-generated/CHIPCallbackTypes.h | 11 - .../CHIPEventTLVValueDecoder.cpp | 10 - .../java/zap-generated/CHIPReadCallbacks.cpp | 213 -------- .../java/zap-generated/CHIPReadCallbacks.h | 90 ---- .../chip/devicecontroller/ChipClusters.java | 159 ------ .../chip/devicecontroller/ChipIdLookup.java | 24 - .../devicecontroller/ClusterInfoMapping.java | 123 ----- .../devicecontroller/ClusterReadMapping.java | 75 --- .../devicecontroller/ClusterWriteMapping.java | 2 - .../python/chip/clusters/CHIPClusters.py | 51 -- .../MTRAttributeTLVValueDecoder.mm | 109 ---- .../CHIP/zap-generated/MTRBaseClusters.h | 111 ---- .../CHIP/zap-generated/MTRBaseClusters.mm | 431 ---------------- .../zap-generated/MTRBaseClusters_internal.h | 5 - .../CHIP/zap-generated/MTRCallbackBridge.mm | 117 ----- .../MTRCallbackBridge_internal.h | 150 ------ .../CHIP/zap-generated/MTRClusters.h | 34 -- .../CHIP/zap-generated/MTRClusters.mm | 129 ----- .../CHIP/zap-generated/MTRClusters_internal.h | 5 - .../zap-generated/MTREventTLVValueDecoder.mm | 10 - .../cluster/logging/DataModelLogger.cpp | 31 -- .../zap-generated/CHIPClientCallbacks.h | 6 - .../zap-generated/CHIPClusters.h | 9 - .../PluginApplicationCallbacks.h | 3 +- .../zap-generated/callback-stub.cpp | 8 - .../zap-generated/endpoint_config.h | 15 +- .../zap-generated/gen_config.h | 5 - .../zap-generated/cluster/Commands.h | 479 ------------------ 31 files changed, 4 insertions(+), 2552 deletions(-) diff --git a/src/controller/data_model/controller-clusters.matter b/src/controller/data_model/controller-clusters.matter index 2d71e362638858..962b8b5f65b57b 100644 --- a/src/controller/data_model/controller-clusters.matter +++ b/src/controller/data_model/controller-clusters.matter @@ -4387,32 +4387,6 @@ client cluster TestCluster = 4294048773 { command TestEmitTestEventRequest(TestEmitTestEventRequestRequest): TestEmitTestEventResponse = 20; } -client cluster FaultInjection = 4294048774 { - enum FaultType : ENUM8 { - kUnspecified = 0; - kSystemFault = 1; - kInetFault = 2; - kChipFault = 3; - kCertFault = 4; - } - - readonly attribute command_id generatedCommandList[] = 65528; - readonly attribute command_id acceptedCommandList[] = 65529; - readonly attribute attrib_id attributeList[] = 65531; - readonly attribute bitmap32 featureMap = 65532; - readonly attribute int16u clusterRevision = 65533; - - request struct FailAtFaultRequest { - FaultType type = 0; - INT32U id = 1; - INT32U numCallsToSkip = 2; - INT32U numCallsToFail = 3; - BOOLEAN takeMutex = 4; - } - - command access(invoke: manage) FailAtFault(FailAtFaultRequest): DefaultSuccess = 0; -} - endpoint 1 { device type rootdevice = 22; binding cluster Identify; @@ -4480,7 +4454,6 @@ endpoint 1 { binding cluster AccountLogin; binding cluster ElectricalMeasurement; binding cluster TestCluster; - binding cluster FaultInjection; } diff --git a/src/controller/data_model/controller-clusters.zap b/src/controller/data_model/controller-clusters.zap index 88b9b7cc085330..ca5ff6e5217ec9 100644 --- a/src/controller/data_model/controller-clusters.zap +++ b/src/controller/data_model/controller-clusters.zap @@ -19408,7 +19408,7 @@ "mfgCode": null, "define": "FAULT_INJECTION_CLUSTER", "side": "client", - "enabled": 1, + "enabled": 0, "commands": [ { "name": "FailAtFault", diff --git a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp index d20ce4a2f36cf0..260e8cd358f8e4 100644 --- a/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp +++ b/src/controller/java/zap-generated/CHIPAttributeTLVValueDecoder.cpp @@ -19485,118 +19485,6 @@ jobject DecodeAttributeValue(const app::ConcreteAttributePath & aPath, TLV::TLVR } break; } - case app::Clusters::FaultInjection::Id: { - using namespace app::Clusters::FaultInjection; - switch (aPath.mAttributeId) - { - case Attributes::GeneratedCommandList::Id: { - using TypeInfo = Attributes::GeneratedCommandList::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = app::DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) - { - return nullptr; - } - jobject value; - chip::JniReferences::GetInstance().CreateArrayList(value); - - auto iter_value_0 = cppValue.begin(); - while (iter_value_0.Next()) - { - auto & entry_0 = iter_value_0.GetValue(); - jobject newElement_0; - std::string newElement_0ClassName = "java/lang/Long"; - std::string newElement_0CtorSignature = "(J)V"; - chip::JniReferences::GetInstance().CreateBoxedObject( - newElement_0ClassName.c_str(), newElement_0CtorSignature.c_str(), entry_0, newElement_0); - chip::JniReferences::GetInstance().AddToList(value, newElement_0); - } - return value; - } - case Attributes::AcceptedCommandList::Id: { - using TypeInfo = Attributes::AcceptedCommandList::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = app::DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) - { - return nullptr; - } - jobject value; - chip::JniReferences::GetInstance().CreateArrayList(value); - - auto iter_value_0 = cppValue.begin(); - while (iter_value_0.Next()) - { - auto & entry_0 = iter_value_0.GetValue(); - jobject newElement_0; - std::string newElement_0ClassName = "java/lang/Long"; - std::string newElement_0CtorSignature = "(J)V"; - chip::JniReferences::GetInstance().CreateBoxedObject( - newElement_0ClassName.c_str(), newElement_0CtorSignature.c_str(), entry_0, newElement_0); - chip::JniReferences::GetInstance().AddToList(value, newElement_0); - } - return value; - } - case Attributes::AttributeList::Id: { - using TypeInfo = Attributes::AttributeList::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = app::DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) - { - return nullptr; - } - jobject value; - chip::JniReferences::GetInstance().CreateArrayList(value); - - auto iter_value_0 = cppValue.begin(); - while (iter_value_0.Next()) - { - auto & entry_0 = iter_value_0.GetValue(); - jobject newElement_0; - std::string newElement_0ClassName = "java/lang/Long"; - std::string newElement_0CtorSignature = "(J)V"; - chip::JniReferences::GetInstance().CreateBoxedObject( - newElement_0ClassName.c_str(), newElement_0CtorSignature.c_str(), entry_0, newElement_0); - chip::JniReferences::GetInstance().AddToList(value, newElement_0); - } - return value; - } - case Attributes::FeatureMap::Id: { - using TypeInfo = Attributes::FeatureMap::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = app::DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) - { - return nullptr; - } - jobject value; - std::string valueClassName = "java/lang/Long"; - std::string valueCtorSignature = "(J)V"; - chip::JniReferences::GetInstance().CreateBoxedObject(valueClassName.c_str(), valueCtorSignature.c_str(), - cppValue, value); - return value; - } - case Attributes::ClusterRevision::Id: { - using TypeInfo = Attributes::ClusterRevision::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = app::DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) - { - return nullptr; - } - jobject value; - std::string valueClassName = "java/lang/Integer"; - std::string valueCtorSignature = "(I)V"; - chip::JniReferences::GetInstance().CreateBoxedObject(valueClassName.c_str(), valueCtorSignature.c_str(), - cppValue, value); - return value; - } - default: - *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB; - break; - } - break; - } default: *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB; break; diff --git a/src/controller/java/zap-generated/CHIPCallbackTypes.h b/src/controller/java/zap-generated/CHIPCallbackTypes.h index cf42bf39d28966..be01149ef4bc17 100644 --- a/src/controller/java/zap-generated/CHIPCallbackTypes.h +++ b/src/controller/java/zap-generated/CHIPCallbackTypes.h @@ -1963,14 +1963,3 @@ typedef void (*CHIPTestClusterClusterFeatureMapAttributeCallbackType)( void *, chip::app::Clusters::TestCluster::Attributes::FeatureMap::TypeInfo::DecodableArgType); typedef void (*CHIPTestClusterClusterClusterRevisionAttributeCallbackType)( void *, chip::app::Clusters::TestCluster::Attributes::ClusterRevision::TypeInfo::DecodableArgType); - -typedef void (*CHIPFaultInjectionClusterGeneratedCommandListAttributeCallbackType)( - void *, const chip::app::Clusters::FaultInjection::Attributes::GeneratedCommandList::TypeInfo::DecodableType &); -typedef void (*CHIPFaultInjectionClusterAcceptedCommandListAttributeCallbackType)( - void *, const chip::app::Clusters::FaultInjection::Attributes::AcceptedCommandList::TypeInfo::DecodableType &); -typedef void (*CHIPFaultInjectionClusterAttributeListAttributeCallbackType)( - void *, const chip::app::Clusters::FaultInjection::Attributes::AttributeList::TypeInfo::DecodableType &); -typedef void (*CHIPFaultInjectionClusterFeatureMapAttributeCallbackType)( - void *, chip::app::Clusters::FaultInjection::Attributes::FeatureMap::TypeInfo::DecodableArgType); -typedef void (*CHIPFaultInjectionClusterClusterRevisionAttributeCallbackType)( - void *, chip::app::Clusters::FaultInjection::Attributes::ClusterRevision::TypeInfo::DecodableArgType); diff --git a/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp b/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp index 411028f4237550..fcdb5b536f65a1 100644 --- a/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp +++ b/src/controller/java/zap-generated/CHIPEventTLVValueDecoder.cpp @@ -3495,16 +3495,6 @@ jobject DecodeEventValue(const app::ConcreteEventPath & aPath, TLV::TLVReader & } break; } - case app::Clusters::FaultInjection::Id: { - using namespace app::Clusters::FaultInjection; - switch (aPath.mEventId) - { - default: - *aError = CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB; - break; - } - break; - } default: *aError = CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB; break; diff --git a/src/controller/java/zap-generated/CHIPReadCallbacks.cpp b/src/controller/java/zap-generated/CHIPReadCallbacks.cpp index d6c410be3f605e..a9920f27d7b78a 100644 --- a/src/controller/java/zap-generated/CHIPReadCallbacks.cpp +++ b/src/controller/java/zap-generated/CHIPReadCallbacks.cpp @@ -29260,216 +29260,3 @@ void CHIPTestClusterAttributeListAttributeCallback::CallbackFn(void * context, env->ExceptionClear(); env->CallVoidMethod(javaCallbackRef, javaMethod, arrayListObj); } - -CHIPFaultInjectionGeneratedCommandListAttributeCallback::CHIPFaultInjectionGeneratedCommandListAttributeCallback( - jobject javaCallback, bool keepAlive) : - chip::Callback::Callback(CallbackFn, this), - keepAlive(keepAlive) -{ - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - if (env == nullptr) - { - ChipLogError(Zcl, "Could not create global reference for Java callback"); - return; - } - - javaCallbackRef = env->NewGlobalRef(javaCallback); - if (javaCallbackRef == nullptr) - { - ChipLogError(Zcl, "Could not create global reference for Java callback"); - } -} - -CHIPFaultInjectionGeneratedCommandListAttributeCallback::~CHIPFaultInjectionGeneratedCommandListAttributeCallback() -{ - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - if (env == nullptr) - { - ChipLogError(Zcl, "Could not delete global reference for Java callback"); - return; - } - env->DeleteGlobalRef(javaCallbackRef); -} - -void CHIPFaultInjectionGeneratedCommandListAttributeCallback::CallbackFn( - void * context, const chip::app::DataModel::DecodableList & list) -{ - chip::DeviceLayer::StackUnlock unlock; - CHIP_ERROR err = CHIP_NO_ERROR; - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - jobject javaCallbackRef; - - VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNI env")); - - std::unique_ptr cppCallback( - reinterpret_cast(context), maybeDestroy); - - // It's valid for javaCallbackRef to be nullptr if the Java code passed in a null callback. - javaCallbackRef = cppCallback.get()->javaCallbackRef; - VerifyOrReturn(javaCallbackRef != nullptr, - ChipLogProgress(Zcl, "Early return from attribute callback since Java callback is null")); - - jmethodID javaMethod; - err = chip::JniReferences::GetInstance().FindMethod(env, javaCallbackRef, "onSuccess", "(Ljava/util/List;)V", &javaMethod); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Could not find onSuccess() method")); - - jobject arrayListObj; - chip::JniReferences::GetInstance().CreateArrayList(arrayListObj); - - auto iter_arrayListObj_0 = list.begin(); - while (iter_arrayListObj_0.Next()) - { - auto & entry_0 = iter_arrayListObj_0.GetValue(); - jobject newElement_0; - std::string newElement_0ClassName = "java/lang/Long"; - std::string newElement_0CtorSignature = "(J)V"; - chip::JniReferences::GetInstance().CreateBoxedObject(newElement_0ClassName.c_str(), - newElement_0CtorSignature.c_str(), entry_0, newElement_0); - chip::JniReferences::GetInstance().AddToList(arrayListObj, newElement_0); - } - - env->ExceptionClear(); - env->CallVoidMethod(javaCallbackRef, javaMethod, arrayListObj); -} - -CHIPFaultInjectionAcceptedCommandListAttributeCallback::CHIPFaultInjectionAcceptedCommandListAttributeCallback(jobject javaCallback, - bool keepAlive) : - chip::Callback::Callback(CallbackFn, this), - keepAlive(keepAlive) -{ - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - if (env == nullptr) - { - ChipLogError(Zcl, "Could not create global reference for Java callback"); - return; - } - - javaCallbackRef = env->NewGlobalRef(javaCallback); - if (javaCallbackRef == nullptr) - { - ChipLogError(Zcl, "Could not create global reference for Java callback"); - } -} - -CHIPFaultInjectionAcceptedCommandListAttributeCallback::~CHIPFaultInjectionAcceptedCommandListAttributeCallback() -{ - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - if (env == nullptr) - { - ChipLogError(Zcl, "Could not delete global reference for Java callback"); - return; - } - env->DeleteGlobalRef(javaCallbackRef); -} - -void CHIPFaultInjectionAcceptedCommandListAttributeCallback::CallbackFn( - void * context, const chip::app::DataModel::DecodableList & list) -{ - chip::DeviceLayer::StackUnlock unlock; - CHIP_ERROR err = CHIP_NO_ERROR; - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - jobject javaCallbackRef; - - VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNI env")); - - std::unique_ptr cppCallback( - reinterpret_cast(context), maybeDestroy); - - // It's valid for javaCallbackRef to be nullptr if the Java code passed in a null callback. - javaCallbackRef = cppCallback.get()->javaCallbackRef; - VerifyOrReturn(javaCallbackRef != nullptr, - ChipLogProgress(Zcl, "Early return from attribute callback since Java callback is null")); - - jmethodID javaMethod; - err = chip::JniReferences::GetInstance().FindMethod(env, javaCallbackRef, "onSuccess", "(Ljava/util/List;)V", &javaMethod); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Could not find onSuccess() method")); - - jobject arrayListObj; - chip::JniReferences::GetInstance().CreateArrayList(arrayListObj); - - auto iter_arrayListObj_0 = list.begin(); - while (iter_arrayListObj_0.Next()) - { - auto & entry_0 = iter_arrayListObj_0.GetValue(); - jobject newElement_0; - std::string newElement_0ClassName = "java/lang/Long"; - std::string newElement_0CtorSignature = "(J)V"; - chip::JniReferences::GetInstance().CreateBoxedObject(newElement_0ClassName.c_str(), - newElement_0CtorSignature.c_str(), entry_0, newElement_0); - chip::JniReferences::GetInstance().AddToList(arrayListObj, newElement_0); - } - - env->ExceptionClear(); - env->CallVoidMethod(javaCallbackRef, javaMethod, arrayListObj); -} - -CHIPFaultInjectionAttributeListAttributeCallback::CHIPFaultInjectionAttributeListAttributeCallback(jobject javaCallback, - bool keepAlive) : - chip::Callback::Callback(CallbackFn, this), - keepAlive(keepAlive) -{ - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - if (env == nullptr) - { - ChipLogError(Zcl, "Could not create global reference for Java callback"); - return; - } - - javaCallbackRef = env->NewGlobalRef(javaCallback); - if (javaCallbackRef == nullptr) - { - ChipLogError(Zcl, "Could not create global reference for Java callback"); - } -} - -CHIPFaultInjectionAttributeListAttributeCallback::~CHIPFaultInjectionAttributeListAttributeCallback() -{ - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - if (env == nullptr) - { - ChipLogError(Zcl, "Could not delete global reference for Java callback"); - return; - } - env->DeleteGlobalRef(javaCallbackRef); -} - -void CHIPFaultInjectionAttributeListAttributeCallback::CallbackFn( - void * context, const chip::app::DataModel::DecodableList & list) -{ - chip::DeviceLayer::StackUnlock unlock; - CHIP_ERROR err = CHIP_NO_ERROR; - JNIEnv * env = chip::JniReferences::GetInstance().GetEnvForCurrentThread(); - jobject javaCallbackRef; - - VerifyOrReturn(env != nullptr, ChipLogError(Zcl, "Could not get JNI env")); - - std::unique_ptr cppCallback( - reinterpret_cast(context), maybeDestroy); - - // It's valid for javaCallbackRef to be nullptr if the Java code passed in a null callback. - javaCallbackRef = cppCallback.get()->javaCallbackRef; - VerifyOrReturn(javaCallbackRef != nullptr, - ChipLogProgress(Zcl, "Early return from attribute callback since Java callback is null")); - - jmethodID javaMethod; - err = chip::JniReferences::GetInstance().FindMethod(env, javaCallbackRef, "onSuccess", "(Ljava/util/List;)V", &javaMethod); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Could not find onSuccess() method")); - - jobject arrayListObj; - chip::JniReferences::GetInstance().CreateArrayList(arrayListObj); - - auto iter_arrayListObj_0 = list.begin(); - while (iter_arrayListObj_0.Next()) - { - auto & entry_0 = iter_arrayListObj_0.GetValue(); - jobject newElement_0; - std::string newElement_0ClassName = "java/lang/Long"; - std::string newElement_0CtorSignature = "(J)V"; - chip::JniReferences::GetInstance().CreateBoxedObject(newElement_0ClassName.c_str(), - newElement_0CtorSignature.c_str(), entry_0, newElement_0); - chip::JniReferences::GetInstance().AddToList(arrayListObj, newElement_0); - } - - env->ExceptionClear(); - env->CallVoidMethod(javaCallbackRef, javaMethod, arrayListObj); -} diff --git a/src/controller/java/zap-generated/CHIPReadCallbacks.h b/src/controller/java/zap-generated/CHIPReadCallbacks.h index d1a4b63b04c84e..6f80ffb6323ef8 100644 --- a/src/controller/java/zap-generated/CHIPReadCallbacks.h +++ b/src/controller/java/zap-generated/CHIPReadCallbacks.h @@ -12075,93 +12075,3 @@ class CHIPTestClusterAttributeListAttributeCallback jobject javaCallbackRef; bool keepAlive; }; - -class CHIPFaultInjectionGeneratedCommandListAttributeCallback - : public chip::Callback::Callback -{ -public: - CHIPFaultInjectionGeneratedCommandListAttributeCallback(jobject javaCallback, bool keepAlive = false); - - ~CHIPFaultInjectionGeneratedCommandListAttributeCallback(); - - static void maybeDestroy(CHIPFaultInjectionGeneratedCommandListAttributeCallback * callback) - { - if (!callback->keepAlive) - { - callback->Cancel(); - chip::Platform::Delete(callback); - } - } - - static void CallbackFn(void * context, const chip::app::DataModel::DecodableList & list); - static void OnSubscriptionEstablished(void * context) - { - CHIP_ERROR err = chip::JniReferences::GetInstance().CallSubscriptionEstablished( - reinterpret_cast(context)->javaCallbackRef); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Error calling onSubscriptionEstablished: %s", ErrorStr(err))); - }; - -private: - jobject javaCallbackRef; - bool keepAlive; -}; - -class CHIPFaultInjectionAcceptedCommandListAttributeCallback - : public chip::Callback::Callback -{ -public: - CHIPFaultInjectionAcceptedCommandListAttributeCallback(jobject javaCallback, bool keepAlive = false); - - ~CHIPFaultInjectionAcceptedCommandListAttributeCallback(); - - static void maybeDestroy(CHIPFaultInjectionAcceptedCommandListAttributeCallback * callback) - { - if (!callback->keepAlive) - { - callback->Cancel(); - chip::Platform::Delete(callback); - } - } - - static void CallbackFn(void * context, const chip::app::DataModel::DecodableList & list); - static void OnSubscriptionEstablished(void * context) - { - CHIP_ERROR err = chip::JniReferences::GetInstance().CallSubscriptionEstablished( - reinterpret_cast(context)->javaCallbackRef); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Error calling onSubscriptionEstablished: %s", ErrorStr(err))); - }; - -private: - jobject javaCallbackRef; - bool keepAlive; -}; - -class CHIPFaultInjectionAttributeListAttributeCallback - : public chip::Callback::Callback -{ -public: - CHIPFaultInjectionAttributeListAttributeCallback(jobject javaCallback, bool keepAlive = false); - - ~CHIPFaultInjectionAttributeListAttributeCallback(); - - static void maybeDestroy(CHIPFaultInjectionAttributeListAttributeCallback * callback) - { - if (!callback->keepAlive) - { - callback->Cancel(); - chip::Platform::Delete(callback); - } - } - - static void CallbackFn(void * context, const chip::app::DataModel::DecodableList & list); - static void OnSubscriptionEstablished(void * context) - { - CHIP_ERROR err = chip::JniReferences::GetInstance().CallSubscriptionEstablished( - reinterpret_cast(context)->javaCallbackRef); - VerifyOrReturn(err == CHIP_NO_ERROR, ChipLogError(Zcl, "Error calling onSubscriptionEstablished: %s", ErrorStr(err))); - }; - -private: - jobject javaCallbackRef; - bool keepAlive; -}; diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java index bd9914f596dbab..bf07546f55e933 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipClusters.java @@ -25180,163 +25180,4 @@ private native void readClusterRevisionAttribute( private native void subscribeClusterRevisionAttribute( long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval); } - - public static class FaultInjectionCluster extends BaseChipCluster { - public static final long CLUSTER_ID = 4294048774L; - - public FaultInjectionCluster(long devicePtr, int endpointId) { - super(devicePtr, endpointId); - } - - @Override - public native long initWithDevice(long devicePtr, int endpointId); - - public void failAtFault( - DefaultClusterCallback callback, - Integer type, - Long id, - Long numCallsToSkip, - Long numCallsToFail, - Boolean takeMutex) { - failAtFault( - chipClusterPtr, callback, type, id, numCallsToSkip, numCallsToFail, takeMutex, null); - } - - public void failAtFault( - DefaultClusterCallback callback, - Integer type, - Long id, - Long numCallsToSkip, - Long numCallsToFail, - Boolean takeMutex, - int timedInvokeTimeoutMs) { - failAtFault( - chipClusterPtr, - callback, - type, - id, - numCallsToSkip, - numCallsToFail, - takeMutex, - timedInvokeTimeoutMs); - } - - private native void failAtFault( - long chipClusterPtr, - DefaultClusterCallback Callback, - Integer type, - Long id, - Long numCallsToSkip, - Long numCallsToFail, - Boolean takeMutex, - @Nullable Integer timedInvokeTimeoutMs); - - public interface GeneratedCommandListAttributeCallback { - void onSuccess(List valueList); - - void onError(Exception ex); - - default void onSubscriptionEstablished() {} - } - - public interface AcceptedCommandListAttributeCallback { - void onSuccess(List valueList); - - void onError(Exception ex); - - default void onSubscriptionEstablished() {} - } - - public interface AttributeListAttributeCallback { - void onSuccess(List valueList); - - void onError(Exception ex); - - default void onSubscriptionEstablished() {} - } - - public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) { - readGeneratedCommandListAttribute(chipClusterPtr, callback); - } - - public void subscribeGeneratedCommandListAttribute( - GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) { - subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval); - } - - public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) { - readAcceptedCommandListAttribute(chipClusterPtr, callback); - } - - public void subscribeAcceptedCommandListAttribute( - AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) { - subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval); - } - - public void readAttributeListAttribute(AttributeListAttributeCallback callback) { - readAttributeListAttribute(chipClusterPtr, callback); - } - - public void subscribeAttributeListAttribute( - AttributeListAttributeCallback callback, int minInterval, int maxInterval) { - subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval); - } - - public void readFeatureMapAttribute(LongAttributeCallback callback) { - readFeatureMapAttribute(chipClusterPtr, callback); - } - - public void subscribeFeatureMapAttribute( - LongAttributeCallback callback, int minInterval, int maxInterval) { - subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval); - } - - public void readClusterRevisionAttribute(IntegerAttributeCallback callback) { - readClusterRevisionAttribute(chipClusterPtr, callback); - } - - public void subscribeClusterRevisionAttribute( - IntegerAttributeCallback callback, int minInterval, int maxInterval) { - subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval); - } - - private native void readGeneratedCommandListAttribute( - long chipClusterPtr, GeneratedCommandListAttributeCallback callback); - - private native void subscribeGeneratedCommandListAttribute( - long chipClusterPtr, - GeneratedCommandListAttributeCallback callback, - int minInterval, - int maxInterval); - - private native void readAcceptedCommandListAttribute( - long chipClusterPtr, AcceptedCommandListAttributeCallback callback); - - private native void subscribeAcceptedCommandListAttribute( - long chipClusterPtr, - AcceptedCommandListAttributeCallback callback, - int minInterval, - int maxInterval); - - private native void readAttributeListAttribute( - long chipClusterPtr, AttributeListAttributeCallback callback); - - private native void subscribeAttributeListAttribute( - long chipClusterPtr, - AttributeListAttributeCallback callback, - int minInterval, - int maxInterval); - - private native void readFeatureMapAttribute( - long chipClusterPtr, LongAttributeCallback callback); - - private native void subscribeFeatureMapAttribute( - long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval); - - private native void readClusterRevisionAttribute( - long chipClusterPtr, IntegerAttributeCallback callback); - - private native void subscribeClusterRevisionAttribute( - long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval); - } } diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java b/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java index c61f98c598aa61..fddd0ee7c03216 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ChipIdLookup.java @@ -220,9 +220,6 @@ public static String clusterIdToName(long clusterId) { if (clusterId == 4294048773L) { return "TestCluster"; } - if (clusterId == 4294048774L) { - return "FaultInjection"; - } return ""; } @@ -3090,24 +3087,6 @@ public static String attributeIdToName(long clusterId, long attributeId) { } return ""; } - if (clusterId == 4294048774L) { - if (attributeId == 65528L) { - return "GeneratedCommandList"; - } - if (attributeId == 65529L) { - return "AcceptedCommandList"; - } - if (attributeId == 65531L) { - return "AttributeList"; - } - if (attributeId == 65532L) { - return "FeatureMap"; - } - if (attributeId == 65533L) { - return "ClusterRevision"; - } - return ""; - } return ""; } @@ -3482,9 +3461,6 @@ public static String eventIdToName(long clusterId, long eventId) { } return ""; } - if (clusterId == 4294048774L) { - return ""; - } return ""; } } diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ClusterInfoMapping.java b/src/controller/java/zap-generated/chip/devicecontroller/ClusterInfoMapping.java index 365bee708efccb..955ae30c67da52 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ClusterInfoMapping.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ClusterInfoMapping.java @@ -7131,78 +7131,6 @@ public void onError(Exception ex) { } } - public static class DelegatedFaultInjectionClusterGeneratedCommandListAttributeCallback - implements ChipClusters.FaultInjectionCluster.GeneratedCommandListAttributeCallback, - DelegatedClusterCallback { - private ClusterCommandCallback callback; - - @Override - public void setCallbackDelegate(ClusterCommandCallback callback) { - this.callback = callback; - } - - @Override - public void onSuccess(List valueList) { - Map responseValues = new LinkedHashMap<>(); - CommandResponseInfo commandResponseInfo = new CommandResponseInfo("valueList", "List"); - responseValues.put(commandResponseInfo, valueList); - callback.onSuccess(responseValues); - } - - @Override - public void onError(Exception ex) { - callback.onFailure(ex); - } - } - - public static class DelegatedFaultInjectionClusterAcceptedCommandListAttributeCallback - implements ChipClusters.FaultInjectionCluster.AcceptedCommandListAttributeCallback, - DelegatedClusterCallback { - private ClusterCommandCallback callback; - - @Override - public void setCallbackDelegate(ClusterCommandCallback callback) { - this.callback = callback; - } - - @Override - public void onSuccess(List valueList) { - Map responseValues = new LinkedHashMap<>(); - CommandResponseInfo commandResponseInfo = new CommandResponseInfo("valueList", "List"); - responseValues.put(commandResponseInfo, valueList); - callback.onSuccess(responseValues); - } - - @Override - public void onError(Exception ex) { - callback.onFailure(ex); - } - } - - public static class DelegatedFaultInjectionClusterAttributeListAttributeCallback - implements ChipClusters.FaultInjectionCluster.AttributeListAttributeCallback, - DelegatedClusterCallback { - private ClusterCommandCallback callback; - - @Override - public void setCallbackDelegate(ClusterCommandCallback callback) { - this.callback = callback; - } - - @Override - public void onSuccess(List valueList) { - Map responseValues = new LinkedHashMap<>(); - CommandResponseInfo commandResponseInfo = new CommandResponseInfo("valueList", "List"); - responseValues.put(commandResponseInfo, valueList); - callback.onSuccess(responseValues); - } - - @Override - public void onError(Exception ex) { - callback.onFailure(ex); - } - } - public Map getClusterMap() { Map clusterMap = initializeClusterMap(); Map> commandMap = getCommandMap(); @@ -7542,11 +7470,6 @@ public Map initializeClusterMap() { (ptr, endpointId) -> new ChipClusters.TestClusterCluster(ptr, endpointId), new HashMap<>()); clusterMap.put("testCluster", testClusterClusterInfo); - ClusterInfo faultInjectionClusterInfo = - new ClusterInfo( - (ptr, endpointId) -> new ChipClusters.FaultInjectionCluster(ptr, endpointId), - new HashMap<>()); - clusterMap.put("faultInjection", faultInjectionClusterInfo); return clusterMap; } @@ -7639,7 +7562,6 @@ public void combineCommand( destination.get("accountLogin").combineCommands(source.get("accountLogin")); destination.get("electricalMeasurement").combineCommands(source.get("electricalMeasurement")); destination.get("testCluster").combineCommands(source.get("testCluster")); - destination.get("faultInjection").combineCommands(source.get("faultInjection")); } @SuppressWarnings("unchecked") @@ -12079,51 +12001,6 @@ public Map> getCommandMap() { testClusterClusterInteractionInfoMap.put( "testEmitTestEventRequest", testClustertestEmitTestEventRequestInteractionInfo); commandMap.put("testCluster", testClusterClusterInteractionInfoMap); - Map faultInjectionClusterInteractionInfoMap = new LinkedHashMap<>(); - Map faultInjectionfailAtFaultCommandParams = - new LinkedHashMap(); - CommandParameterInfo faultInjectionfailAtFaulttypeCommandParameterInfo = - new CommandParameterInfo("type", Integer.class, Integer.class); - faultInjectionfailAtFaultCommandParams.put( - "type", faultInjectionfailAtFaulttypeCommandParameterInfo); - - CommandParameterInfo faultInjectionfailAtFaultidCommandParameterInfo = - new CommandParameterInfo("id", Long.class, Long.class); - faultInjectionfailAtFaultCommandParams.put( - "id", faultInjectionfailAtFaultidCommandParameterInfo); - - CommandParameterInfo faultInjectionfailAtFaultnumCallsToSkipCommandParameterInfo = - new CommandParameterInfo("numCallsToSkip", Long.class, Long.class); - faultInjectionfailAtFaultCommandParams.put( - "numCallsToSkip", faultInjectionfailAtFaultnumCallsToSkipCommandParameterInfo); - - CommandParameterInfo faultInjectionfailAtFaultnumCallsToFailCommandParameterInfo = - new CommandParameterInfo("numCallsToFail", Long.class, Long.class); - faultInjectionfailAtFaultCommandParams.put( - "numCallsToFail", faultInjectionfailAtFaultnumCallsToFailCommandParameterInfo); - - CommandParameterInfo faultInjectionfailAtFaulttakeMutexCommandParameterInfo = - new CommandParameterInfo("takeMutex", Boolean.class, Boolean.class); - faultInjectionfailAtFaultCommandParams.put( - "takeMutex", faultInjectionfailAtFaulttakeMutexCommandParameterInfo); - - InteractionInfo faultInjectionfailAtFaultInteractionInfo = - new InteractionInfo( - (cluster, callback, commandArguments) -> { - ((ChipClusters.FaultInjectionCluster) cluster) - .failAtFault( - (DefaultClusterCallback) callback, - (Integer) commandArguments.get("type"), - (Long) commandArguments.get("id"), - (Long) commandArguments.get("numCallsToSkip"), - (Long) commandArguments.get("numCallsToFail"), - (Boolean) commandArguments.get("takeMutex")); - }, - () -> new DelegatedDefaultClusterCallback(), - faultInjectionfailAtFaultCommandParams); - faultInjectionClusterInteractionInfoMap.put( - "failAtFault", faultInjectionfailAtFaultInteractionInfo); - commandMap.put("faultInjection", faultInjectionClusterInteractionInfoMap); return commandMap; } } diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java b/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java index a059be7651a3a9..363098e815aa52 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ClusterReadMapping.java @@ -12424,81 +12424,6 @@ public Map> getReadAttributeMap() { readTestClusterInteractionInfo.put( "readClusterRevisionAttribute", readTestClusterClusterRevisionAttributeInteractionInfo); readAttributeMap.put("testCluster", readTestClusterInteractionInfo); - Map readFaultInjectionInteractionInfo = new LinkedHashMap<>(); - Map readFaultInjectionGeneratedCommandListCommandParams = - new LinkedHashMap(); - InteractionInfo readFaultInjectionGeneratedCommandListAttributeInteractionInfo = - new InteractionInfo( - (cluster, callback, commandArguments) -> { - ((ChipClusters.FaultInjectionCluster) cluster) - .readGeneratedCommandListAttribute( - (ChipClusters.FaultInjectionCluster.GeneratedCommandListAttributeCallback) - callback); - }, - () -> - new ClusterInfoMapping - .DelegatedFaultInjectionClusterGeneratedCommandListAttributeCallback(), - readFaultInjectionGeneratedCommandListCommandParams); - readFaultInjectionInteractionInfo.put( - "readGeneratedCommandListAttribute", - readFaultInjectionGeneratedCommandListAttributeInteractionInfo); - Map readFaultInjectionAcceptedCommandListCommandParams = - new LinkedHashMap(); - InteractionInfo readFaultInjectionAcceptedCommandListAttributeInteractionInfo = - new InteractionInfo( - (cluster, callback, commandArguments) -> { - ((ChipClusters.FaultInjectionCluster) cluster) - .readAcceptedCommandListAttribute( - (ChipClusters.FaultInjectionCluster.AcceptedCommandListAttributeCallback) - callback); - }, - () -> - new ClusterInfoMapping - .DelegatedFaultInjectionClusterAcceptedCommandListAttributeCallback(), - readFaultInjectionAcceptedCommandListCommandParams); - readFaultInjectionInteractionInfo.put( - "readAcceptedCommandListAttribute", - readFaultInjectionAcceptedCommandListAttributeInteractionInfo); - Map readFaultInjectionAttributeListCommandParams = - new LinkedHashMap(); - InteractionInfo readFaultInjectionAttributeListAttributeInteractionInfo = - new InteractionInfo( - (cluster, callback, commandArguments) -> { - ((ChipClusters.FaultInjectionCluster) cluster) - .readAttributeListAttribute( - (ChipClusters.FaultInjectionCluster.AttributeListAttributeCallback) callback); - }, - () -> - new ClusterInfoMapping - .DelegatedFaultInjectionClusterAttributeListAttributeCallback(), - readFaultInjectionAttributeListCommandParams); - readFaultInjectionInteractionInfo.put( - "readAttributeListAttribute", readFaultInjectionAttributeListAttributeInteractionInfo); - Map readFaultInjectionFeatureMapCommandParams = - new LinkedHashMap(); - InteractionInfo readFaultInjectionFeatureMapAttributeInteractionInfo = - new InteractionInfo( - (cluster, callback, commandArguments) -> { - ((ChipClusters.FaultInjectionCluster) cluster) - .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback); - }, - () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(), - readFaultInjectionFeatureMapCommandParams); - readFaultInjectionInteractionInfo.put( - "readFeatureMapAttribute", readFaultInjectionFeatureMapAttributeInteractionInfo); - Map readFaultInjectionClusterRevisionCommandParams = - new LinkedHashMap(); - InteractionInfo readFaultInjectionClusterRevisionAttributeInteractionInfo = - new InteractionInfo( - (cluster, callback, commandArguments) -> { - ((ChipClusters.FaultInjectionCluster) cluster) - .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback); - }, - () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(), - readFaultInjectionClusterRevisionCommandParams); - readFaultInjectionInteractionInfo.put( - "readClusterRevisionAttribute", readFaultInjectionClusterRevisionAttributeInteractionInfo); - readAttributeMap.put("faultInjection", readFaultInjectionInteractionInfo); return readAttributeMap; } } diff --git a/src/controller/java/zap-generated/chip/devicecontroller/ClusterWriteMapping.java b/src/controller/java/zap-generated/chip/devicecontroller/ClusterWriteMapping.java index 7a2eb30d7bc107..95414b21f13d0e 100644 --- a/src/controller/java/zap-generated/chip/devicecontroller/ClusterWriteMapping.java +++ b/src/controller/java/zap-generated/chip/devicecontroller/ClusterWriteMapping.java @@ -2837,8 +2837,6 @@ public Map> getWriteAttributeMap() { "writeNullableRangeRestrictedInt16sAttribute", writeTestClusterNullableRangeRestrictedInt16sAttributeInteractionInfo); writeAttributeMap.put("testCluster", writeTestClusterInteractionInfo); - Map writeFaultInjectionInteractionInfo = new LinkedHashMap<>(); - writeAttributeMap.put("faultInjection", writeFaultInjectionInteractionInfo); return writeAttributeMap; } } diff --git a/src/controller/python/chip/clusters/CHIPClusters.py b/src/controller/python/chip/clusters/CHIPClusters.py index 474e44c941c097..4513a38a25ae45 100644 --- a/src/controller/python/chip/clusters/CHIPClusters.py +++ b/src/controller/python/chip/clusters/CHIPClusters.py @@ -7502,55 +7502,6 @@ class ChipClusters: }, }, } - _FAULT_INJECTION_CLUSTER_INFO = { - "clusterName": "FaultInjection", - "clusterId": 0xFFF1FC06, - "commands": { - 0x00000000: { - "commandId": 0x00000000, - "commandName": "FailAtFault", - "args": { - "type": "int", - "id": "int", - "numCallsToSkip": "int", - "numCallsToFail": "int", - "takeMutex": "bool", - }, - }, - }, - "attributes": { - 0x0000FFF8: { - "attributeName": "GeneratedCommandList", - "attributeId": 0x0000FFF8, - "type": "int", - "reportable": True, - }, - 0x0000FFF9: { - "attributeName": "AcceptedCommandList", - "attributeId": 0x0000FFF9, - "type": "int", - "reportable": True, - }, - 0x0000FFFB: { - "attributeName": "AttributeList", - "attributeId": 0x0000FFFB, - "type": "int", - "reportable": True, - }, - 0x0000FFFC: { - "attributeName": "FeatureMap", - "attributeId": 0x0000FFFC, - "type": "int", - "reportable": True, - }, - 0x0000FFFD: { - "attributeName": "ClusterRevision", - "attributeId": 0x0000FFFD, - "type": "int", - "reportable": True, - }, - }, - } _CLUSTER_ID_DICT = { 0x00000003: _IDENTIFY_CLUSTER_INFO, @@ -7618,7 +7569,6 @@ class ChipClusters: 0x0000050E: _ACCOUNT_LOGIN_CLUSTER_INFO, 0x00000B04: _ELECTRICAL_MEASUREMENT_CLUSTER_INFO, 0xFFF1FC05: _TEST_CLUSTER_CLUSTER_INFO, - 0xFFF1FC06: _FAULT_INJECTION_CLUSTER_INFO, } _CLUSTER_NAME_DICT = { @@ -7687,7 +7637,6 @@ class ChipClusters: "AccountLogin": _ACCOUNT_LOGIN_CLUSTER_INFO, "ElectricalMeasurement": _ELECTRICAL_MEASUREMENT_CLUSTER_INFO, "TestCluster": _TEST_CLUSTER_CLUSTER_INFO, - "FaultInjection": _FAULT_INJECTION_CLUSTER_INFO, } def __init__(self, chipstack): diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm index 4e215d6702d9b5..064c07e07e814b 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm @@ -17557,115 +17557,6 @@ id MTRDecodeAttributeValue(const ConcreteAttributePath & aPath, TLV::TLVReader & } break; } - case Clusters::FaultInjection::Id: { - using namespace Clusters::FaultInjection; - switch (aPath.mAttributeId) { - case Attributes::GeneratedCommandList::Id: { - using TypeInfo = Attributes::GeneratedCommandList::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) { - return nil; - } - NSArray * _Nonnull value; - { // Scope for our temporary variables - auto * array_0 = [NSMutableArray new]; - auto iter_0 = cppValue.begin(); - while (iter_0.Next()) { - auto & entry_0 = iter_0.GetValue(); - NSNumber * newElement_0; - newElement_0 = [NSNumber numberWithUnsignedInt:entry_0]; - [array_0 addObject:newElement_0]; - } - CHIP_ERROR err = iter_0.GetStatus(); - if (err != CHIP_NO_ERROR) { - *aError = err; - return nil; - } - value = array_0; - } - return value; - } - case Attributes::AcceptedCommandList::Id: { - using TypeInfo = Attributes::AcceptedCommandList::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) { - return nil; - } - NSArray * _Nonnull value; - { // Scope for our temporary variables - auto * array_0 = [NSMutableArray new]; - auto iter_0 = cppValue.begin(); - while (iter_0.Next()) { - auto & entry_0 = iter_0.GetValue(); - NSNumber * newElement_0; - newElement_0 = [NSNumber numberWithUnsignedInt:entry_0]; - [array_0 addObject:newElement_0]; - } - CHIP_ERROR err = iter_0.GetStatus(); - if (err != CHIP_NO_ERROR) { - *aError = err; - return nil; - } - value = array_0; - } - return value; - } - case Attributes::AttributeList::Id: { - using TypeInfo = Attributes::AttributeList::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) { - return nil; - } - NSArray * _Nonnull value; - { // Scope for our temporary variables - auto * array_0 = [NSMutableArray new]; - auto iter_0 = cppValue.begin(); - while (iter_0.Next()) { - auto & entry_0 = iter_0.GetValue(); - NSNumber * newElement_0; - newElement_0 = [NSNumber numberWithUnsignedInt:entry_0]; - [array_0 addObject:newElement_0]; - } - CHIP_ERROR err = iter_0.GetStatus(); - if (err != CHIP_NO_ERROR) { - *aError = err; - return nil; - } - value = array_0; - } - return value; - } - case Attributes::FeatureMap::Id: { - using TypeInfo = Attributes::FeatureMap::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) { - return nil; - } - NSNumber * _Nonnull value; - value = [NSNumber numberWithUnsignedInt:cppValue]; - return value; - } - case Attributes::ClusterRevision::Id: { - using TypeInfo = Attributes::ClusterRevision::TypeInfo; - TypeInfo::DecodableType cppValue; - *aError = DataModel::Decode(aReader, cppValue); - if (*aError != CHIP_NO_ERROR) { - return nil; - } - NSNumber * _Nonnull value; - value = [NSNumber numberWithUnsignedShort:cppValue]; - return value; - } - default: - *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB; - break; - } - break; - } default: { *aError = CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH_IB; break; diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h index 90980c2f1a0f2c..32504dbbf5613e 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -21986,117 +21986,6 @@ NS_ASSUME_NONNULL_BEGIN @end -/** - * Cluster Fault Injection - * - */ -@interface MTRBaseClusterFaultInjection : MTRCluster - -- (nullable instancetype)initWithDevice:(MTRBaseDevice *)device - endpoint:(uint16_t)endpoint - queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER; - -- (void)failAtFaultWithParams:(MTRFaultInjectionClusterFailAtFaultParams *)params - completionHandler:(StatusCompletion)completionHandler; -- (void)failRandomlyAtFaultWithParams:(MTRFaultInjectionClusterFailRandomlyAtFaultParams *)params - completionHandler:(StatusCompletion)completionHandler; - -- (void)readAttributeGeneratedCommandListWithCompletionHandler:(void (^)(NSArray * _Nullable value, - NSError * _Nullable error))completionHandler; -/** - * This API does not support setting autoResubscribe to NO in the - * MTRSubscribeParams. - */ -- (void)subscribeAttributeGeneratedCommandListWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished: - (SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler; -+ (void)readAttributeGeneratedCommandListWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler; - -- (void)readAttributeAcceptedCommandListWithCompletionHandler:(void (^)(NSArray * _Nullable value, - NSError * _Nullable error))completionHandler; -/** - * This API does not support setting autoResubscribe to NO in the - * MTRSubscribeParams. - */ -- (void)subscribeAttributeAcceptedCommandListWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished: - (SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler; -+ (void)readAttributeAcceptedCommandListWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler; - -- (void)readAttributeAttributeListWithCompletionHandler:(void (^)( - NSArray * _Nullable value, NSError * _Nullable error))completionHandler; -/** - * This API does not support setting autoResubscribe to NO in the - * MTRSubscribeParams. - */ -- (void)subscribeAttributeAttributeListWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished:(SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler; -+ (void)readAttributeAttributeListWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler; - -- (void)readAttributeFeatureMapWithCompletionHandler:(void (^)( - NSNumber * _Nullable value, NSError * _Nullable error))completionHandler; -/** - * This API does not support setting autoResubscribe to NO in the - * MTRSubscribeParams. - */ -- (void)subscribeAttributeFeatureMapWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished:(SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler; -+ (void)readAttributeFeatureMapWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completionHandler; - -- (void)readAttributeClusterRevisionWithCompletionHandler:(void (^)(NSNumber * _Nullable value, - NSError * _Nullable error))completionHandler; -/** - * This API does not support setting autoResubscribe to NO in the - * MTRSubscribeParams. - */ -- (void)subscribeAttributeClusterRevisionWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished:(SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler: - (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler; -+ (void)readAttributeClusterRevisionWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completionHandler; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -@end - typedef NS_ENUM(uint8_t, MTRIdentifyEffectIdentifier) { MTRIdentifyEffectIdentifierBlink = 0x00, MTRIdentifyEffectIdentifierBreathe = 0x01, diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm index 7bc25323f1a8d8..703b006f8a8353 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm @@ -93573,435 +93573,4 @@ new MTRInt16uAttributeCallbackBridge(queue, completionHandler, ^(Cancelable * su @end -@implementation MTRBaseClusterFaultInjection - -- (instancetype)initWithDevice:(MTRBaseDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue -{ - if (self = [super initWithQueue:queue]) { - if (device == nil) { - return nil; - } - - _device = device; - _endpoint = endpoint; - } - return self; -} - -- (void)failAtFaultWithParams:(MTRFaultInjectionClusterFailAtFaultParams *)params - completionHandler:(StatusCompletion)completionHandler -{ - // Make a copy of params before we go async. - params = [params copy]; - new MTRCommandSuccessCallbackBridge( - self.callbackQueue, self.device, - ^(id _Nullable value, NSError * _Nullable error) { - completionHandler(error); - }, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - chip::Optional timedInvokeTimeoutMs; - ListFreer listFreer; - FaultInjection::Commands::FailAtFault::Type request; - if (params != nil) { - if (params.timedInvokeTimeoutMs != nil) { - timedInvokeTimeoutMs.SetValue(params.timedInvokeTimeoutMs.unsignedShortValue); - } - } - request.type = static_cast>(params.type.unsignedCharValue); - request.id = params.id.unsignedIntValue; - request.numCallsToSkip = params.numCallsToSkip.unsignedIntValue; - request.numCallsToFail = params.numCallsToFail.unsignedIntValue; - request.takeMutex = params.takeMutex.boolValue; - - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.InvokeCommand(request, successFn->mContext, successFn->mCall, failureFn->mCall, timedInvokeTimeoutMs); - }); -} - -- (void)failRandomlyAtFaultWithParams:(MTRFaultInjectionClusterFailRandomlyAtFaultParams *)params - completionHandler:(StatusCompletion)completionHandler -{ - // Make a copy of params before we go async. - params = [params copy]; - new MTRCommandSuccessCallbackBridge( - self.callbackQueue, self.device, - ^(id _Nullable value, NSError * _Nullable error) { - completionHandler(error); - }, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - chip::Optional timedInvokeTimeoutMs; - ListFreer listFreer; - FaultInjection::Commands::FailRandomlyAtFault::Type request; - if (params != nil) { - if (params.timedInvokeTimeoutMs != nil) { - timedInvokeTimeoutMs.SetValue(params.timedInvokeTimeoutMs.unsignedShortValue); - } - } - request.type = static_cast>(params.type.unsignedCharValue); - request.id = params.id.unsignedIntValue; - request.percentage = params.percentage.unsignedCharValue; - - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.InvokeCommand(request, successFn->mContext, successFn->mCall, failureFn->mCall, timedInvokeTimeoutMs); - }); -} - -- (void)readAttributeGeneratedCommandListWithCompletionHandler:(void (^)(NSArray * _Nullable value, - NSError * _Nullable error))completionHandler -{ - new MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge(self.callbackQueue, self.device, completionHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - using TypeInfo = FaultInjection::Attributes::GeneratedCommandList::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.ReadAttribute(successFn->mContext, successFn->mCall, failureFn->mCall); - }); -} - -- (void)subscribeAttributeGeneratedCommandListWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished: - (SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler -{ - // Make a copy of params before we go async. - minInterval = [minInterval copy]; - maxInterval = [maxInterval copy]; - params = [params copy]; - new MTRFaultInjectionGeneratedCommandListListAttributeCallbackSubscriptionBridge( - self.callbackQueue, self.device, reportHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - if (params != nil && params.autoResubscribe != nil && ![params.autoResubscribe boolValue]) { - // We don't support disabling auto-resubscribe. - return CHIP_ERROR_INVALID_ARGUMENT; - } - using TypeInfo = FaultInjection::Attributes::GeneratedCommandList::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.SubscribeAttribute(successFn->mContext, successFn->mCall, failureFn->mCall, - [minInterval unsignedShortValue], [maxInterval unsignedShortValue], - MTRFaultInjectionGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, - params == nil || params.fabricFiltered == nil || [params.fabricFiltered boolValue], - params != nil && params.keepPreviousSubscriptions != nil && [params.keepPreviousSubscriptions boolValue]); - }, - subscriptionEstablishedHandler); -} - -+ (void)readAttributeGeneratedCommandListWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler -{ - new MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge( - queue, completionHandler, ^(Cancelable * success, Cancelable * failure) { - if (attributeCacheContainer.cppAttributeCache) { - chip::app::ConcreteAttributePath path; - using TypeInfo = FaultInjection::Attributes::GeneratedCommandList::TypeInfo; - path.mEndpointId = static_cast([endpoint unsignedShortValue]); - path.mClusterId = TypeInfo::GetClusterId(); - path.mAttributeId = TypeInfo::GetAttributeId(); - TypeInfo::DecodableType value; - CHIP_ERROR err = attributeCacheContainer.cppAttributeCache->Get(path, value); - auto successFn = Callback::FromCancelable(success); - if (err == CHIP_NO_ERROR) { - successFn->mCall(successFn->mContext, value); - } - return err; - } - return CHIP_ERROR_NOT_FOUND; - }); -} - -- (void)readAttributeAcceptedCommandListWithCompletionHandler:(void (^)(NSArray * _Nullable value, - NSError * _Nullable error))completionHandler -{ - new MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge(self.callbackQueue, self.device, completionHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - using TypeInfo = FaultInjection::Attributes::AcceptedCommandList::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.ReadAttribute(successFn->mContext, successFn->mCall, failureFn->mCall); - }); -} - -- (void)subscribeAttributeAcceptedCommandListWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished: - (SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler -{ - // Make a copy of params before we go async. - minInterval = [minInterval copy]; - maxInterval = [maxInterval copy]; - params = [params copy]; - new MTRFaultInjectionAcceptedCommandListListAttributeCallbackSubscriptionBridge( - self.callbackQueue, self.device, reportHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - if (params != nil && params.autoResubscribe != nil && ![params.autoResubscribe boolValue]) { - // We don't support disabling auto-resubscribe. - return CHIP_ERROR_INVALID_ARGUMENT; - } - using TypeInfo = FaultInjection::Attributes::AcceptedCommandList::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.SubscribeAttribute(successFn->mContext, successFn->mCall, failureFn->mCall, - [minInterval unsignedShortValue], [maxInterval unsignedShortValue], - MTRFaultInjectionAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, - params == nil || params.fabricFiltered == nil || [params.fabricFiltered boolValue], - params != nil && params.keepPreviousSubscriptions != nil && [params.keepPreviousSubscriptions boolValue]); - }, - subscriptionEstablishedHandler); -} - -+ (void)readAttributeAcceptedCommandListWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler -{ - new MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge( - queue, completionHandler, ^(Cancelable * success, Cancelable * failure) { - if (attributeCacheContainer.cppAttributeCache) { - chip::app::ConcreteAttributePath path; - using TypeInfo = FaultInjection::Attributes::AcceptedCommandList::TypeInfo; - path.mEndpointId = static_cast([endpoint unsignedShortValue]); - path.mClusterId = TypeInfo::GetClusterId(); - path.mAttributeId = TypeInfo::GetAttributeId(); - TypeInfo::DecodableType value; - CHIP_ERROR err = attributeCacheContainer.cppAttributeCache->Get(path, value); - auto successFn = Callback::FromCancelable(success); - if (err == CHIP_NO_ERROR) { - successFn->mCall(successFn->mContext, value); - } - return err; - } - return CHIP_ERROR_NOT_FOUND; - }); -} - -- (void)readAttributeAttributeListWithCompletionHandler:(void (^)( - NSArray * _Nullable value, NSError * _Nullable error))completionHandler -{ - new MTRFaultInjectionAttributeListListAttributeCallbackBridge(self.callbackQueue, self.device, completionHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - using TypeInfo = FaultInjection::Attributes::AttributeList::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.ReadAttribute(successFn->mContext, successFn->mCall, failureFn->mCall); - }); -} - -- (void)subscribeAttributeAttributeListWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished:(SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler -{ - // Make a copy of params before we go async. - minInterval = [minInterval copy]; - maxInterval = [maxInterval copy]; - params = [params copy]; - new MTRFaultInjectionAttributeListListAttributeCallbackSubscriptionBridge( - self.callbackQueue, self.device, reportHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - if (params != nil && params.autoResubscribe != nil && ![params.autoResubscribe boolValue]) { - // We don't support disabling auto-resubscribe. - return CHIP_ERROR_INVALID_ARGUMENT; - } - using TypeInfo = FaultInjection::Attributes::AttributeList::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.SubscribeAttribute(successFn->mContext, successFn->mCall, failureFn->mCall, - [minInterval unsignedShortValue], [maxInterval unsignedShortValue], - MTRFaultInjectionAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, - params == nil || params.fabricFiltered == nil || [params.fabricFiltered boolValue], - params != nil && params.keepPreviousSubscriptions != nil && [params.keepPreviousSubscriptions boolValue]); - }, - subscriptionEstablishedHandler); -} - -+ (void)readAttributeAttributeListWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler -{ - new MTRFaultInjectionAttributeListListAttributeCallbackBridge( - queue, completionHandler, ^(Cancelable * success, Cancelable * failure) { - if (attributeCacheContainer.cppAttributeCache) { - chip::app::ConcreteAttributePath path; - using TypeInfo = FaultInjection::Attributes::AttributeList::TypeInfo; - path.mEndpointId = static_cast([endpoint unsignedShortValue]); - path.mClusterId = TypeInfo::GetClusterId(); - path.mAttributeId = TypeInfo::GetAttributeId(); - TypeInfo::DecodableType value; - CHIP_ERROR err = attributeCacheContainer.cppAttributeCache->Get(path, value); - auto successFn = Callback::FromCancelable(success); - if (err == CHIP_NO_ERROR) { - successFn->mCall(successFn->mContext, value); - } - return err; - } - return CHIP_ERROR_NOT_FOUND; - }); -} - -- (void)readAttributeFeatureMapWithCompletionHandler:(void (^)( - NSNumber * _Nullable value, NSError * _Nullable error))completionHandler -{ - new MTRInt32uAttributeCallbackBridge(self.callbackQueue, self.device, completionHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - using TypeInfo = FaultInjection::Attributes::FeatureMap::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.ReadAttribute(successFn->mContext, successFn->mCall, failureFn->mCall); - }); -} - -- (void)subscribeAttributeFeatureMapWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished:(SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler -{ - // Make a copy of params before we go async. - minInterval = [minInterval copy]; - maxInterval = [maxInterval copy]; - params = [params copy]; - new MTRInt32uAttributeCallbackSubscriptionBridge( - self.callbackQueue, self.device, reportHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - if (params != nil && params.autoResubscribe != nil && ![params.autoResubscribe boolValue]) { - // We don't support disabling auto-resubscribe. - return CHIP_ERROR_INVALID_ARGUMENT; - } - using TypeInfo = FaultInjection::Attributes::FeatureMap::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.SubscribeAttribute(successFn->mContext, successFn->mCall, failureFn->mCall, - [minInterval unsignedShortValue], [maxInterval unsignedShortValue], - MTRInt32uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, - params == nil || params.fabricFiltered == nil || [params.fabricFiltered boolValue], - params != nil && params.keepPreviousSubscriptions != nil && [params.keepPreviousSubscriptions boolValue]); - }, - subscriptionEstablishedHandler); -} - -+ (void)readAttributeFeatureMapWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completionHandler -{ - new MTRInt32uAttributeCallbackBridge(queue, completionHandler, ^(Cancelable * success, Cancelable * failure) { - if (attributeCacheContainer.cppAttributeCache) { - chip::app::ConcreteAttributePath path; - using TypeInfo = FaultInjection::Attributes::FeatureMap::TypeInfo; - path.mEndpointId = static_cast([endpoint unsignedShortValue]); - path.mClusterId = TypeInfo::GetClusterId(); - path.mAttributeId = TypeInfo::GetAttributeId(); - TypeInfo::DecodableType value; - CHIP_ERROR err = attributeCacheContainer.cppAttributeCache->Get(path, value); - auto successFn = Callback::FromCancelable(success); - if (err == CHIP_NO_ERROR) { - successFn->mCall(successFn->mContext, value); - } - return err; - } - return CHIP_ERROR_NOT_FOUND; - }); -} - -- (void)readAttributeClusterRevisionWithCompletionHandler:(void (^)(NSNumber * _Nullable value, - NSError * _Nullable error))completionHandler -{ - new MTRInt16uAttributeCallbackBridge(self.callbackQueue, self.device, completionHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - using TypeInfo = FaultInjection::Attributes::ClusterRevision::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.ReadAttribute(successFn->mContext, successFn->mCall, failureFn->mCall); - }); -} - -- (void)subscribeAttributeClusterRevisionWithMinInterval:(NSNumber * _Nonnull)minInterval - maxInterval:(NSNumber * _Nonnull)maxInterval - params:(MTRSubscribeParams * _Nullable)params - subscriptionEstablished:(SubscriptionEstablishedHandler _Nullable)subscriptionEstablishedHandler - reportHandler: - (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler -{ - // Make a copy of params before we go async. - minInterval = [minInterval copy]; - maxInterval = [maxInterval copy]; - params = [params copy]; - new MTRInt16uAttributeCallbackSubscriptionBridge( - self.callbackQueue, self.device, reportHandler, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - if (params != nil && params.autoResubscribe != nil && ![params.autoResubscribe boolValue]) { - // We don't support disabling auto-resubscribe. - return CHIP_ERROR_INVALID_ARGUMENT; - } - using TypeInfo = FaultInjection::Attributes::ClusterRevision::TypeInfo; - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.SubscribeAttribute(successFn->mContext, successFn->mCall, failureFn->mCall, - [minInterval unsignedShortValue], [maxInterval unsignedShortValue], - MTRInt16uAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished, nil, - params == nil || params.fabricFiltered == nil || [params.fabricFiltered boolValue], - params != nil && params.keepPreviousSubscriptions != nil && [params.keepPreviousSubscriptions boolValue]); - }, - subscriptionEstablishedHandler); -} - -+ (void)readAttributeClusterRevisionWithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer - endpoint:(NSNumber *)endpoint - queue:(dispatch_queue_t)queue - completionHandler: - (void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completionHandler -{ - new MTRInt16uAttributeCallbackBridge(queue, completionHandler, ^(Cancelable * success, Cancelable * failure) { - if (attributeCacheContainer.cppAttributeCache) { - chip::app::ConcreteAttributePath path; - using TypeInfo = FaultInjection::Attributes::ClusterRevision::TypeInfo; - path.mEndpointId = static_cast([endpoint unsignedShortValue]); - path.mClusterId = TypeInfo::GetClusterId(); - path.mAttributeId = TypeInfo::GetAttributeId(); - TypeInfo::DecodableType value; - CHIP_ERROR err = attributeCacheContainer.cppAttributeCache->Get(path, value); - auto successFn = Callback::FromCancelable(success); - if (err == CHIP_NO_ERROR) { - successFn->mCall(successFn->mContext, value); - } - return err; - } - return CHIP_ERROR_NOT_FOUND; - }); -} - -@end - // NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks) diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h index 9c3afd19a23a4d..359f771f5b8910 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h @@ -348,8 +348,3 @@ @property (nonatomic, strong, readonly) MTRBaseDevice * device; @property (nonatomic, assign, readonly) chip::EndpointId endpoint; @end - -@interface MTRBaseClusterFaultInjection () -@property (nonatomic, strong, readonly) MTRBaseDevice * device; -@property (nonatomic, assign, readonly) chip::EndpointId endpoint; -@end diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm index 70a58543255418..c80b80aa92c3de 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm @@ -11563,123 +11563,6 @@ } } -void MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn( - void * context, const chip::app::DataModel::DecodableList & value) -{ - NSArray * _Nonnull objCValue; - { // Scope for our temporary variables - auto * array_0 = [NSMutableArray new]; - auto iter_0 = value.begin(); - while (iter_0.Next()) { - auto & entry_0 = iter_0.GetValue(); - NSNumber * newElement_0; - newElement_0 = [NSNumber numberWithUnsignedInt:entry_0]; - [array_0 addObject:newElement_0]; - } - CHIP_ERROR err = iter_0.GetStatus(); - if (err != CHIP_NO_ERROR) { - OnFailureFn(context, err); - return; - } - objCValue = array_0; - } - DispatchSuccess(context, objCValue); -}; - -void MTRFaultInjectionGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished(void * context) -{ - auto * self = static_cast(context); - if (!self->mQueue) { - return; - } - - if (self->mEstablishedHandler != nil) { - dispatch_async(self->mQueue, self->mEstablishedHandler); - // On failure, mEstablishedHandler will be cleaned up by our destructor, - // but we can clean it up earlier on successful subscription - // establishment. - self->mEstablishedHandler = nil; - } -} - -void MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge::OnSuccessFn( - void * context, const chip::app::DataModel::DecodableList & value) -{ - NSArray * _Nonnull objCValue; - { // Scope for our temporary variables - auto * array_0 = [NSMutableArray new]; - auto iter_0 = value.begin(); - while (iter_0.Next()) { - auto & entry_0 = iter_0.GetValue(); - NSNumber * newElement_0; - newElement_0 = [NSNumber numberWithUnsignedInt:entry_0]; - [array_0 addObject:newElement_0]; - } - CHIP_ERROR err = iter_0.GetStatus(); - if (err != CHIP_NO_ERROR) { - OnFailureFn(context, err); - return; - } - objCValue = array_0; - } - DispatchSuccess(context, objCValue); -}; - -void MTRFaultInjectionAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished(void * context) -{ - auto * self = static_cast(context); - if (!self->mQueue) { - return; - } - - if (self->mEstablishedHandler != nil) { - dispatch_async(self->mQueue, self->mEstablishedHandler); - // On failure, mEstablishedHandler will be cleaned up by our destructor, - // but we can clean it up earlier on successful subscription - // establishment. - self->mEstablishedHandler = nil; - } -} - -void MTRFaultInjectionAttributeListListAttributeCallbackBridge::OnSuccessFn( - void * context, const chip::app::DataModel::DecodableList & value) -{ - NSArray * _Nonnull objCValue; - { // Scope for our temporary variables - auto * array_0 = [NSMutableArray new]; - auto iter_0 = value.begin(); - while (iter_0.Next()) { - auto & entry_0 = iter_0.GetValue(); - NSNumber * newElement_0; - newElement_0 = [NSNumber numberWithUnsignedInt:entry_0]; - [array_0 addObject:newElement_0]; - } - CHIP_ERROR err = iter_0.GetStatus(); - if (err != CHIP_NO_ERROR) { - OnFailureFn(context, err); - return; - } - objCValue = array_0; - } - DispatchSuccess(context, objCValue); -}; - -void MTRFaultInjectionAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished(void * context) -{ - auto * self = static_cast(context); - if (!self->mQueue) { - return; - } - - if (self->mEstablishedHandler != nil) { - dispatch_async(self->mQueue, self->mEstablishedHandler); - // On failure, mEstablishedHandler will be cleaned up by our destructor, - // but we can clean it up earlier on successful subscription - // establishment. - self->mEstablishedHandler = nil; - } -} - void MTRGroupsClusterAddGroupResponseCallbackBridge::OnSuccessFn( void * context, const chip::app::Clusters::Groups::Commands::AddGroupResponse::DecodableType & data) { diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h index c4f9a9ea72702e..cb995089ced939 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h @@ -1112,12 +1112,6 @@ typedef void (*TestClusterAcceptedCommandListListAttributeCallback)( void * context, const chip::app::DataModel::DecodableList & data); typedef void (*TestClusterAttributeListListAttributeCallback)(void * context, const chip::app::DataModel::DecodableList & data); -typedef void (*FaultInjectionGeneratedCommandListListAttributeCallback)( - void * context, const chip::app::DataModel::DecodableList & data); -typedef void (*FaultInjectionAcceptedCommandListListAttributeCallback)( - void * context, const chip::app::DataModel::DecodableList & data); -typedef void (*FaultInjectionAttributeListListAttributeCallback)( - void * context, const chip::app::DataModel::DecodableList & data); class MTRDefaultSuccessCallbackBridge : public MTRCallbackBridge { @@ -15151,150 +15145,6 @@ class MTRTestClusterAttributeListListAttributeCallbackSubscriptionBridge SubscriptionEstablishedHandler mEstablishedHandler; }; -class MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge - : public MTRCallbackBridge -{ -public: - MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, - MTRLocalActionBlock action, bool keepAlive = false) : - MTRCallbackBridge(queue, handler, action, OnSuccessFn, - keepAlive){}; - - MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, chip::NodeId nodeID, - MTRDeviceController * controller, ResponseHandler handler, - MTRActionBlock action, bool keepAlive = false) : - MTRCallbackBridge(queue, nodeID, controller, handler, action, - OnSuccessFn, keepAlive){}; - - MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, MTRBaseDevice * device, - ResponseHandler handler, MTRActionBlock action, - bool keepAlive = false) : - MTRCallbackBridge(queue, device, handler, action, OnSuccessFn, - keepAlive){}; - - static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList & value); -}; - -class MTRFaultInjectionGeneratedCommandListListAttributeCallbackSubscriptionBridge - : public MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge -{ -public: - MTRFaultInjectionGeneratedCommandListListAttributeCallbackSubscriptionBridge( - dispatch_queue_t queue, chip::NodeId nodeID, MTRDeviceController * controller, ResponseHandler handler, - MTRActionBlock action, SubscriptionEstablishedHandler establishedHandler) : - MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge(queue, nodeID, controller, handler, action, true), - mEstablishedHandler(establishedHandler) - {} - - MTRFaultInjectionGeneratedCommandListListAttributeCallbackSubscriptionBridge( - dispatch_queue_t queue, MTRBaseDevice * device, ResponseHandler handler, MTRActionBlock action, - SubscriptionEstablishedHandler establishedHandler) : - MTRFaultInjectionGeneratedCommandListListAttributeCallbackBridge(queue, device, handler, action, true), - mEstablishedHandler(establishedHandler) - {} - - static void OnSubscriptionEstablished(void * context); - -private: - SubscriptionEstablishedHandler mEstablishedHandler; -}; - -class MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge - : public MTRCallbackBridge -{ -public: - MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, - MTRLocalActionBlock action, bool keepAlive = false) : - MTRCallbackBridge(queue, handler, action, OnSuccessFn, keepAlive){}; - - MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, chip::NodeId nodeID, - MTRDeviceController * controller, ResponseHandler handler, - MTRActionBlock action, bool keepAlive = false) : - MTRCallbackBridge(queue, nodeID, controller, handler, action, - OnSuccessFn, keepAlive){}; - - MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, MTRBaseDevice * device, - ResponseHandler handler, MTRActionBlock action, - bool keepAlive = false) : - MTRCallbackBridge(queue, device, handler, action, OnSuccessFn, - keepAlive){}; - - static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList & value); -}; - -class MTRFaultInjectionAcceptedCommandListListAttributeCallbackSubscriptionBridge - : public MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge -{ -public: - MTRFaultInjectionAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, chip::NodeId nodeID, - MTRDeviceController * controller, - ResponseHandler handler, MTRActionBlock action, - SubscriptionEstablishedHandler establishedHandler) : - MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge(queue, nodeID, controller, handler, action, true), - mEstablishedHandler(establishedHandler) - {} - - MTRFaultInjectionAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, MTRBaseDevice * device, - ResponseHandler handler, MTRActionBlock action, - SubscriptionEstablishedHandler establishedHandler) : - MTRFaultInjectionAcceptedCommandListListAttributeCallbackBridge(queue, device, handler, action, true), - mEstablishedHandler(establishedHandler) - {} - - static void OnSubscriptionEstablished(void * context); - -private: - SubscriptionEstablishedHandler mEstablishedHandler; -}; - -class MTRFaultInjectionAttributeListListAttributeCallbackBridge - : public MTRCallbackBridge -{ -public: - MTRFaultInjectionAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, - MTRLocalActionBlock action, bool keepAlive = false) : - MTRCallbackBridge(queue, handler, action, OnSuccessFn, keepAlive){}; - - MTRFaultInjectionAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, chip::NodeId nodeID, - MTRDeviceController * controller, ResponseHandler handler, - MTRActionBlock action, bool keepAlive = false) : - MTRCallbackBridge(queue, nodeID, controller, handler, action, OnSuccessFn, - keepAlive){}; - - MTRFaultInjectionAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, MTRBaseDevice * device, - ResponseHandler handler, MTRActionBlock action, - bool keepAlive = false) : - MTRCallbackBridge(queue, device, handler, action, OnSuccessFn, - keepAlive){}; - - static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList & value); -}; - -class MTRFaultInjectionAttributeListListAttributeCallbackSubscriptionBridge - : public MTRFaultInjectionAttributeListListAttributeCallbackBridge -{ -public: - MTRFaultInjectionAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, chip::NodeId nodeID, - MTRDeviceController * controller, ResponseHandler handler, - MTRActionBlock action, - SubscriptionEstablishedHandler establishedHandler) : - MTRFaultInjectionAttributeListListAttributeCallbackBridge(queue, nodeID, controller, handler, action, true), - mEstablishedHandler(establishedHandler) - {} - - MTRFaultInjectionAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, MTRBaseDevice * device, - ResponseHandler handler, MTRActionBlock action, - SubscriptionEstablishedHandler establishedHandler) : - MTRFaultInjectionAttributeListListAttributeCallbackBridge(queue, device, handler, action, true), - mEstablishedHandler(establishedHandler) - {} - - static void OnSubscriptionEstablished(void * context); - -private: - SubscriptionEstablishedHandler mEstablishedHandler; -}; - class MTRGroupsClusterAddGroupResponseCallbackBridge : public MTRCallbackBridge { public: diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h index bd815031aa0bc2..ef8bc064a5524f 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h @@ -5283,38 +5283,4 @@ NS_ASSUME_NONNULL_BEGIN @end -/** - * Cluster Fault Injection - * - */ -@interface MTRClusterFaultInjection : MTRCluster - -- (nullable instancetype)initWithDevice:(MTRDevice *)device - endpoint:(uint16_t)endpoint - queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER; - -- (void)failAtFaultWithParams:(MTRFaultInjectionClusterFailAtFaultParams *)params - expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries - expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs - completionHandler:(StatusCompletion)completionHandler; -- (void)failRandomlyAtFaultWithParams:(MTRFaultInjectionClusterFailRandomlyAtFaultParams *)params - expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries - expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs - completionHandler:(StatusCompletion)completionHandler; - -- (NSDictionary *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params; - -- (NSDictionary *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params; - -- (NSDictionary *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params; - -- (NSDictionary *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params; - -- (NSDictionary *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -@end - NS_ASSUME_NONNULL_END diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm index 32d77c731b7dc3..9172a6d3b320c2 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm @@ -22036,133 +22036,4 @@ - (void)writeAttributeNullableRangeRestrictedInt16sWithValue:(NSDictionary *> *)expectedValues - expectedValueInterval:(NSNumber *)expectedValueIntervalMs - completionHandler:(StatusCompletion)completionHandler -{ - // Make a copy of params before we go async. - params = [params copy]; - MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID controller:self.device.deviceController]; - new MTRCommandSuccessCallbackBridge( - self.callbackQueue, baseDevice, - ^(id _Nullable value, NSError * _Nullable error) { - completionHandler(error); - }, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - chip::Optional timedInvokeTimeoutMs; - ListFreer listFreer; - FaultInjection::Commands::FailAtFault::Type request; - if (params != nil) { - if (params.timedInvokeTimeoutMs != nil) { - timedInvokeTimeoutMs.SetValue(params.timedInvokeTimeoutMs.unsignedShortValue); - } - } - request.type = static_cast>(params.type.unsignedCharValue); - request.id = params.id.unsignedIntValue; - request.numCallsToSkip = params.numCallsToSkip.unsignedIntValue; - request.numCallsToFail = params.numCallsToFail.unsignedIntValue; - request.takeMutex = params.takeMutex.boolValue; - - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.InvokeCommand(request, successFn->mContext, successFn->mCall, failureFn->mCall, timedInvokeTimeoutMs); - }); - - [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs]; -} - -- (void)failRandomlyAtFaultWithParams:(MTRFaultInjectionClusterFailRandomlyAtFaultParams *)params - expectedValues:(NSArray *> *)expectedValues - expectedValueInterval:(NSNumber *)expectedValueIntervalMs - completionHandler:(StatusCompletion)completionHandler -{ - // Make a copy of params before we go async. - params = [params copy]; - MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID controller:self.device.deviceController]; - new MTRCommandSuccessCallbackBridge( - self.callbackQueue, baseDevice, - ^(id _Nullable value, NSError * _Nullable error) { - completionHandler(error); - }, - ^(ExchangeManager & exchangeManager, const SessionHandle & session, Cancelable * success, Cancelable * failure) { - chip::Optional timedInvokeTimeoutMs; - ListFreer listFreer; - FaultInjection::Commands::FailRandomlyAtFault::Type request; - if (params != nil) { - if (params.timedInvokeTimeoutMs != nil) { - timedInvokeTimeoutMs.SetValue(params.timedInvokeTimeoutMs.unsignedShortValue); - } - } - request.type = static_cast>(params.type.unsignedCharValue); - request.id = params.id.unsignedIntValue; - request.percentage = params.percentage.unsignedCharValue; - - auto successFn = Callback::FromCancelable(success); - auto failureFn = Callback::FromCancelable(failure); - chip::Controller::FaultInjectionCluster cppCluster(exchangeManager, session, self->_endpoint); - return cppCluster.InvokeCommand(request, successFn->mContext, successFn->mCall, failureFn->mCall, timedInvokeTimeoutMs); - }); - - [self.device setExpectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs]; -} - -- (NSDictionary *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params -{ - return [self.device readAttributeWithEndpointID:@(_endpoint) - clusterID:@(MTRClusterFaultInjectionID) - attributeID:@(MTRClusterFaultInjectionAttributeGeneratedCommandListID) - params:params]; -} - -- (NSDictionary *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params -{ - return [self.device readAttributeWithEndpointID:@(_endpoint) - clusterID:@(MTRClusterFaultInjectionID) - attributeID:@(MTRClusterFaultInjectionAttributeAcceptedCommandListID) - params:params]; -} - -- (NSDictionary *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params -{ - return [self.device readAttributeWithEndpointID:@(_endpoint) - clusterID:@(MTRClusterFaultInjectionID) - attributeID:@(MTRClusterFaultInjectionAttributeAttributeListID) - params:params]; -} - -- (NSDictionary *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params -{ - return [self.device readAttributeWithEndpointID:@(_endpoint) - clusterID:@(MTRClusterFaultInjectionID) - attributeID:@(MTRClusterFaultInjectionAttributeFeatureMapID) - params:params]; -} - -- (NSDictionary *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params -{ - return [self.device readAttributeWithEndpointID:@(_endpoint) - clusterID:@(MTRClusterFaultInjectionID) - attributeID:@(MTRClusterFaultInjectionAttributeClusterRevisionID) - params:params]; -} - -@end - // NOLINTEND(clang-analyzer-cplusplus.NewDeleteLeaks) diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h index 7db0939f5c1565..3bc39dea076933 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h @@ -349,8 +349,3 @@ @property (nonatomic, readonly) uint16_t endpoint; @property (nonatomic, readonly) MTRDevice * device; @end - -@interface MTRClusterFaultInjection () -@property (nonatomic, readonly) uint16_t endpoint; -@property (nonatomic, readonly) MTRDevice * device; -@end diff --git a/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm index 92ccbc1751f4d9..6ee6ada8dabb0f 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm @@ -2246,16 +2246,6 @@ id MTRDecodeEventPayload(const ConcreteEventPath & aPath, TLV::TLVReader & aRead } break; } - case Clusters::FaultInjection::Id: { - using namespace Clusters::FaultInjection; - switch (aPath.mEventId) { - - default: - *aError = CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB; - break; - } - break; - } default: { *aError = CHIP_ERROR_IM_MALFORMED_EVENT_PATH_IB; break; diff --git a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp index d0e87f6efe4086..f50a45e43715b0 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp +++ b/zzz_generated/chip-tool/zap-generated/cluster/logging/DataModelLogger.cpp @@ -10002,37 +10002,6 @@ CHIP_ERROR DataModelLogger::LogAttribute(const chip::app::ConcreteDataAttributeP } break; } - case FaultInjection::Id: { - switch (path.mAttributeId) - { - case FaultInjection::Attributes::GeneratedCommandList::Id: { - chip::app::DataModel::DecodableList value; - ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); - return DataModelLogger::LogValue("GeneratedCommandList", 1, value); - } - case FaultInjection::Attributes::AcceptedCommandList::Id: { - chip::app::DataModel::DecodableList value; - ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); - return DataModelLogger::LogValue("AcceptedCommandList", 1, value); - } - case FaultInjection::Attributes::AttributeList::Id: { - chip::app::DataModel::DecodableList value; - ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); - return DataModelLogger::LogValue("AttributeList", 1, value); - } - case FaultInjection::Attributes::FeatureMap::Id: { - uint32_t value; - ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); - return DataModelLogger::LogValue("FeatureMap", 1, value); - } - case FaultInjection::Attributes::ClusterRevision::Id: { - uint16_t value; - ReturnErrorOnFailure(chip::app::DataModel::Decode(*data, value)); - return DataModelLogger::LogValue("ClusterRevision", 1, value); - } - } - break; - } default: break; } diff --git a/zzz_generated/controller-clusters/zap-generated/CHIPClientCallbacks.h b/zzz_generated/controller-clusters/zap-generated/CHIPClientCallbacks.h index 5850925843b055..63a1b997dd5b6c 100644 --- a/zzz_generated/controller-clusters/zap-generated/CHIPClientCallbacks.h +++ b/zzz_generated/controller-clusters/zap-generated/CHIPClientCallbacks.h @@ -519,9 +519,3 @@ typedef void (*TestClusterAcceptedCommandListListAttributeCallback)( void * context, const chip::app::DataModel::DecodableList & data); typedef void (*TestClusterAttributeListListAttributeCallback)(void * context, const chip::app::DataModel::DecodableList & data); -typedef void (*FaultInjectionGeneratedCommandListListAttributeCallback)( - void * context, const chip::app::DataModel::DecodableList & data); -typedef void (*FaultInjectionAcceptedCommandListListAttributeCallback)( - void * context, const chip::app::DataModel::DecodableList & data); -typedef void (*FaultInjectionAttributeListListAttributeCallback)( - void * context, const chip::app::DataModel::DecodableList & data); diff --git a/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h b/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h index 6762d44ce16409..96283a05033cd6 100644 --- a/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h +++ b/zzz_generated/controller-clusters/zap-generated/CHIPClusters.h @@ -631,14 +631,5 @@ class DLL_EXPORT TestClusterCluster : public ClusterBase ~TestClusterCluster() {} }; -class DLL_EXPORT FaultInjectionCluster : public ClusterBase -{ -public: - FaultInjectionCluster(Messaging::ExchangeManager & exchangeManager, const SessionHandle & session, EndpointId endpoint) : - ClusterBase(exchangeManager, session, app::Clusters::FaultInjection::Id, endpoint) - {} - ~FaultInjectionCluster() {} -}; - } // namespace Controller } // namespace chip diff --git a/zzz_generated/controller-clusters/zap-generated/PluginApplicationCallbacks.h b/zzz_generated/controller-clusters/zap-generated/PluginApplicationCallbacks.h index f11dc67564f01d..0b55a4004fc6ec 100644 --- a/zzz_generated/controller-clusters/zap-generated/PluginApplicationCallbacks.h +++ b/zzz_generated/controller-clusters/zap-generated/PluginApplicationCallbacks.h @@ -86,5 +86,4 @@ MatterApplicationBasicPluginClientInitCallback(); \ MatterAccountLoginPluginClientInitCallback(); \ MatterElectricalMeasurementPluginClientInitCallback(); \ - MatterTestClusterPluginClientInitCallback(); \ - MatterFaultInjectionPluginClientInitCallback(); + MatterTestClusterPluginClientInitCallback(); diff --git a/zzz_generated/controller-clusters/zap-generated/callback-stub.cpp b/zzz_generated/controller-clusters/zap-generated/callback-stub.cpp index 5522f84665c1e7..8258822775bbef 100644 --- a/zzz_generated/controller-clusters/zap-generated/callback-stub.cpp +++ b/zzz_generated/controller-clusters/zap-generated/callback-stub.cpp @@ -98,9 +98,6 @@ void emberAfClusterInitCallback(EndpointId endpoint, ClusterId clusterId) case ZCL_FAN_CONTROL_CLUSTER_ID: emberAfFanControlClusterInitCallback(endpoint); break; - case ZCL_FAULT_INJECTION_CLUSTER_ID: - emberAfFaultInjectionClusterInitCallback(endpoint); - break; case ZCL_FIXED_LABEL_CLUSTER_ID: emberAfFixedLabelClusterInitCallback(endpoint); break; @@ -348,11 +345,6 @@ void __attribute__((weak)) emberAfFanControlClusterInitCallback(EndpointId endpo // To prevent warning (void) endpoint; } -void __attribute__((weak)) emberAfFaultInjectionClusterInitCallback(EndpointId endpoint) -{ - // To prevent warning - (void) endpoint; -} void __attribute__((weak)) emberAfFixedLabelClusterInitCallback(EndpointId endpoint) { // To prevent warning diff --git a/zzz_generated/controller-clusters/zap-generated/endpoint_config.h b/zzz_generated/controller-clusters/zap-generated/endpoint_config.h index 730a7fb6a32cf6..02e8566c7cd596 100644 --- a/zzz_generated/controller-clusters/zap-generated/endpoint_config.h +++ b/zzz_generated/controller-clusters/zap-generated/endpoint_config.h @@ -79,7 +79,7 @@ #define GENERATED_FUNCTION_ARRAYS #define ZAP_CLUSTER_MASK(mask) CLUSTER_MASK_##mask -#define GENERATED_CLUSTER_COUNT 66 +#define GENERATED_CLUSTER_COUNT 65 // clang-format off #define GENERATED_CLUSTERS { \ @@ -798,17 +798,6 @@ .acceptedCommandList = nullptr ,\ .generatedCommandList = nullptr ,\ },\ - { \ - /* Endpoint: 1, Cluster: Fault Injection (client) */ \ - .clusterId = 0xFFF1FC06, \ - .attributes = ZAP_ATTRIBUTE_INDEX(0), \ - .attributeCount = 0, \ - .clusterSize = 0, \ - .mask = ZAP_CLUSTER_MASK(CLIENT), \ - .functions = NULL, \ - .acceptedCommandList = nullptr ,\ - .generatedCommandList = nullptr ,\ - },\ } // clang-format on @@ -820,7 +809,7 @@ // This is an array of EmberAfEndpointType structures. #define GENERATED_ENDPOINT_TYPES \ { \ - { ZAP_CLUSTER_INDEX(0), 66, 0 }, \ + { ZAP_CLUSTER_INDEX(0), 65, 0 }, \ } // Largest attribute size is needed for various buffers diff --git a/zzz_generated/controller-clusters/zap-generated/gen_config.h b/zzz_generated/controller-clusters/zap-generated/gen_config.h index ce1b5279cc45b9..0653ff31923019 100644 --- a/zzz_generated/controller-clusters/zap-generated/gen_config.h +++ b/zzz_generated/controller-clusters/zap-generated/gen_config.h @@ -94,7 +94,6 @@ #define EMBER_AF_ACCOUNT_LOGIN_CLUSTER_CLIENT_ENDPOINT_COUNT (1) #define EMBER_AF_ELECTRICAL_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (1) #define EMBER_AF_TEST_CLUSTER_CLIENT_ENDPOINT_COUNT (1) -#define EMBER_AF_FAULT_INJECTION_CLUSTER_CLIENT_ENDPOINT_COUNT (1) /**** Cluster Plugins ****/ @@ -357,7 +356,3 @@ // Use this macro to check if the client side of the Test Cluster cluster is included #define ZCL_USING_TEST_CLUSTER_CLIENT #define EMBER_AF_PLUGIN_TEST_CLUSTER_CLIENT - -// Use this macro to check if the client side of the Fault Injection cluster is included -#define ZCL_USING_FAULT_INJECTION_CLUSTER_CLIENT -#define EMBER_AF_PLUGIN_FAULT_INJECTION_CLIENT diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h index ec3f6fbaf1e027..ded9c6fb369a17 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h @@ -93049,457 +93049,6 @@ class SubscribeAttributeTestClusterClusterRevision : public SubscribeAttribute { } }; -/*----------------------------------------------------------------------------*\ -| Cluster FaultInjection | 0xFFF1FC06| -|------------------------------------------------------------------------------| -| Commands: | | -| * FailAtFault | 0x00 | -| * FailRandomlyAtFault | 0x01 | -|------------------------------------------------------------------------------| -| Attributes: | | -| * GeneratedCommandList | 0xFFF8 | -| * AcceptedCommandList | 0xFFF9 | -| * AttributeList | 0xFFFB | -| * FeatureMap | 0xFFFC | -| * ClusterRevision | 0xFFFD | -|------------------------------------------------------------------------------| -| Events: | | -\*----------------------------------------------------------------------------*/ - -/* - * Command FailAtFault - */ -class FaultInjectionFailAtFault : public ClusterCommand { -public: - FaultInjectionFailAtFault() - : ClusterCommand("fail-at-fault") - { - AddArgument("Type", 0, UINT8_MAX, &mRequest.type); - AddArgument("Id", 0, UINT32_MAX, &mRequest.id); - AddArgument("NumCallsToSkip", 0, UINT32_MAX, &mRequest.numCallsToSkip); - AddArgument("NumCallsToFail", 0, UINT32_MAX, &mRequest.numCallsToFail); - AddArgument("TakeMutex", 0, 1, &mRequest.takeMutex); - ClusterCommand::AddArguments(); - } - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) command (0x00000000) on endpoint %u", endpointId); - - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - __auto_type * params = [[MTRFaultInjectionClusterFailAtFaultParams alloc] init]; - params.timedInvokeTimeoutMs - = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; - params.type = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.type)]; - params.id = [NSNumber numberWithUnsignedInt:mRequest.id]; - params.numCallsToSkip = [NSNumber numberWithUnsignedInt:mRequest.numCallsToSkip]; - params.numCallsToFail = [NSNumber numberWithUnsignedInt:mRequest.numCallsToFail]; - params.takeMutex = [NSNumber numberWithBool:mRequest.takeMutex]; - uint16_t repeatCount = mRepeatCount.ValueOr(1); - uint16_t __block responsesNeeded = repeatCount; - while (repeatCount--) { - [cluster failAtFaultWithParams:params - completionHandler:^(NSError * _Nullable error) { - responsesNeeded--; - if (error != nil) { - mError = error; - LogNSError("Error", error); - } - if (responsesNeeded == 0) { - SetCommandExitStatus(mError); - } - }]; - } - return CHIP_NO_ERROR; - } - -private: - chip::app::Clusters::FaultInjection::Commands::FailAtFault::Type mRequest; -}; - -/* - * Command FailRandomlyAtFault - */ -class FaultInjectionFailRandomlyAtFault : public ClusterCommand { -public: - FaultInjectionFailRandomlyAtFault() - : ClusterCommand("fail-randomly-at-fault") - { - AddArgument("Type", 0, UINT8_MAX, &mRequest.type); - AddArgument("Id", 0, UINT32_MAX, &mRequest.id); - AddArgument("Percentage", 0, UINT8_MAX, &mRequest.percentage); - ClusterCommand::AddArguments(); - } - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) command (0x00000001) on endpoint %u", endpointId); - - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - __auto_type * params = [[MTRFaultInjectionClusterFailRandomlyAtFaultParams alloc] init]; - params.timedInvokeTimeoutMs - = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; - params.type = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.type)]; - params.id = [NSNumber numberWithUnsignedInt:mRequest.id]; - params.percentage = [NSNumber numberWithUnsignedChar:mRequest.percentage]; - uint16_t repeatCount = mRepeatCount.ValueOr(1); - uint16_t __block responsesNeeded = repeatCount; - while (repeatCount--) { - [cluster failRandomlyAtFaultWithParams:params - completionHandler:^(NSError * _Nullable error) { - responsesNeeded--; - if (error != nil) { - mError = error; - LogNSError("Error", error); - } - if (responsesNeeded == 0) { - SetCommandExitStatus(mError); - } - }]; - } - return CHIP_NO_ERROR; - } - -private: - chip::app::Clusters::FaultInjection::Commands::FailRandomlyAtFault::Type mRequest; -}; - -/* - * Attribute GeneratedCommandList - */ -class ReadFaultInjectionGeneratedCommandList : public ReadAttribute { -public: - ReadFaultInjectionGeneratedCommandList() - : ReadAttribute("generated-command-list") - { - } - - ~ReadFaultInjectionGeneratedCommandList() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId); - - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - [cluster readAttributeGeneratedCommandListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.GeneratedCommandList response %@", [value description]); - if (error != nil) { - LogNSError("FaultInjection GeneratedCommandList read Error", error); - } - SetCommandExitStatus(error); - }]; - return CHIP_NO_ERROR; - } -}; - -class SubscribeAttributeFaultInjectionGeneratedCommandList : public SubscribeAttribute { -public: - SubscribeAttributeFaultInjectionGeneratedCommandList() - : SubscribeAttribute("generated-command-list") - { - } - - ~SubscribeAttributeFaultInjectionGeneratedCommandList() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId); - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init]; - params.keepPreviousSubscriptions - = mKeepSubscriptions.HasValue() ? [NSNumber numberWithBool:mKeepSubscriptions.Value()] : nil; - params.fabricFiltered = mFabricFiltered.HasValue() ? [NSNumber numberWithBool:mFabricFiltered.Value()] : nil; - [cluster subscribeAttributeGeneratedCommandListWithMinInterval:[NSNumber numberWithUnsignedInt:mMinInterval] - maxInterval:[NSNumber numberWithUnsignedInt:mMaxInterval] - params:params - subscriptionEstablished:^() { - mSubscriptionEstablished = YES; - } - reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.GeneratedCommandList response %@", [value description]); - SetCommandExitStatus(error); - }]; - - return CHIP_NO_ERROR; - } -}; - -/* - * Attribute AcceptedCommandList - */ -class ReadFaultInjectionAcceptedCommandList : public ReadAttribute { -public: - ReadFaultInjectionAcceptedCommandList() - : ReadAttribute("accepted-command-list") - { - } - - ~ReadFaultInjectionAcceptedCommandList() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId); - - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - [cluster readAttributeAcceptedCommandListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.AcceptedCommandList response %@", [value description]); - if (error != nil) { - LogNSError("FaultInjection AcceptedCommandList read Error", error); - } - SetCommandExitStatus(error); - }]; - return CHIP_NO_ERROR; - } -}; - -class SubscribeAttributeFaultInjectionAcceptedCommandList : public SubscribeAttribute { -public: - SubscribeAttributeFaultInjectionAcceptedCommandList() - : SubscribeAttribute("accepted-command-list") - { - } - - ~SubscribeAttributeFaultInjectionAcceptedCommandList() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId); - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init]; - params.keepPreviousSubscriptions - = mKeepSubscriptions.HasValue() ? [NSNumber numberWithBool:mKeepSubscriptions.Value()] : nil; - params.fabricFiltered = mFabricFiltered.HasValue() ? [NSNumber numberWithBool:mFabricFiltered.Value()] : nil; - [cluster subscribeAttributeAcceptedCommandListWithMinInterval:[NSNumber numberWithUnsignedInt:mMinInterval] - maxInterval:[NSNumber numberWithUnsignedInt:mMaxInterval] - params:params - subscriptionEstablished:^() { - mSubscriptionEstablished = YES; - } - reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.AcceptedCommandList response %@", [value description]); - SetCommandExitStatus(error); - }]; - - return CHIP_NO_ERROR; - } -}; - -/* - * Attribute AttributeList - */ -class ReadFaultInjectionAttributeList : public ReadAttribute { -public: - ReadFaultInjectionAttributeList() - : ReadAttribute("attribute-list") - { - } - - ~ReadFaultInjectionAttributeList() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId); - - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - [cluster readAttributeAttributeListWithCompletionHandler:^(NSArray * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.AttributeList response %@", [value description]); - if (error != nil) { - LogNSError("FaultInjection AttributeList read Error", error); - } - SetCommandExitStatus(error); - }]; - return CHIP_NO_ERROR; - } -}; - -class SubscribeAttributeFaultInjectionAttributeList : public SubscribeAttribute { -public: - SubscribeAttributeFaultInjectionAttributeList() - : SubscribeAttribute("attribute-list") - { - } - - ~SubscribeAttributeFaultInjectionAttributeList() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId); - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init]; - params.keepPreviousSubscriptions - = mKeepSubscriptions.HasValue() ? [NSNumber numberWithBool:mKeepSubscriptions.Value()] : nil; - params.fabricFiltered = mFabricFiltered.HasValue() ? [NSNumber numberWithBool:mFabricFiltered.Value()] : nil; - [cluster subscribeAttributeAttributeListWithMinInterval:[NSNumber numberWithUnsignedInt:mMinInterval] - maxInterval:[NSNumber numberWithUnsignedInt:mMaxInterval] - params:params - subscriptionEstablished:^() { - mSubscriptionEstablished = YES; - } - reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.AttributeList response %@", [value description]); - SetCommandExitStatus(error); - }]; - - return CHIP_NO_ERROR; - } -}; - -/* - * Attribute FeatureMap - */ -class ReadFaultInjectionFeatureMap : public ReadAttribute { -public: - ReadFaultInjectionFeatureMap() - : ReadAttribute("feature-map") - { - } - - ~ReadFaultInjectionFeatureMap() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId); - - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - [cluster readAttributeFeatureMapWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.FeatureMap response %@", [value description]); - if (error != nil) { - LogNSError("FaultInjection FeatureMap read Error", error); - } - SetCommandExitStatus(error); - }]; - return CHIP_NO_ERROR; - } -}; - -class SubscribeAttributeFaultInjectionFeatureMap : public SubscribeAttribute { -public: - SubscribeAttributeFaultInjectionFeatureMap() - : SubscribeAttribute("feature-map") - { - } - - ~SubscribeAttributeFaultInjectionFeatureMap() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId); - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init]; - params.keepPreviousSubscriptions - = mKeepSubscriptions.HasValue() ? [NSNumber numberWithBool:mKeepSubscriptions.Value()] : nil; - params.fabricFiltered = mFabricFiltered.HasValue() ? [NSNumber numberWithBool:mFabricFiltered.Value()] : nil; - [cluster subscribeAttributeFeatureMapWithMinInterval:[NSNumber numberWithUnsignedInt:mMinInterval] - maxInterval:[NSNumber numberWithUnsignedInt:mMaxInterval] - params:params - subscriptionEstablished:^() { - mSubscriptionEstablished = YES; - } - reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.FeatureMap response %@", [value description]); - SetCommandExitStatus(error); - }]; - - return CHIP_NO_ERROR; - } -}; - -/* - * Attribute ClusterRevision - */ -class ReadFaultInjectionClusterRevision : public ReadAttribute { -public: - ReadFaultInjectionClusterRevision() - : ReadAttribute("cluster-revision") - { - } - - ~ReadFaultInjectionClusterRevision() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId); - - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - [cluster readAttributeClusterRevisionWithCompletionHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.ClusterRevision response %@", [value description]); - if (error != nil) { - LogNSError("FaultInjection ClusterRevision read Error", error); - } - SetCommandExitStatus(error); - }]; - return CHIP_NO_ERROR; - } -}; - -class SubscribeAttributeFaultInjectionClusterRevision : public SubscribeAttribute { -public: - SubscribeAttributeFaultInjectionClusterRevision() - : SubscribeAttribute("cluster-revision") - { - } - - ~SubscribeAttributeFaultInjectionClusterRevision() {} - - CHIP_ERROR SendCommand(MTRBaseDevice * device, chip::EndpointId endpointId) override - { - ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC06) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId); - dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL); - MTRBaseClusterFaultInjection * cluster = [[MTRBaseClusterFaultInjection alloc] initWithDevice:device - endpoint:endpointId - queue:callbackQueue]; - MTRSubscribeParams * params = [[MTRSubscribeParams alloc] init]; - params.keepPreviousSubscriptions - = mKeepSubscriptions.HasValue() ? [NSNumber numberWithBool:mKeepSubscriptions.Value()] : nil; - params.fabricFiltered = mFabricFiltered.HasValue() ? [NSNumber numberWithBool:mFabricFiltered.Value()] : nil; - [cluster subscribeAttributeClusterRevisionWithMinInterval:[NSNumber numberWithUnsignedInt:mMinInterval] - maxInterval:[NSNumber numberWithUnsignedInt:mMaxInterval] - params:params - subscriptionEstablished:^() { - mSubscriptionEstablished = YES; - } - reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) { - NSLog(@"FaultInjection.ClusterRevision response %@", [value description]); - SetCommandExitStatus(error); - }]; - - return CHIP_NO_ERROR; - } -}; - /*----------------------------------------------------------------------------*\ | Register all Clusters commands | \*----------------------------------------------------------------------------*/ @@ -97060,33 +96609,6 @@ void registerClusterTestCluster(Commands & commands) commands.Register(clusterName, clusterCommands); } -void registerClusterFaultInjection(Commands & commands) -{ - using namespace chip::app::Clusters::FaultInjection; - - const char * clusterName = "FaultInjection"; - - commands_list clusterCommands = { - make_unique(Id), // - make_unique(), // - make_unique(), // - make_unique(Id), // - make_unique(), // - make_unique(Id), // - make_unique(Id), // - make_unique(), // - make_unique(), // - make_unique(), // - make_unique(), // - make_unique(), // - make_unique(), // - make_unique(), // - make_unique(), // - make_unique(), // - }; - - commands.Register(clusterName, clusterCommands); -} void registerClusterAny(Commands & commands) { @@ -97171,5 +96693,4 @@ void registerClusters(Commands & commands) registerClusterAccountLogin(commands); registerClusterElectricalMeasurement(commands); registerClusterTestCluster(commands); - registerClusterFaultInjection(commands); } From 4e01ceeb2071ee2a53ea4fd3bba8759f292d504d Mon Sep 17 00:00:00 2001 From: Sergei Lissianoi <54454955+selissia@users.noreply.github.com> Date: Wed, 31 Aug 2022 16:06:03 -0400 Subject: [PATCH 27/27] Use a separate execution thread to disable the OpenThread interface (#22315) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Test added march 8 (#15957) * Added new manual scripts * Added Auto generated File * [OTA] Fix OTARequestorDriverImpl inclusion (#15981) * Regen to fix CI failures (#15990) * [ota] Store Default OTA Providers in flash (#15970) * [ota] Store Default OTA Providers in flash Store Default OTA Providers in flash each time the attribute is modified and load it back on the application startup. * Restyled by clang-format * Fix build and reduce flash usage Co-authored-by: Restyled.io * Disable OpenThread interface in a separate execution thread * Remove merge artifacts * Restyled by clang-format Co-authored-by: kowsisoundhar12 <57476670+kowsisoundhar12@users.noreply.github.com> Co-authored-by: Carol Yang Co-authored-by: Boris Zbarsky Co-authored-by: Damian Królik <66667989+Damian-Nordic@users.noreply.github.com> Co-authored-by: Restyled.io --- .../OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp index 3fde426337db7d..6d8506de69769a 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp @@ -453,7 +453,11 @@ void GenericThreadStackManagerImpl_OpenThread::_OnNetworkScanFinished // If Thread scanning was done before commissioning, turn off the IPv6 interface. if (otThreadGetDeviceRole(mOTInst) == OT_DEVICE_ROLE_DISABLED && !otDatasetIsCommissioned(mOTInst)) { - otIp6SetEnabled(mOTInst, false); + DeviceLayer::SystemLayer().ScheduleLambda([this]() { + Impl()->LockThreadStack(); + otIp6SetEnabled(mOTInst, false); + Impl()->UnlockThreadStack(); + }); } if (mpScanCallback != nullptr)