From 6a35ffaac24ea928786d8afb2737d58b5c59937a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Josefsen?= <69624991+ReneJosefsen@users.noreply.github.com> Date: Fri, 26 Jan 2024 14:08:37 +0100 Subject: [PATCH 01/28] Improved handling of SetAllEnabledAlarmsActive and ClearAllAlarms (#31649) --- .../boolean-state-configuration-server.cpp | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp b/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp index dd81c90cd00191..9ca68da511980d 100644 --- a/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp +++ b/src/app/clusters/boolean-state-configuration-server/boolean-state-configuration-server.cpp @@ -274,8 +274,11 @@ CHIP_ERROR SetAllEnabledAlarmsActive(EndpointId ep) VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsEnabled::Get(ep, &alarmsEnabled), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); - VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Set(ep, alarmsEnabled), CHIP_IM_GLOBAL_STATUS(Failure)); - emitAlarmsStateChangedEvent(ep); + if (alarmsEnabled.HasAny()) + { + VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Set(ep, alarmsEnabled), CHIP_IM_GLOBAL_STATUS(Failure)); + emitAlarmsStateChangedEvent(ep); + } return CHIP_NO_ERROR; } @@ -283,21 +286,34 @@ CHIP_ERROR SetAllEnabledAlarmsActive(EndpointId ep) CHIP_ERROR ClearAllAlarms(EndpointId ep) { BitMask alarmsActive, alarmsSuppressed; + bool emitEvent = false; + VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Get(ep, &alarmsActive), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Get(ep, &alarmsSuppressed), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); - if (alarmsActive.HasAny() || alarmsSuppressed.HasAny()) + if (alarmsActive.HasAny()) { alarmsActive.ClearAll(); - alarmsSuppressed.ClearAll(); VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsActive::Set(ep, alarmsActive), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); + emitEvent = true; + } + + if (alarmsSuppressed.HasAny()) + { + alarmsSuppressed.ClearAll(); VerifyOrReturnError(EMBER_ZCL_STATUS_SUCCESS == AlarmsSuppressed::Set(ep, alarmsSuppressed), CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)); + emitEvent = true; + } + + if (emitEvent) + { emitAlarmsStateChangedEvent(ep); } + return CHIP_NO_ERROR; } From 53b2d4b2532af48d46b77a9e0fccb700e1249136 Mon Sep 17 00:00:00 2001 From: Ingo Fischer Date: Fri, 26 Jan 2024 15:55:55 +0100 Subject: [PATCH 02/28] Fix typo in logging text (#31702) Address review comment https://github.com/project-chip/connectedhomeip/pull/31650#pullrequestreview-1845060829 --- scripts/tests/chiptest/test_definition.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tests/chiptest/test_definition.py b/scripts/tests/chiptest/test_definition.py index 037bf5aafbb29c..da1b56afd919e1 100644 --- a/scripts/tests/chiptest/test_definition.py +++ b/scripts/tests/chiptest/test_definition.py @@ -161,7 +161,7 @@ def __terminateProcess(self): try: self.process.wait(10) except subprocess.TimeoutExpired: - logging.debug('Subprocess did not terminated on SIGTERM, killing it now') + logging.debug('Subprocess did not terminate on SIGTERM, killing it now') self.process.kill() self.process.wait(10) self.process = None From 6e750ec060877b65697adf0d12b3afc7b986c3fe Mon Sep 17 00:00:00 2001 From: C Freeman Date: Fri, 26 Jan 2024 09:56:59 -0500 Subject: [PATCH 03/28] Python testing hello example: Fix for TH expectations (#31688) The TH expects tests to appear in a certain way to be properly picked up and parsed. Add instructions in the hello test and change the example names to match the expectations. --- src/python_testing/hello_external_runner.py | 6 +++--- src/python_testing/hello_test.py | 18 +++++++++++------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/python_testing/hello_external_runner.py b/src/python_testing/hello_external_runner.py index 5ae98636e4cfdf..648ba5a85ff4aa 100755 --- a/src/python_testing/hello_external_runner.py +++ b/src/python_testing/hello_external_runner.py @@ -137,9 +137,9 @@ def main(): app_process = subprocess.Popen([app_cmd], stdout=sys.stdout, stderr=sys.stderr, bufsize=0) commission() - one_test('test_failure_on_wrong_endpoint') - one_test('test_names_as_expected') - one_test('test_pics') + one_test('test_TC_NAMES_2_1') + one_test('test_TC_ENDPOINT_2_1') + one_test('test_TC_PICSTEST_2_1') app_process.send_signal(signal.SIGINT.value) app_process.wait() diff --git a/src/python_testing/hello_test.py b/src/python_testing/hello_test.py index 8084edcc75a014..d6953bf3912c11 100644 --- a/src/python_testing/hello_test.py +++ b/src/python_testing/hello_test.py @@ -27,8 +27,10 @@ class HelloTest(MatterBaseTest): # This example test does not include the step_ and desc_ markers # The MatterBaseTest will assume a single step and create a description # based on the test name + # To work in the Test harness, all tests should be named as + # TC_PICSCODE_#_#, (substituting the appropriate pics codes and numbers for the test) @async_test_body - async def test_names_as_expected(self): + async def test_TC_NAMES_2_1(self): dev_ctrl = self.default_controller vendor_name = await self.read_single_attribute( dev_ctrl, @@ -44,17 +46,19 @@ async def test_names_as_expected(self): # for the test, then use self.step(#) to indicate how the test proceeds through the test plan. # Support for keeping the TH up to date is built into MatterBaseTest when you use the step() # function. - def steps_failure_on_wrong_endpoint(self) -> list[TestStep]: + # If the device needs to be commissioned before running the test, ensure the first step in + # this function is marked is_commissioning=True. + def steps_TC_ENDPOINT_2_1(self) -> list[TestStep]: steps = [TestStep(1, "Commissioning, already done", is_commissioning=True), TestStep(2, "Read ProductName on endpoint 9999"), ] return steps - def desc_failure_on_wrong_endpoint(self) -> str: + def desc_TC_ENDPOINT_2_1(self) -> str: return '#.#.#. [TC-HELLO-x.x] Test Failure On Wrong Endpoint' @async_test_body - async def test_failure_on_wrong_endpoint(self): + async def test_TC_ENDPOINT_2_1(self): self.step(1) # Commissioning self.step(2) @@ -68,7 +72,7 @@ async def test_failure_on_wrong_endpoint(self): asserts.assert_true(isinstance(result, Clusters.Attribute.ValueDecodeFailure), "Should fail to read on endpoint 9999") asserts.assert_equal(result.Reason.status, Status.UnsupportedEndpoint, "Failure reason should be UnsupportedEndpoint") - def steps_pics(self) -> list[TestStep]: + def steps_TC_PICSTEST_2_1(self) -> list[TestStep]: steps = [TestStep(1, "Commissioning, already done", is_commissioning=True), TestStep(2, "Skip this step based on pics"), TestStep(3, "Run this step"), @@ -76,11 +80,11 @@ def steps_pics(self) -> list[TestStep]: ] return steps - def desc_pics(self) -> str: + def desc_TC_PICSTEST_2_1(self) -> str: return "#.#.#. [TC-HELLO-x.x] Test pics" @async_test_body - async def test_pics(self): + async def test_TC_PICSTEST_2_1(self): self.step(1) # commissioning print('This should be run') From 720fbe04890cd94423952003164e8717d1dc5375 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Fri, 26 Jan 2024 10:35:03 -0500 Subject: [PATCH 04/28] Fix mypy complaints about nullability (#31711) --- scripts/py_matter_idl/matter_idl/backwards_compatibility.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/py_matter_idl/matter_idl/backwards_compatibility.py b/scripts/py_matter_idl/matter_idl/backwards_compatibility.py index 99adaf7a64bc0b..04377100312756 100644 --- a/scripts/py_matter_idl/matter_idl/backwards_compatibility.py +++ b/scripts/py_matter_idl/matter_idl/backwards_compatibility.py @@ -279,8 +279,10 @@ def _check_cluster_list_compatible(self, original: List[Cluster], updated: List[ for original_cluster in original: updated_cluster = updated_clusters.get(original_cluster.name) - if not_stable(updated_cluster.api_maturity) or not_stable(original_cluster.api_maturity): - # no point in checking + if not_stable(original_cluster.api_maturity): + continue + + if updated_cluster and not_stable(updated_cluster.api_maturity): continue self._check_cluster_compatible(original_cluster, updated_cluster) From bbddfba3bd4bd7ed6cd37cef3ff8e4004a8c80d5 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Fri, 26 Jan 2024 11:41:47 -0500 Subject: [PATCH 05/28] Fixes in the ability to run jupyter-lab: better startup script & build_python support (#31691) * Fix up jupyter-lab execution environment: - relative paths for the paa-store were not working and it was hard to debug them. Added detection of this error and auto-adjustment for the common case of running scripts from a subdir - added option to build_python to auto-install these requirements. * Restyle * Remove unused imports * Jupyterlab sets name to main ... so make use of it * make linter happy * Fix typo * Remove checkpoint - probably should not have beeen checked in to start with * Add jupyter temp dir to gitignore --- .gitignore | 4 + ...tter - Basic Interactions-checkpoint.ipynb | 4218 ----------------- scripts/build_python.sh | 14 + scripts/jupyterlab_requirements.txt | 17 + src/controller/python/chip/ChipReplStartup.py | 139 +- 5 files changed, 127 insertions(+), 4265 deletions(-) delete mode 100644 docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb create mode 100644 scripts/jupyterlab_requirements.txt diff --git a/.gitignore b/.gitignore index 4c17bb63a84a8c..d6aefb1d928c1b 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,7 @@ examples/thermostat/ameba/build # https://github.com/espressif/idf-component-manager#using-with-a-project examples/*/esp32/managed_components examples/*/esp32/dependencies.lock + +# jupyter temporary files +.ipynb_checkpoints + diff --git a/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb b/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb deleted file mode 100644 index 1aea4a55b48e4e..00000000000000 --- a/docs/guides/repl/.ipynb_checkpoints/Matter - Basic Interactions-checkpoint.ipynb +++ /dev/null @@ -1,4218 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "e8b2f5eb", - "metadata": { - "tags": [] - }, - "source": [ - "# Interaction Model Examples\n", - "\n", - "\n", - "\"drawing\"\n", - "\n", - "

\n", - "\n", - "This walks through the various interactions that can be initiated from the REPL towards a target using the Matter Interaction Model (IM) and Data Model (DM)." - ] - }, - { - "cell_type": "markdown", - "id": "d2ed9fe9-e4a7-4540-a434-8f4ee1362bc6", - "metadata": {}, - "source": [ - "## Clear Persisted Storage\n", - "\n", - "Let's clear out our persisted storage (if one exists) to start from a clean slate." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "06c609a5-1d5c-4ae2-85f0-39a280d1bf2c", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import os, subprocess\n", - "\n", - "if os.path.isfile('/tmp/repl-storage.json'):\n", - " os.remove('/tmp/repl-storage.json')\n", - "\n", - "# So that the all-clusters-app won't boot with stale prior state.\n", - "os.system('rm -rf /tmp/chip_*')" - ] - }, - { - "cell_type": "markdown", - "id": "99ce2877", - "metadata": { - "tags": [] - }, - "source": [ - "## Initialization\n", - "\n", - "Let's first begin by setting up by importing some key modules that are needed to make it easier for us to interact with the Matter stack.\n", - "\n", - "`ChipReplStartup.py` is run within the global namespace. This results in all of its imports being made available here.\n", - "\n", - "> **NOTE**: _This is not needed if you launch the REPL from the command-line._" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bad327b7-c78a-4c46-b224-077fe7539ee1", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "import chip.native\n", - "import pkgutil\n", - "module = pkgutil.get_loader('chip.ChipReplStartup')\n", - "%run {module.path}" - ] - }, - { - "cell_type": "markdown", - "id": "047c4785-bb5f-41bd-9fce-5e8a7442f227", - "metadata": {}, - "source": [ - "## Cluster Elements\n", - "\n", - "The Interaction Model uses data model types that refer not just to the various base types defines in the spec, but types that correspond to structs/commands/events/attributes defined in each cluster specification. The cluster-specific types are referred to as 'cluster objects'. These are represented as Python dataclasses, with each field in the respective object equivalently named as a member within the dataclass.\n", - "\n", - "### Namespaces\n", - "\n", - "Objects in clusters are organized into namespaces. All clusters can be found under the `Clusters` namespace, with the appropriate cluster in upper camel case within that. (e.g `Clusters.TestCluster`).\n", - "\n", - "Within that, `Commands`, `Structs` and `Attributes` delimit the respective types in the cluster.\n", - "\n", - "_Example Struct:_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "043ade5d-6f01-4cbc-8d60-57d605946ada", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "SimpleStruct(\n",
-       "a=20,\n",
-       "b=True,\n",
-       "c=<SimpleEnum.kValueA: 1>,\n",
-       "d=b'1234',\n",
-       "e=30,\n",
-       "f=0,\n",
-       "g=23.234,\n",
-       "h=0.0\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m20\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kValueA:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'1234'\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33me\u001b[0m=\u001b[1;36m30\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m23\u001b[0m\u001b[1;36m.234\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "v = Clusters.TestCluster.Structs.SimpleStruct()\n", - "v.a = 20\n", - "v.b = True\n", - "v.c = Clusters.TestCluster.Enums.SimpleEnum.kValueA\n", - "v.d = b'1234'\n", - "v.e = 30\n", - "v.g = 23.234\n", - "\n", - "v" - ] - }, - { - "cell_type": "markdown", - "id": "62b3ca42-c2d2-4252-8683-47b0c1a1319d", - "metadata": {}, - "source": [ - "_Example Command:_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d52b1adc-7723-4be8-80c0-f7f262398d39", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "TestAddArguments(\n",
-       "arg1=0,\n",
-       "arg2=0\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1;35mTestAddArguments\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1;36m0\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Clusters.TestCluster.Commands.TestAddArguments()" - ] - }, - { - "cell_type": "markdown", - "id": "ae69ad3b-7dd5-4ef2-9ba3-5944c0c2c2bf", - "metadata": {}, - "source": [ - "To get more information about the fields in these objects and their types, run:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c55de6c7-da4e-488e-bafb-32781ee088a8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
╭──────── <class 'chip.clusters.Objects.TestCluster.Commands.TestAddArguments'> ─────────╮\n",
-       " def TestCluster.Commands.TestAddArguments(arg1: 'uint' = 0, arg2: 'uint' = 0) -> None: \n",
-       "                                                                                        \n",
-       " TestAddArguments(arg1: 'uint' = 0, arg2: 'uint' = 0)                                   \n",
-       "                                                                                        \n",
-       "                  arg1 = 0                                                              \n",
-       "                  arg2 = 0                                                              \n",
-       "            cluster_id = 1295                                                           \n",
-       "            command_id = 4                                                              \n",
-       "            descriptor = ClusterObjectDescriptor(                                       \n",
-       "                             Fields=[                                                   \n",
-       "                                 ClusterObjectFieldDescriptor(                          \n",
-       "                                     Label='arg1',                                      \n",
-       "                                     Tag=0,                                             \n",
-       "                                     Type=<class 'chip.tlv.uint'>                       \n",
-       "                                 ),                                                     \n",
-       "                                 ClusterObjectFieldDescriptor(                          \n",
-       "                                     Label='arg2',                                      \n",
-       "                                     Tag=1,                                             \n",
-       "                                     Type=<class 'chip.tlv.uint'>                       \n",
-       "                                 )                                                      \n",
-       "                             ]                                                          \n",
-       "                         )                                                              \n",
-       "             is_client = True                                                           \n",
-       " must_use_timed_invoke = False                                                          \n",
-       "              FromDict = def FromDict(data: dict):                                      \n",
-       "               FromTLV = def FromTLV(data: bytes):                                      \n",
-       "                 ToTLV = def ToTLV(self):                                               \n",
-       "╰────────────────────────────────────────────────────────────────────────────────────────╯\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[34m╭─\u001b[0m\u001b[34m─────── \u001b[0m\u001b[1;34m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Commands.TestAddArguments'\u001b[0m\u001b[1;34m>\u001b[0m\u001b[34m ────────\u001b[0m\u001b[34m─╮\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;96mdef \u001b[0m\u001b[1;31mTestCluster.Commands.TestAddArguments\u001b[0m\u001b[1m(\u001b[0marg1: \u001b[32m'uint'\u001b[0m = \u001b[1;36m0\u001b[0m, arg2: \u001b[32m'uint'\u001b[0m = \u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m -> \u001b[3;35mNone\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;35mTestAddArguments\u001b[0m\u001b[1;36m(\u001b[0m\u001b[36marg1: \u001b[0m\u001b[32m'uint'\u001b[0m\u001b[36m = \u001b[0m\u001b[1;36m0\u001b[0m\u001b[36m, arg2: \u001b[0m\u001b[32m'uint'\u001b[0m\u001b[36m = \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;36m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33marg1\u001b[0m = \u001b[1;36m0\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33marg2\u001b[0m = \u001b[1;36m0\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mcluster_id\u001b[0m = \u001b[1;36m1295\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mcommand_id\u001b[0m = \u001b[1;36m4\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mdescriptor\u001b[0m = \u001b[1;35mClusterObjectDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mFields\u001b[0m=\u001b[1m[\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;35mClusterObjectFieldDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mLabel\u001b[0m=\u001b[32m'arg1'\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mTag\u001b[0m=\u001b[1;36m0\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mType\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.tlv.uint'\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1;35mClusterObjectFieldDescriptor\u001b[0m\u001b[1m(\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mLabel\u001b[0m=\u001b[32m'arg2'\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mTag\u001b[0m=\u001b[1;36m1\u001b[0m, \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[33mType\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.tlv.uint'\u001b[0m\u001b[1m>\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m]\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[1m)\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mis_client\u001b[0m = \u001b[3;92mTrue\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mmust_use_timed_invoke\u001b[0m = \u001b[3;91mFalse\u001b[0m \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mFromDict\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mFromDict\u001b[0m\u001b[1m(\u001b[0mdata: dict\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mFromTLV\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mFromTLV\u001b[0m\u001b[1m(\u001b[0mdata: bytes\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m│\u001b[0m \u001b[3;33mToTLV\u001b[0m = \u001b[3;96mdef \u001b[0m\u001b[1;31mToTLV\u001b[0m\u001b[1m(\u001b[0mself\u001b[1m)\u001b[0m: \u001b[34m│\u001b[0m\n", - "\u001b[34m╰────────────────────────────────────────────────────────────────────────────────────────╯\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "matterhelp(Clusters.TestCluster.Commands.TestAddArguments)" - ] - }, - { - "cell_type": "markdown", - "id": "c7724d12-2a35-49f1-bb9f-ee010200b1aa", - "metadata": {}, - "source": [ - "### Nullable Fields\n", - "\n", - "For fields that are nullable, they are represented as a `Typing.Union[Nullable, ...]`. This means that it can either be a `Nullable` type or the underlying type of the field.\n", - "\n", - "When nullable, a field can either take on the value of the native type, or a value of `NullValue`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "eb2563ac-0315-45ed-9984-308d4376ca94", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "NullablesAndOptionalsStruct(\n",
-       "nullableInt=Null,\n",
-       "optionalInt=None,\n",
-       "nullableOptionalInt=None,\n",
-       "nullableString=Null,\n",
-       "optionalString=None,\n",
-       "nullableOptionalString=None,\n",
-       "nullableStruct=Null,\n",
-       "optionalStruct=None,\n",
-       "nullableOptionalStruct=None,\n",
-       "nullableList=Null,\n",
-       "optionalList=None,\n",
-       "nullableOptionalList=None\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1;35mNullablesAndOptionalsStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableInt\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33moptionalInt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableOptionalInt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableString\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33moptionalString\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableOptionalString\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableStruct\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33moptionalStruct\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableOptionalStruct\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableList\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33moptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mnullableOptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a = Clusters.TestCluster.Structs.NullablesAndOptionalsStruct()\n", - "a.nullableInt = Clusters.Types.NullValue\n", - "a" - ] - }, - { - "cell_type": "markdown", - "id": "0786dd6b-df15-4cf4-b0a9-0578f040bd27", - "metadata": {}, - "source": [ - "### Optional Fields\n", - "\n", - "If a field is optional, it is represented in the typing hints as a `Typing.Union[NoneType, ...]`. An optional field that isn't present has a value of `None`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "75de30fc-666c-4610-9d86-25fb9d0e4f82", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
None\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[3;35mNone\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "print(a.nullableOptionalInt)" - ] - }, - { - "cell_type": "markdown", - "id": "ee702b80-6f93-4627-8f9e-c97ebaa41de6", - "metadata": {}, - "source": [ - "### Defaults\n", - "\n", - "Upon construction of a cluster object, the fields within that object are automatically initialized to type specific defaults as specified in the data model specification:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "677ce9b4-99f3-4c0e-8f78-d123eb3190b5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "SimpleStruct(\n",
-       "a=0,\n",
-       "b=False,\n",
-       "c=0,\n",
-       "d=b'',\n",
-       "e='',\n",
-       "f=0,\n",
-       "g=0.0,\n",
-       "h=0.0\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mc\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "Clusters.TestCluster.Structs.SimpleStruct()" - ] - }, - { - "cell_type": "markdown", - "id": "322ebc15-ae5d-4e84-bb66-a5d77d1e04c6", - "metadata": { - "tags": [] - }, - "source": [ - "## IM Interactions\n", - "\n", - "This section will walk through the various types of IM Interactions that are possible in the REPL." - ] - }, - { - "cell_type": "markdown", - "id": "7a082d33-bebd-4b34-b8e3-df59ed429c54", - "metadata": { - "tags": [] - }, - "source": [ - "### Commission and Setup Server" - ] - }, - { - "cell_type": "markdown", - "id": "4f458209-bfd4-4682-acac-5faadeecd97a", - "metadata": { - "tags": [] - }, - "source": [ - "#### Launch Server\n", - "\n", - "Let's launch an instance of the `chip-all-clusters-app`.\n", - "\n", - "> NOTE: If you're interacting with real devices, this step can be skipped." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "52ccd8c6", - "metadata": {}, - "outputs": [], - "source": [ - "import time, os\n", - "import subprocess\n", - "\n", - "# So that the all-clusters-app won't boot with stale prior state. \n", - "os.system('pkill -f chip-all-clusters-app')\n", - "\n", - "# The location of the all-clusters-app in the cloud playground is one level higher - adjust for this by testing for file presence.\n", - "if (os.path.isfile('../../../out/debug/chip-all-clusters-app')):\n", - " appPath = '../../../out/debug/chip-all-clusters-app'\n", - "else:\n", - " appPath = '../../../../out/debug/chip-all-clusters-app'\n", - " \n", - "process = subprocess.Popen(appPath, stdout=subprocess.DEVNULL)\n", - "time.sleep(1)" - ] - }, - { - "cell_type": "markdown", - "id": "b33dec2e", - "metadata": {}, - "source": [ - "#### Discover and commission commissionable node" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "67fa53b3", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "[\n",
-       "CommissionableNode(\n",
-       "│   │   (To Be Commissioned By)='caIndex(1)/fabricId(0x0000000000000001)/nodeId(0x000000000001B669)',\n",
-       "│   │   CommissionableNode(\n",
-       "│   │   │   instanceName='B2D5B11D799BB1E0',\n",
-       "│   │   │   hostName='DCA632A54C510000',\n",
-       "│   │   │   port=5540,\n",
-       "│   │   │   longDiscriminator=3840,\n",
-       "│   │   │   vendorId=65521,\n",
-       "│   │   │   productId=32769,\n",
-       "│   │   │   commissioningMode=1,\n",
-       "│   │   │   deviceType=0,\n",
-       "│   │   │   deviceName='',\n",
-       "│   │   │   pairingInstruction='',\n",
-       "│   │   │   pairingHint=33,\n",
-       "│   │   │   mrpRetryIntervalIdle=5000,\n",
-       "│   │   │   mrpRetryIntervalActive=300,\n",
-       "│   │   │   supportsTcp=True,\n",
-       "│   │   │   addresses=[\n",
-       "│   │   │   │   'fd1e:1a94:d591:6914:dea6:32ff:fea5:4c51',\n",
-       "│   │   │   │   'fe80::dea6:32ff:fea5:4c51',\n",
-       "│   │   │   │   '172.16.243.198'\n",
-       "│   │   │   ]\n",
-       "│   │   )\n",
-       ")\n",
-       "]\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;35mCommissionableNode\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m(\u001b[0mTo Be Commissioned By\u001b[1m)\u001b[0m=\u001b[32m'caIndex\u001b[0m\u001b[32m(\u001b[0m\u001b[32m1\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/fabricId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x0000000000000001\u001b[0m\u001b[32m)\u001b[0m\u001b[32m/nodeId\u001b[0m\u001b[32m(\u001b[0m\u001b[32m0x000000000001B669\u001b[0m\u001b[32m)\u001b[0m\u001b[32m'\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1;35mCommissionableNode\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33minstanceName\u001b[0m=\u001b[32m'B2D5B11D799BB1E0'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mhostName\u001b[0m=\u001b[32m'DCA632A54C510000'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mport\u001b[0m=\u001b[1;36m5540\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mlongDiscriminator\u001b[0m=\u001b[1;36m3840\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m65521\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mproductId\u001b[0m=\u001b[1;36m32769\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mcommissioningMode\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mdeviceType\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mdeviceName\u001b[0m=\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpairingInstruction\u001b[0m=\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpairingHint\u001b[0m=\u001b[1;36m33\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mmrpRetryIntervalIdle\u001b[0m=\u001b[1;36m5000\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mmrpRetryIntervalActive\u001b[0m=\u001b[1;36m300\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33msupportsTcp\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33maddresses\u001b[0m=\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'fd1e:1a94:d591:6914:dea6:32ff:fea5:4c51'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'fe80::dea6:32ff:fea5:4c51'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'172.16.243.198'\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-08-19 14:57:45 songguo.sha.corp.google.com chip.DIS[3192750] ERROR Timeout waiting for mDNS resolution.\n" - ] - } - ], - "source": [ - "devices = devCtrl.DiscoverCommissionableNodes(filterType=chip.discovery.FilterType.LONG_DISCRIMINATOR, filter=3840, stopOnFirst=True, timeoutSecond=2)\n", - "devices" - ] - }, - { - "cell_type": "markdown", - "id": "ed6f08a9", - "metadata": {}, - "source": [ - "You can find a list of discovered device\n", - "\n", - "You can call `Commission(nodeId, setupPinCode)` on one of the returned object:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2a7a7c40", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "devices[0].Commission(233, 20202021)" - ] - }, - { - "cell_type": "markdown", - "id": "78ef00f9", - "metadata": {}, - "source": [ - "The device will be commissioned by the DeviceController instance that discovered it (`caIndex(1)/fabricId(0x0000000000000001)/nodeId(0x000000000001B669)` in this case)." - ] - }, - { - "cell_type": "markdown", - "id": "aa9c6906", - "metadata": {}, - "source": [ - "#### Commission Target (Locally Launched App)\n", - "\n", - "Commission the target with a NodeId of 1." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "5e964fe3", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-01-29 15:34:45 johnsj-macbookpro1.roam.corp.google.com chip.SC[10607] ERROR The device does not support GetClock_RealTimeMS() API. This will eventually result in CASE session setup failures.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Node address has been updated\n", - "Commissioning complete\n" - ] - }, - { - "data": { - "text/html": [ - "
True\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[3;92mTrue\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "devCtrl.CommissionIP(b'127.0.0.1', 20202021, 2)" - ] - }, - { - "cell_type": "markdown", - "id": "46c82aa0-d99b-4073-ad22-0ce260ba025a", - "metadata": { - "tags": [] - }, - "source": [ - "#### Commission Target (BLE + Thread)\n", - "\n", - "To commission a Thread-based target over BLE, ensure your BLE stack is up on your host and available as `hci0` on Linux. You can confirm this by running `hciconfig -a`. You'll also need Thread credentials to join the Thread network.\n", - "\n", - "> NOTE: MacOS Monterey is currently not supported due to issues with its BLE stack." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a1e762ad-b272-4a9c-959c-6fc1543d9631", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "devCtrl.CommissionThread(3840, 20202021, 2, b'\\x01\\x03\\xff')" - ] - }, - { - "cell_type": "markdown", - "id": "bd93c3f0-651a-4e66-9d35-613b009e98cb", - "metadata": { - "tags": [] - }, - "source": [ - "#### Commission Target (BLE + WiFi)\n", - "\n", - "To commission a Wifi-based target over BLE, ensure your BLE stack is up on your host and available as `hci0` on Linux. You can confirm this by running `hciconfig -a`. You'll also need Wifi credentials to join the Thread network.\n", - "\n", - "> NOTE: MacOS Monterey is currently not supported due to issues with its BLE stack." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b552280-8586-4b5d-acde-c7806e882f23", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "devCtrl.CommissionWiFi(3840, 20202021, 2, 'MyWifiSsid', 'MyWifiPassword')" - ] - }, - { - "cell_type": "markdown", - "id": "c22ea8ee", - "metadata": { - "tags": [] - }, - "source": [ - "### Invoke Interaction" - ] - }, - { - "cell_type": "markdown", - "id": "4c94d599-e243-43de-8abe-bb4d9b1f52d4", - "metadata": {}, - "source": [ - "#### Basic Command (Success Response)" - ] - }, - { - "cell_type": "markdown", - "id": "52e6e92e-0bc6-45f2-9b6b-74d43ba3048c", - "metadata": {}, - "source": [ - "Let's send a basic command to turn on/off the light on Endpoint 1." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "bed38512-91f8-4d4e-b6e1-b30749137bbd", - "metadata": {}, - "outputs": [], - "source": [ - "await devCtrl.SendCommand(2, 1, Clusters.OnOff.Commands.On())" - ] - }, - { - "cell_type": "markdown", - "id": "b1c0fe3c-95da-4980-9b9b-2a5ab602af44", - "metadata": {}, - "source": [ - "The receipt of a successful status response will result in the command just returning successfully. Otherwise, an exception will be thrown." - ] - }, - { - "cell_type": "markdown", - "id": "80c604b9-f6dc-4ec5-91e8-a6e806c821a6", - "metadata": {}, - "source": [ - "#### Basic Command (Failure Response)" - ] - }, - { - "cell_type": "markdown", - "id": "753f5a54-4a75-41ed-a7c0-99c8cca8b6de", - "metadata": { - "tags": [] - }, - "source": [ - "If we send the same command to an invalid endpoint, an exception is thrown. If an IM status code was received from the server, a `InteractionModelError` is thrown containing the IM status code:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "2935f13b-ca16-4f9c-b320-8896c8465278", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
InteractionModelError(<Status.Failure: 1>)\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.Failure:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "try:\n", - " await devCtrl.SendCommand(2, 100, Clusters.OnOff.Commands.On())\n", - "except Exception as e:\n", - " pprint(e)" - ] - }, - { - "cell_type": "markdown", - "id": "5296f2bc-5e9d-4b06-a7c1-f247ebe5eac2", - "metadata": {}, - "source": [ - "#### Basic Command (Data Response)" - ] - }, - { - "cell_type": "markdown", - "id": "bb196da4-5162-4c4b-ae64-ef1d23a04eb9", - "metadata": { - "tags": [] - }, - "source": [ - "Here's an example of a command that sends back a data response, and how that is presented:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "33f34d12-79f4-4230-836b-2e66ea839440", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "TestListInt8UReverseResponse(\n",
-       "arg1=[\n",
-       "│   │   7,\n",
-       "│   │   5,\n",
-       "│   │   3,\n",
-       "│   │   1\n",
-       "]\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1;35mTestListInt8UReverseResponse\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1;36m7\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1;36m5\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m]\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.SendCommand(2, 1, Clusters.TestCluster.Commands.TestListInt8UReverseRequest([1, 3, 5, 7]))" - ] - }, - { - "cell_type": "markdown", - "id": "a513295e-c44f-4deb-aa36-8b404c91e95e", - "metadata": {}, - "source": [ - "### Read Interaction\n", - "\n", - "The `ReadAttribute` method on the `DeviceController` class can be used to read attributes from a target. The NodeId of the target is the first argument, followed by a list of paths that are expressed as cluster object namespaces to the respective slices of the data that is requested.\n", - "\n", - "By default, the data is returned as a dictionary, with the top-level item representing the endpoint, then the cluster and the attribute. The latter two keys are expressed using cluster object namespaces." - ] - }, - { - "cell_type": "markdown", - "id": "493dae62-f9fe-40b6-9c3d-0584e9c1893f", - "metadata": {}, - "source": [ - "#### Read 1 attribute:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "7167af96-43b1-4524-8712-592e3ede6114", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a = await devCtrl.ReadAttribute(2, [Clusters.TestCluster.Attributes.Int16u])\n", - "a" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "b6c3bf1f-3247-4f8d-ac42-1b5ebc59cb44", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "<class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a[1][Clusters.TestCluster]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "a2cafa5e-6c0e-42b9-bac0-8a1770306718", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
0\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1;36m0\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "a[1][Clusters.TestCluster][Clusters.TestCluster.Attributes.Int16u]" - ] - }, - { - "cell_type": "markdown", - "id": "49f5a4f5-9d0e-4678-a4b1-9b00cf5518c1", - "metadata": { - "tags": [] - }, - "source": [ - "#### Read 2 attributes:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "8e2cb85c-9fa4-4f2e-bd71-aea54988274d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Boolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Boolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [Clusters.TestCluster.Attributes.Int16u, Clusters.TestCluster.Attributes.Boolean])" - ] - }, - { - "cell_type": "markdown", - "id": "b276df34-e38b-4a1e-a104-7f0e71842a75", - "metadata": {}, - "source": [ - "#### Read the entirety of a cluster on an endpoint:\n", - "\n", - "The path is represented as tuple of (endpoint, cluster)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "043cb3ac-3346-45f1-bcd3-803ea33dc3c0", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [(1, Clusters.OnOff)])" - ] - }, - { - "cell_type": "markdown", - "id": "07a9e227-4f53-42a9-8fb0-5da32515dc9f", - "metadata": {}, - "source": [ - "#### Read the entirety of a cluster across all endpoints:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "15d7a880-9ddd-4619-9e42-3fd8895d80e1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   }\n",
-       "},\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [Clusters.OnOff])" - ] - }, - { - "cell_type": "markdown", - "id": "8d2403ba-91f1-4b59-b5ce-68ccc175f8ea", - "metadata": {}, - "source": [ - "#### Read an endpoint:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "accb9351-c8e0-4a4e-86d9-784b35903144", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   1030\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'>: 2\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m6\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m29\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1030\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [2])" - ] - }, - { - "cell_type": "markdown", - "id": "8aad8fef-66d7-4320-ba3c-47b481d66960", - "metadata": {}, - "source": [ - "#### Read the entire node:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "6fff453d-59a4-4dba-878f-1c65c7b1958b", - "metadata": { - "scrolled": true, - "tags": [] - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 0, Attribute = , got IM Error: InteractionModelError: UnsupportedRead (0x8f)\n", - "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 1, Attribute = , got IM Error: InteractionModelError: UnsupportedRead (0x8f)\n", - "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 1, Attribute = , got IM Error: InteractionModelError: InvalidDataType (0x8d)\n", - "2022-01-25 16:58:32 johnsj-macbookpro1.roam.corp.google.com root[27801] ERROR For path: Endpoint = 1, Attribute = , got IM Error: InteractionModelError: Failure (0x1)\n" - ] - }, - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "0: {\n",
-       "│   │   <class 'chip.clusters.Objects.Identify'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyType'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=22,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   3,\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   30,\n",
-       "│   │   │   │   31,\n",
-       "│   │   │   │   40,\n",
-       "│   │   │   │   42,\n",
-       "│   │   │   │   43,\n",
-       "│   │   │   │   44,\n",
-       "│   │   │   │   46,\n",
-       "│   │   │   │   48,\n",
-       "│   │   │   │   49,\n",
-       "│   │   │   │   50,\n",
-       "│   │   │   │   51,\n",
-       "│   │   │   │   52,\n",
-       "│   │   │   │   53,\n",
-       "│   │   │   │   54,\n",
-       "│   │   │   │   55,\n",
-       "│   │   │   │   60,\n",
-       "│   │   │   │   62,\n",
-       "│   │   │   │   63,\n",
-       "│   │   │   │   64,\n",
-       "│   │   │   │   65,\n",
-       "│   │   │   │   1029\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [\n",
-       "│   │   │   │   41\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [\n",
-       "│   │   │   │   1,\n",
-       "│   │   │   │   2\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Binding'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Binding.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AccessControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.Acl'>: [\n",
-       "│   │   │   │   AccessControlEntry(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   privilege=<Privilege.kAdminister: 5>,\n",
-       "│   │   │   │   │   authMode=<AuthMode.kCase: 2>,\n",
-       "│   │   │   │   │   subjects=[\n",
-       "│   │   │   │   │   │   1\n",
-       "│   │   │   │   │   ],\n",
-       "│   │   │   │   │   targets=Null\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.Extension'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccessControl.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Basic'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.InteractionModelVersion'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.VendorName'>: 'TEST_VENDOR',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.VendorID'>: 9050,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductName'>: 'TEST_PRODUCT',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductID'>: 65279,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.NodeLabel'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.Location'>: 'XX',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.HardwareVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.HardwareVersionString'>: 'TEST_VERSION',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.SoftwareVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.SoftwareVersionString'>: 'prerelease',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ManufacturingDate'>: '20210614123456ZZ',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.PartNumber'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductURL'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ProductLabel'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.SerialNumber'>: 'TEST_SN',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.LocalConfigDisabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.Reachable'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.UniqueID'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Basic.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.DefaultOTAProviders'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdatePossible'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateState'>: <UpdateStateEnum.kUnknown: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateStateProgress'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.LocalizationConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.LocalizationConfiguration.Attributes.ActiveLocale'>: 'en-US',\n",
-       "│   │   │   <class 'chip.clusters.Objects.LocalizationConfiguration.Attributes.SupportedLocales'>: [\n",
-       "│   │   │   │   'Test',\n",
-       "│   │   │   │   'en-US',\n",
-       "│   │   │   │   'de-DE',\n",
-       "│   │   │   │   'fr-FR',\n",
-       "│   │   │   │   'en-GB',\n",
-       "│   │   │   │   'es-ES',\n",
-       "│   │   │   │   'zh-CN',\n",
-       "│   │   │   │   'it-IT',\n",
-       "│   │   │   │   'ja-JP'\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.LocalizationConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.TimeFormatLocalization'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.HourFormat'>: <HourFormat.k12hr: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.ActiveCalendarType'>: <CalendarType.kBuddhist: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.SupportedCalendarTypes'>: [\n",
-       "│   │   │   │   <CalendarType.kBuddhist: 0>,\n",
-       "│   │   │   │   <CalendarType.kChinese: 1>,\n",
-       "│   │   │   │   <CalendarType.kCoptic: 2>,\n",
-       "│   │   │   │   <CalendarType.kEthiopian: 3>,\n",
-       "│   │   │   │   <CalendarType.kGregorian: 4>,\n",
-       "│   │   │   │   <CalendarType.kHebrew: 5>,\n",
-       "│   │   │   │   <CalendarType.kIndian: 6>,\n",
-       "│   │   │   │   <CalendarType.kIslamic: 7>,\n",
-       "│   │   │   │   <CalendarType.kJapanese: 8>,\n",
-       "│   │   │   │   <CalendarType.kKorean: 9>,\n",
-       "│   │   │   │   <CalendarType.kPersian: 10>,\n",
-       "│   │   │   │   <CalendarType.kTaiwanese: 11>\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TimeFormatLocalization.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PowerSourceConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSourceConfiguration.Attributes.Sources'>: [\n",
-       "│   │   │   │   1\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSourceConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.GeneralCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.Breadcrumb'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.BasicCommissioningInfoList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.RegulatoryConfig'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.LocationCapability'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.FeatureMap'>: 6,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.NetworkCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.UnsupportedRead: 143>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'>: <NetworkCommissioningStatusEnum.kSuccess: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.GeneralDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.NetworkInterfaces'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.RebootCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.UpTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.TotalOperationalHours'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.BootReasons'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveHardwareFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveRadioFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveNetworkFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GeneralDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.SoftwareDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ThreadMetrics'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapFree'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapUsed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapHighWatermark'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.FeatureMap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Channel'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RoutingRole'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NetworkName'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PanId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ExtendedPanId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.MeshLocalPrefix'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OverrunCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NeighborTableList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouteTableList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Weighting'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DataVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.StableDataVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRouterId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DetachedRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChildRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouterRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRoleCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.AttachAttemptCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionIdChangeCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.BetterPartitionAttachAttemptCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ParentChangeCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxTotalCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxUnicastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBroadcastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckRequestedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxNoAckRequestedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataPollCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconRequestCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxOtherCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxRetryCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDirectMaxRetryExpiryCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxIndirectMaxRetryExpiryCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrCcaCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrAbortCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrBusyChannelCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxTotalCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxUnicastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBroadcastCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataPollCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconRequestCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxOtherCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxAddressFilteredCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDestAddrFilteredCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDuplicatedCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrNoFrameCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrUnknownNeighborCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrInvalidSrcAddrCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrSecCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrFcsCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrOtherCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveTimestamp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PendingTimestamp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Delay'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.SecurityPolicy'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChannelMask'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OperationalDatasetComponents'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveNetworkFaultsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.FeatureMap'>: 15,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Bssid'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.SecurityType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.WiFiVersion'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ChannelNumber'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Rssi'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconLostCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastTxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastTxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.CurrentMaxRate'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.OverrunCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.FeatureMap'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PHYRate'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FullDuplex'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketRxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketTxCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TxErrCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CollisionCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.OverrunCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CarrierDetect'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TimeSinceReset'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FeatureMap'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AdministratorCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.WindowStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminFabricIndex'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminVendorId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AdministratorCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OperationalCredentials'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.NOCs'>: [\n",
-       "│   │   │   │   NOCStruct(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   noc=b'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x01$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x11\\x02$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xbc8\\x9d2\\xe7\\xe6\\x0f\\x12\\xcb\\x0fYb\\x8f\\xa6zc\\xa1\\xb2y\\x18\\xc3~\\x98\\xee\\xa9r\\xd3\\x18\\xe9@\\xf9\\x17B\\xa6\\xed\\x11\\x92\\xc2\\xe2k&\\x88m\\r^`\\x10\\xc3|\\xdd\\xb4)\\r\\x11\\xcc\\xd1p\\x9bwN)H)\\x187\\n5\\x01(\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x14B8k q\\xd8Lv\\x85^A;\\xceyC\\xa4\\xe9|\\xc1\\x120\\x05\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83]\\xa5-\\x97jG\\xdb\\x87\\x180\\x0b@4\\n\\xcd\\x15+\\xa9n}s\\xbb$u\\x12\\xec\"B\\x00\\x98\\x1fD\\xd4\\xb7\\xcc\\xbb\\xd3\\x17*\\xfa\\xd3\\x8atX]\\xca\\xec\\xaf:[$o|\\xc6\"z\\x15\\xb4d\\x144\\x11i\\xa4\\xaa7\\xce\\x9f\\xc5l\\x11\\xe7I\\x87L\\x88\\x18',\n",
-       "│   │   │   │   │   icac=b'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x13\\x01$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xf2\\xc0\\x10\\xe9=c\\x9e\\xed.\\xaaQj\\x0ca\\xd8\\x1f\\xfb:\\xf2\\x92$\\x04hc><\\xb2\\xc9R>\\xfe\\x1f\\x121\\xf2\\xaf5 \\xc4\\r\\xd3=\\xd0\\xae\\xbe\\xb4\\x85\\x8dI\\xfa`Z\\xaeI\\xfe*>\\xb1\\x88:,Rs\\xb57\\n5\\x01)\\x01\\x18$\\x02`0\\x04\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83]\\xa5-\\x97jG\\xdb\\x870\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@\\x91\\x1cY!4-\\\\\\xc1hC[q\\xa8\\x85\\x00\\xa7\\xdd\\xd8\\x1fAM\\xca-6\\xf5 \\x89\\x85k\\x05;\\x15\\xd0\\x83A>D\\xe9\\x9e\\xc1]\\xbb\\xcd\\x8c\\x83\\xbbm\\xab\\xf9\\x8a\\xdb\\x9df\\x11\\x05\\x98hC\\x8f\\xcd\\xad\\n7\\x9e\\x18'\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'>: [\n",
-       "│   │   │   │   FabricDescriptor(\n",
-       "│   │   │   │   │   fabricIndex=1,\n",
-       "│   │   │   │   │   rootPublicKey=b'\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa',\n",
-       "│   │   │   │   │   vendorId=60064,\n",
-       "│   │   │   │   │   fabricId=1,\n",
-       "│   │   │   │   │   nodeId=2,\n",
-       "│   │   │   │   │   label=''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.SupportedFabrics'>: 16,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.CommissionedFabrics'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.TrustedRootCertificates'>: [\n",
-       "│   │   │   │   b'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x14\\x00$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa7\\n5\\x01)\\x01\\x18$\\x02`0\\x04\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd50\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@J\\xa5\\xdb\\xec9\\xd3i\\xbf\\xa84\\xbc(r\\xfb\\xf9\\x95X\\x00\\xf1\\x1f\\xd5#\\x14x\\xbeT}\\xda\\xe1\\x15\\x94\\x92\\xdb\\xc8\\xccI0\\xc5\\xe2\\x1ev0h\\x10N\\xdd\\x8b\\xd7\\x94\\x90]\\xd4\\x8f\\x08>\\x8b\\xc8j\\x05\\xbeb\\xed\\xd5\\xe0\\x18'\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.CurrentFabricIndex'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OperationalCredentials.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.GroupKeyManagement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupKeyMap'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupTable'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupsPerFabric'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupKeysPerFabric'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.GroupKeyManagement.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.FixedLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.UserLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   }\n",
-       "},\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.Identify'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.IdentifyType'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Identify.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Scenes'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.SceneCount'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.CurrentScene'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.CurrentGroup'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.SceneValid'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.NameSupport'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Scenes.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchActions'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.LevelControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.CurrentLevel'>: 254,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.RemainingTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MinLevel'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MaxLevel'>: 254,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.CurrentFrequency'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MinFrequency'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.MaxFrequency'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.Options'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OnOffTransitionTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OnLevel'>: 254,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OnTransitionTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.OffTransitionTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.DefaultMoveRate'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.StartUpCurrentLevel'>: Null,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.FeatureMap'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.LevelControl.Attributes.ClusterRevision'>: 5\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BinaryInputBasic'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.OutOfService'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.PresentValue'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.StatusFlags'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BinaryInputBasic.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   3,\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   5,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   7,\n",
-       "│   │   │   │   8,\n",
-       "│   │   │   │   15,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   30,\n",
-       "│   │   │   │   37,\n",
-       "│   │   │   │   47,\n",
-       "│   │   │   │   49,\n",
-       "│   │   │   │   57,\n",
-       "│   │   │   │   59,\n",
-       "│   │   │   │   64,\n",
-       "│   │   │   │   65,\n",
-       "│   │   │   │   69,\n",
-       "│   │   │   │   80,\n",
-       "│   │   │   │   257,\n",
-       "│   │   │   │   258,\n",
-       "│   │   │   │   259,\n",
-       "│   │   │   │   512,\n",
-       "│   │   │   │   513,\n",
-       "│   │   │   │   516,\n",
-       "│   │   │   │   768,\n",
-       "│   │   │   │   1024,\n",
-       "│   │   │   │   1026,\n",
-       "│   │   │   │   1027,\n",
-       "│   │   │   │   1028,\n",
-       "│   │   │   │   1029,\n",
-       "│   │   │   │   1030,\n",
-       "│   │   │   │   1280,\n",
-       "│   │   │   │   1283,\n",
-       "│   │   │   │   1284,\n",
-       "│   │   │   │   1285,\n",
-       "│   │   │   │   1286,\n",
-       "│   │   │   │   1287,\n",
-       "│   │   │   │   1288,\n",
-       "│   │   │   │   1289,\n",
-       "│   │   │   │   1290,\n",
-       "│   │   │   │   1291,\n",
-       "│   │   │   │   1292,\n",
-       "│   │   │   │   1293,\n",
-       "│   │   │   │   1294,\n",
-       "│   │   │   │   1295,\n",
-       "│   │   │   │   2820\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Binding'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Binding.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Actions'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.ActionList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.EndpointList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.SetupUrl'>: 'https://example.com',\n",
-       "│   │   │   <class 'chip.clusters.Objects.Actions.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PowerSource'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.Status'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.Order'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.Description'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryVoltage'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryPercentRemaining'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryTimeRemaining'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeLevel'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.ActiveBatteryFaults'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeState'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PowerSource.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.NetworkCommissioning'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.UnsupportedRead: 143>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'>: <NetworkCommissioningStatusEnum.kSuccess: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BridgedDeviceBasicInformation'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BridgedDeviceBasicInformation.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Switch'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.NumberOfPositions'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.CurrentPosition'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.MultiPressMax'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Switch.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.FixedLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.UserLabel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.LabelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BooleanState'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BooleanState.Attributes.StateValue'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BooleanState.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ModeSelect'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.CurrentMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.SupportedModes'>: [\n",
-       "│   │   │   │   ModeOptionStruct(\n",
-       "│   │   │   │   │   label='Black',\n",
-       "│   │   │   │   │   mode=0,\n",
-       "│   │   │   │   │   semanticTag=0\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   ModeOptionStruct(\n",
-       "│   │   │   │   │   label='Cappuccino',\n",
-       "│   │   │   │   │   mode=4,\n",
-       "│   │   │   │   │   semanticTag=0\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   ModeOptionStruct(\n",
-       "│   │   │   │   │   label='Espresso',\n",
-       "│   │   │   │   │   mode=7,\n",
-       "│   │   │   │   │   semanticTag=0\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.OnMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.StartUpMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.Description'>: 'Coffee',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ModeSelect.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.DoorLock'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.LockState'>: <DlLockState.kUnlocked: 2>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.LockType'>: <DlLockType.kDeadBolt: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.ActuatorEnabled'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DoorState'>: <DlDoorState.kDoorOpen: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DoorOpenEvents'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DoorClosedEvents'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.OpenPeriod'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfTotalUsersSupported'>: 10,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfPINUsersSupported'>: 10,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfWeekDaySchedulesSupportedPerUser'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfYearDaySchedulesSupportedPerUser'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.NumberOfHolidaySchedulesSupported'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.MaxPINCodeLength'>: 6,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.MinPINCodeLength'>: 6,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.CredentialRulesSupport'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.Language'>: 'en',\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.AutoRelockTime'>: 96,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.SoundVolume'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.OperatingMode'>: <DlOperatingMode.kNormal: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.SupportedOperatingModes'>: 65526,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.DefaultConfigurationRegister'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.EnableOneTouchLocking'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.EnableInsideStatusLED'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.EnablePrivacyModeButton'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.WrongCodeEntryLimit'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.UserCodeTemporaryDisableTime'>: 10,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.RequirePINforRemoteOperation'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.DoorLock.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.WindowCovering'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.Type'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLift'>: 32767,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTilt'>: 32767,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.ConfigStatus'>: 3,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercentage'>: 50,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercentage'>: 50,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.OperationalStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionLiftPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionTiltPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.EndProductType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercent100ths'>: 500,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitLift'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitLift'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitTilt'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitTilt'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.Mode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.SafetyStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.WindowCovering.Attributes.ClusterRevision'>: 5\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.BarrierControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierMovingState'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierSafetyStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierCapabilities'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.BarrierPosition'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.BarrierControl.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxSpeed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxFlow'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinCompPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxCompPressure'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstSpeed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstSpeed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstFlow'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstFlow'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstTemp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstTemp'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.PumpStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveOperationMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveControlMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Capacity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Speed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeRunningHours'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Power'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeEnergyConsumed'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.OperationMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ControlMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.AlarmMask'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Thermostat'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.LocalTemperature'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMinHeatSetpointLimit'>: 700,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMaxHeatSetpointLimit'>: 3000,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMinCoolSetpointLimit'>: 1600,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.AbsMaxCoolSetpointLimit'>: 3200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.OccupiedCoolingSetpoint'>: 2600,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.OccupiedHeatingSetpoint'>: 2000,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MinHeatSetpointLimit'>: 700,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MaxHeatSetpointLimit'>: 3000,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MinCoolSetpointLimit'>: 1600,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MaxCoolSetpointLimit'>: 3200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.MinSetpointDeadBand'>: 25,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.ControlSequenceOfOperation'>: 4,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.SystemMode'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.StartOfWeek'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.NumberOfWeeklyTransitions'>: 7,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.NumberOfDailyTransitions'>: 4,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.FeatureMap'>: 11,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Thermostat.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.TemperatureDisplayMode'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.KeypadLockout'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ScheduleProgrammingVisibility'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ColorControl'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentHue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentSaturation'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.RemainingTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentX'>: 24939,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CurrentY'>: 24701,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.DriftCompensation'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CompensationText'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorTemperature'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorMode'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorControlOptions'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.NumberOfPrimaries'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary1X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary1Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary1Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary2X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary2Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary2Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary3X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary3Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary3Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary4X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary4Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary4Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary5X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary5Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary5Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary6X'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary6Y'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.Primary6Intensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.WhitePointX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.WhitePointY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointRX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointRY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointRIntensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointGX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointGY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointGIntensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointBX'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointBY'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorPointBIntensity'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.EnhancedCurrentHue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.EnhancedColorMode'>: 2,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopActive'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopDirection'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopTime'>: 25,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStartEnhancedHue'>: 8960,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStoredEnhancedHue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorCapabilities'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMin'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMax'>: 65279,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.CoupleColorTempToLevelMinMireds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.StartUpColorTemperatureMireds'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ColorControl.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.IlluminanceMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MinMeasuredValue'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MaxMeasuredValue'>: 65534,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.LightSensorType'>: Null,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IlluminanceMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.TemperatureMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.MeasuredValue'>: -32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.MinMeasuredValue'>: -32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.MaxMeasuredValue'>: -32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TemperatureMeasurement.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.PressureMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.PressureMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.FlowMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.FlowMeasurement.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.Tolerance'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.IasZone'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneState'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneType'>: 541,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneStatus'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.IasCieAddress'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ZoneId'>: 255,\n",
-       "│   │   │   <class 'chip.clusters.Objects.IasZone.Attributes.ClusterRevision'>: 2\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.WakeOnLan'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.WakeOnLan.Attributes.WakeOnLanMacAddress'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.WakeOnLan.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Channel'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Channel.Attributes.ChannelList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Channel.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.TargetNavigator'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TargetNavigator.Attributes.TargetNavigatorList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TargetNavigator.Attributes.CurrentNavigatorTarget'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TargetNavigator.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.MediaPlayback'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackState'>: <PlaybackStateEnum.kPlaying: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.StartTime'>: 255,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.Duration'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackSpeed'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeEnd'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeStart'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaPlayback.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.MediaInput'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaInput.Attributes.MediaInputList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaInput.Attributes.CurrentMediaInput'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.MediaInput.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.LowPower'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.LowPower.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.KeypadInput'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.KeypadInput.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ContentLauncher'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ContentLauncher.Attributes.AcceptHeaderList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ContentLauncher.Attributes.SupportedStreamingProtocols'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ContentLauncher.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AudioOutput'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AudioOutput.Attributes.AudioOutputList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.AudioOutput.Attributes.CurrentAudioOutput'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.AudioOutput.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ApplicationLauncher'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationLauncher.Attributes.ApplicationLauncherList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationLauncher.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ApplicationBasic'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.VendorName'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.VendorId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationName'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ProductId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationStatus'>: <ApplicationStatusEnum.kStopped: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationVersion'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.AllowedVendorList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.ApplicationBasic.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.AccountLogin'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.AccountLogin.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Boolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap32'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Bitmap64'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int8u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int24u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int32u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int40u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int48u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int56u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int64u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int8s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int24s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int32s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int40s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int48s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int56s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int64s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Enum8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Enum16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.FloatSingle'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.FloatDouble'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.OctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListInt8u'>: [\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0,\n",
-       "│   │   │   │   0\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListOctetString'>: [\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b'',\n",
-       "│   │   │   │   b''\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListStructOctetString'>: [\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   ),\n",
-       "│   │   │   │   TestListStructOctet(\n",
-       "│   │   │   │   │   fabricIndex=0,\n",
-       "│   │   │   │   │   operationalCert=b''\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.LongOctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.CharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.LongCharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.EpochUs'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.EpochS'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.VendorId'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListNullablesAndOptionalsStruct'>: [\n",
-       "│   │   │   │   NullablesAndOptionalsStruct(\n",
-       "│   │   │   │   │   nullableInt=Null,\n",
-       "│   │   │   │   │   optionalInt=None,\n",
-       "│   │   │   │   │   nullableOptionalInt=None,\n",
-       "│   │   │   │   │   nullableString=Null,\n",
-       "│   │   │   │   │   optionalString=None,\n",
-       "│   │   │   │   │   nullableOptionalString=None,\n",
-       "│   │   │   │   │   nullableStruct=Null,\n",
-       "│   │   │   │   │   optionalStruct=None,\n",
-       "│   │   │   │   │   nullableOptionalStruct=None,\n",
-       "│   │   │   │   │   nullableList=Null,\n",
-       "│   │   │   │   │   optionalList=None,\n",
-       "│   │   │   │   │   nullableOptionalList=None\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.EnumAttr'>: <SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.StructAttr'>: SimpleStruct(\n",
-       "│   │   │   │   a=0,\n",
-       "│   │   │   │   b=False,\n",
-       "│   │   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   │   d=b'',\n",
-       "│   │   │   │   e='',\n",
-       "│   │   │   │   f=0,\n",
-       "│   │   │   │   g=0.0,\n",
-       "│   │   │   │   h=0.0\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt8u'>: 70,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt8s'>: -20,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt16u'>: 200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt16s'>: -100,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListLongOctetString'>: [\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n",
-       "│   │   │   │   b'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ListFabricScoped'>: [\n",
-       "│   │   │   │   TestFabricScoped(\n",
-       "│   │   │   │   │   fabricIndex=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.TimedWriteBoolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.GeneralErrorBoolean'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.InvalidDataType: 141>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ClusterErrorBoolean'>: ValueDecodeFailure(\n",
-       "│   │   │   │   TLVValue=None,\n",
-       "│   │   │   │   Reason=InteractionModelError(<Status.Failure: 1>)\n",
-       "│   │   │   ),\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBoolean'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap32'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap64'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt8u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt16u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt24u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt32u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt40u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt48u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt56u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt64u'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt8s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt16s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt24s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt32s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt40s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt48s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt56s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableInt64s'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableEnum8'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableEnum16'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableFloatSingle'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableFloatDouble'>: 0.0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableOctetString'>: b'',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableCharString'>: '',\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableEnumAttr'>: <SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableStruct'>: Null,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt8u'>: 70,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt8s'>: -20,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt16u'>: 200,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt16s'>: -100,\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.ElectricalMeasurement'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.MeasurementType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.TotalActivePower'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltage'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMin'>: 32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMax'>: 32768,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrent'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMin'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMax'>: 65535,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePower'>: -1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMin'>: -1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMax'>: -1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.ElectricalMeasurement.Attributes.ClusterRevision'>: 3\n",
-       "│   │   }\n",
-       "},\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.NameSupport'>: 128,\n",
-       "│   │   │   <class 'chip.clusters.Objects.Groups.Attributes.ClusterRevision'>: 3\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>: False,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>: True,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.FeatureMap'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'>: 4\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.DeviceList'>: [\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ServerList'>: [\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   1030\n",
-       "│   │   │   ],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClientList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.PartsList'>: [],\n",
-       "│   │   │   <class 'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'>: 1\n",
-       "│   │   },\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'>: 0,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'>: 1,\n",
-       "│   │   │   <class 'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'>: 2\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m0\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m22\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m29\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m30\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m31\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m40\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m42\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m43\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m44\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m46\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m48\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m49\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m50\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m51\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m52\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m53\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m54\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m55\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m60\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m62\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m63\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m64\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m65\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1029\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m41\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.Acl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mAccessControlEntry\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mprivilege\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mPrivilege.kAdminister:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mauthMode\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mAuthMode.kCase:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33msubjects\u001b[0m=\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ │ \u001b[0m\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mtargets\u001b[0m=\u001b[35mNull\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.Extension'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccessControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.InteractionModelVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.VendorName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_VENDOR'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.VendorID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m9050\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_PRODUCT'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65279\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.NodeLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.Location'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'XX'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.HardwareVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.HardwareVersionString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_VERSION'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.SoftwareVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.SoftwareVersionString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'prerelease'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ManufacturingDate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'20210614123456ZZ'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.PartNumber'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductURL'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ProductLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.SerialNumber'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'TEST_SN'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.LocalConfigDisabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.Reachable'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.UniqueID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Basic.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.DefaultOTAProviders'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdatePossible'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mUpdateStateEnum.kUnknown:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.UpdateStateProgress'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OtaSoftwareUpdateRequestor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration.Attributes.ActiveLocale'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'en-US'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration.Attributes.SupportedLocales'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'Test'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'en-US'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'de-DE'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'fr-FR'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'en-GB'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'es-ES'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'zh-CN'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'it-IT'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32m'ja-JP'\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LocalizationConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.HourFormat'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mHourFormat.k12hr:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.ActiveCalendarType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kBuddhist:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.SupportedCalendarTypes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kBuddhist:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kChinese:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kCoptic:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kEthiopian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m3\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kGregorian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m4\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kHebrew:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m5\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kIndian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m6\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kIslamic:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m7\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kJapanese:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m8\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kKorean:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m9\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kPersian:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m10\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mCalendarType.kTaiwanese:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m11\u001b[0m\u001b[1m>\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TimeFormatLocalization.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSourceConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSourceConfiguration.Attributes.Sources'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSourceConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.Breadcrumb'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.BasicCommissioningInfoList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.RegulatoryConfig'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.LocationCapability'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m6\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.UnsupportedRead:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m143\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mNetworkCommissioningStatusEnum.kSuccess:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.NetworkInterfaces'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.RebootCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.UpTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.TotalOperationalHours'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.BootReasons'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveHardwareFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveRadioFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ActiveNetworkFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GeneralDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ThreadMetrics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapFree'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapUsed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.CurrentHeapHighWatermark'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.SoftwareDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Channel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RoutingRole'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NetworkName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PanId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ExtendedPanId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.MeshLocalPrefix'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OverrunCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.NeighborTableList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouteTableList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Weighting'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DataVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.StableDataVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRouterId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.DetachedRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChildRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RouterRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.LeaderRoleCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.AttachAttemptCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PartitionIdChangeCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.BetterPartitionAttachAttemptCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ParentChangeCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxTotalCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxUnicastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBroadcastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckRequestedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxAckedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxNoAckRequestedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDataPollCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxBeaconRequestCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxOtherCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxRetryCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxDirectMaxRetryExpiryCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxIndirectMaxRetryExpiryCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrCcaCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrAbortCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.TxErrBusyChannelCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxTotalCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxUnicastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBroadcastCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDataPollCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxBeaconRequestCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxOtherCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxAddressFilteredCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDestAddrFilteredCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxDuplicatedCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrNoFrameCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrUnknownNeighborCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrInvalidSrcAddrCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrSecCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrFcsCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.RxErrOtherCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveTimestamp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.PendingTimestamp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.Delay'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.SecurityPolicy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ChannelMask'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.OperationalDatasetComponents'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ActiveNetworkFaultsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m15\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThreadNetworkDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Bssid'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.SecurityType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.WiFiVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ChannelNumber'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.Rssi'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconLostCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.BeaconRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketMulticastTxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.PacketUnicastTxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.CurrentMaxRate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.OverrunCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WiFiNetworkDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PHYRate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FullDuplex'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketRxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.PacketTxCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TxErrCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CollisionCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.OverrunCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.CarrierDetect'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.TimeSinceReset'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.EthernetNetworkDiagnostics.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.WindowStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminFabricIndex'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.AdminVendorId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AdministratorCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.NOCs'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mNOCStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnoc\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x01$\\x02\\x017\\x03$\\x13\\x01$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x11\\x02$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xbc8\\x9d2\\xe7\\xe6\\x0f\\x12\\xcb\\x0fYb\\x8f\\xa6zc\\xa1\\xb2y\\x18\\xc3~\\x98\\xee\\xa9r\\xd3\\x18\\xe9@\\xf9\\x17B\\xa6\\xed\\x11\\x92\\xc2\\xe2k&\\x88m\\r^`\\x10\\xc3|\\xdd\\xb4\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\r\\x11\\xcc\\xd1p\\x9bwN\u001b[0m\u001b[32m)\u001b[0m\u001b[32mH\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x187\\n5\\x01\u001b[0m\u001b[32m(\u001b[0m\u001b[32m\\x01\\x18$\\x02\\x016\\x03\\x04\\x02\\x04\\x01\\x180\\x04\\x14B8k q\\xd8Lv\\x85^A;\\xceyC\\xa4\\xe9|\\xc1\\x120\\x05\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xa5-\\x97jG\\xdb\\x87\\x180\\x0b@4\\n\\xcd\\x15+\\xa9n\u001b[0m\u001b[32m}\u001b[0m\u001b[32ms\\xbb$u\\x12\\xec\"B\\x00\\x98\\x1fD\\xd4\\xb7\\xcc\\xbb\\xd3\\x17*\\xfa\\xd3\\x8atX\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xca\\xec\\xaf:\u001b[0m\u001b[32m[\u001b[0m\u001b[32m$o|\\xc6\"z\\x15\\xb4d\\x144\\x11i\\xa4\\xaa7\\xce\\x9f\\xc5l\\x11\\xe7I\\x87L\\x88\\x18'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33micac\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x13\\x01$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\xf2\\xc0\\x10\\\u001b[0m\u001b[32mxe9\u001b[0m\u001b[32m=\u001b[0m\u001b[32mc\u001b[0m\u001b[32m\\x9e\\xed.\\xaaQj\\x0ca\\xd8\\x1f\\xfb:\\xf2\\x92$\\x04hc>\u001b[0m\u001b[32m<\u001b[0m\u001b[32m\\xb2\\xc9R\u001b[0m\u001b[32m>\u001b[0m\u001b[32m\\xfe\\x1f\\x121\\xf2\\xaf5 \\xc4\\r\\\u001b[0m\u001b[32mxd3\u001b[0m\u001b[32m=\\xd0\\xae\\xbe\\xb4\\x85\\x8dI\\xfa`Z\\xaeI\\xfe*>\\xb1\\x88:,Rs\\xb57\\n5\\x01\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x01\\x18$\\x02`0\\x04\\x14\\x8d\\xe3\\xb8\\x08&j\\xd4\\xa5\\xd5\\x1c\\xb5\\x83\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xa5-\\x97jG\\xdb\\x870\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd\u001b[0m\u001b[32m<\u001b[0m\u001b[32m\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@\\x91\\x1cY!4-\\\\\\xc1hC\u001b[0m\u001b[32m[\u001b[0m\u001b[32mq\\xa8\\x85\\x00\\xa7\\xdd\\xd8\\x1fAM\\xca-6\\xf5 \\x89\\x85k\\x05;\\x15\\xd0\\x83A\u001b[0m\u001b[32m>\u001b[0m\u001b[32mD\\xe9\\x9e\\xc1\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xbb\\xcd\\x8c\\x83\\xbbm\\xab\\xf9\\x8a\\xdb\\x9df\\x11\\x05\\x98hC\\x8f\\xcd\\xad\\n7\\x9e\\x18'\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.FabricsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mFabricDescriptor\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mrootPublicKey\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m'\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mvendorId\u001b[0m=\u001b[1;36m60064\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricId\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnodeId\u001b[0m=\u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m''\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.SupportedFabrics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m16\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.CommissionedFabrics'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.TrustedRootCertificates'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb'\\x150\\x01\\x01\\x00$\\x02\\x017\\x03$\\x14\\x00$\\x15\\x01\\x18&\\x04\\x80\"\\x81\\'&\\x05\\x80%M:7\\x06$\\x14\\x00$\\x15\\x01\\x18$\\x07\\x01$\\x08\\x010\\tA\\x04\\x1b$\\xfe8s\\x9d\\xcdJ\\xb8\\tN\\xfd\\x16\\xb2\\xbf\\xecn\\x00\\xfd\\x93\\xfa\\xc8`\\x89M\\x14\\xe8RB\\x9f\\xc0\\x9f\\x05\\\\dfX\\xd7\\xa8\\xc3\\x05\\x05#52/\\xfe\\xc3\\x1c\\xa1\\xa7\\xa8\\x0cF\\xa2S\\xa2\\xf5\\xfe\\xd8\\x9fQ\\x0b\\xfa7\\n5\\x01\u001b[0m\u001b[32m)\u001b[0m\u001b[32m\\x01\\x18$\\x02`0\\x04\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd\u001b[0m\u001b[32m<\u001b[0m\u001b[32m\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd50\\x05\\x14\\xd0\\xb8\\x11\\xcc\\x07\\x01\\xfd<\\xb1\\xc3\\x9a\\xc3\\xc4\\xb1\\xa8\\xa1\\x9al\\xa6\\xd5\\x180\\x0b@J\\xa5\\xdb\\xec9\\xd3i\\xbf\\xa84\\xbc\u001b[0m\u001b[32m(\u001b[0m\u001b[32mr\\xfb\\xf9\\x95X\\x00\\xf1\\x1f\\xd5#\\x14x\\xbeT\u001b[0m\u001b[32m}\u001b[0m\u001b[32m\\xda\\xe1\\x15\\x94\\x92\\xdb\\xc8\\xccI0\\xc5\\xe2\\x1ev0h\\x10N\\xdd\\x8b\\xd7\\x94\\x90\u001b[0m\u001b[32m]\u001b[0m\u001b[32m\\xd4\\x8f\\x08\u001b[0m\u001b[32m>\u001b[0m\u001b[32m\\x8b\\xc8j\\x05\\xbeb\\xed\\xd5\\xe0\\x18'\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.CurrentFabricIndex'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OperationalCredentials.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupKeyMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.GroupTable'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupsPerFabric'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.MaxGroupKeysPerFabric'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.GroupKeyManagement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.IdentifyType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Identify.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.SceneCount'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.CurrentScene'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.CurrentGroup'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.SceneValid'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Scenes.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.SwitchActions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOffSwitchConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.CurrentLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m254\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.RemainingTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MinLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MaxLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m254\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.CurrentFrequency'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MinFrequency'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.MaxFrequency'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.Options'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OnOffTransitionTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OnLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m254\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OnTransitionTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.OffTransitionTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.DefaultMoveRate'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.StartUpCurrentLevel'\u001b[0m\u001b[1m>\u001b[0m: Null,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LevelControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m5\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.OutOfService'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.PresentValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.StatusFlags'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BinaryInputBasic.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m5\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m6\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m7\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m8\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m15\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m29\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m30\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m37\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m47\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m49\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m57\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m59\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m64\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m65\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m69\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m80\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m257\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m258\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m259\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m512\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m513\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m516\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m768\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1024\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1026\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1027\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1028\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1029\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1030\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1280\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1283\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1284\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1285\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1286\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1287\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1288\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1289\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1290\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1291\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1292\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1293\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1294\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1295\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m2820\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Binding.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.ActionList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.EndpointList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.SetupUrl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'https://example.com'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Actions.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.Status'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.Order'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.Description'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryVoltage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryPercentRemaining'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryTimeRemaining'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeLevel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.ActiveBatteryFaults'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.BatteryChargeState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PowerSource.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.MaxNetworks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.Networks'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.UnsupportedRead:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m143\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ScanMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ConnectMaxTimeSeconds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.InterfaceEnabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkingStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mNetworkCommissioningStatusEnum.kSuccess:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastNetworkID'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.LastConnectErrorValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.NetworkCommissioning.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BridgedDeviceBasicInformation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BridgedDeviceBasicInformation.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.NumberOfPositions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.CurrentPosition'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.MultiPressMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Switch.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FixedLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.LabelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.UserLabel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BooleanState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BooleanState.Attributes.StateValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BooleanState.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.CurrentMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.SupportedModes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Black'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mmode\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33msemanticTag\u001b[0m=\u001b[1;36m0\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Cappuccino'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mmode\u001b[0m=\u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33msemanticTag\u001b[0m=\u001b[1;36m0\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mModeOptionStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mlabel\u001b[0m=\u001b[32m'Espresso'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mmode\u001b[0m=\u001b[1;36m7\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33msemanticTag\u001b[0m=\u001b[1;36m0\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.OnMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.StartUpMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.Description'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'Coffee'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ModeSelect.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.LockState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlLockState.kUnlocked:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m2\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.LockType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlLockType.kDeadBolt:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.ActuatorEnabled'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DoorState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlDoorState.kDoorOpen:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DoorOpenEvents'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DoorClosedEvents'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.OpenPeriod'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfTotalUsersSupported'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m10\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfPINUsersSupported'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m10\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfWeekDaySchedulesSupportedPerUser'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfYearDaySchedulesSupportedPerUser'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.NumberOfHolidaySchedulesSupported'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.MaxPINCodeLength'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m6\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.MinPINCodeLength'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m6\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.CredentialRulesSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.Language'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m'en'\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.AutoRelockTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m96\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.SoundVolume'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.OperatingMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mDlOperatingMode.kNormal:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.SupportedOperatingModes'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65526\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.DefaultConfigurationRegister'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.EnableOneTouchLocking'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.EnableInsideStatusLED'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.EnablePrivacyModeButton'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.WrongCodeEntryLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.UserCodeTemporaryDisableTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m10\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.RequirePINforRemoteOperation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.DoorLock.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.Type'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLift'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32767\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTilt'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32767\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.ConfigStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercentage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m50\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercentage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m50\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.OperationalStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionLiftPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.TargetPositionTiltPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.EndProductType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionLiftPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.CurrentPositionTiltPercent100ths'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m500\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitLift'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitLift'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledOpenLimitTilt'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.InstalledClosedLimitTilt'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.Mode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.SafetyStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WindowCovering.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m5\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierMovingState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierSafetyStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierCapabilities'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.BarrierPosition'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.BarrierControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxFlow'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinCompPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxCompPressure'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstFlow'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstFlow'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MinConstTemp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.MaxConstTemp'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.PumpStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveOperationMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.EffectiveControlMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Capacity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Speed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeRunningHours'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.Power'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.LifetimeEnergyConsumed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.OperationMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ControlMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.AlarmMask'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PumpConfigurationAndControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.LocalTemperature'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMinHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m700\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMaxHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3000\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMinCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1600\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.AbsMaxCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3200\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.OccupiedCoolingSetpoint'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2600\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.OccupiedHeatingSetpoint'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2000\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MinHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m700\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MaxHeatSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3000\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MinCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1600\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MaxCoolSetpointLimit'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3200\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.MinSetpointDeadBand'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m25\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.ControlSequenceOfOperation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.SystemMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.StartOfWeek'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.NumberOfWeeklyTransitions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m7\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.NumberOfDailyTransitions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m11\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Thermostat.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.TemperatureDisplayMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.KeypadLockout'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ScheduleProgrammingVisibility'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ThermostatUserInterfaceConfiguration.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentSaturation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.RemainingTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m24939\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CurrentY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m24701\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.DriftCompensation'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CompensationText'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorTemperature'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorControlOptions'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.NumberOfPrimaries'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary1X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary1Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary1Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary2X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary2Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary2Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary3X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary3Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary3Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary4X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary4Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary4Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary5X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary5Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary5Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary6X'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary6Y'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.Primary6Intensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.WhitePointX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.WhitePointY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointRX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointRY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointRIntensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointGX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointGY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointGIntensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointBX'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointBY'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorPointBIntensity'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.EnhancedCurrentHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.EnhancedColorMode'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopActive'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopDirection'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m25\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStartEnhancedHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m8960\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorLoopStoredEnhancedHue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorCapabilities'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ColorTempPhysicalMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65279\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.CoupleColorTempToLevelMinMireds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.StartUpColorTemperatureMireds'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ColorControl.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65534\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.LightSensorType'\u001b[0m\u001b[1m>\u001b[0m: Null,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IlluminanceMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-32768\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-32768\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-32768\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TemperatureMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.PressureMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.FlowMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MinMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.MaxMeasuredValue'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.Tolerance'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.RelativeHumidityMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m541\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.IasCieAddress'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ZoneId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m255\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.IasZone.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WakeOnLan'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WakeOnLan.Attributes.WakeOnLanMacAddress'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.WakeOnLan.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Channel'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Channel.Attributes.ChannelList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Channel.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator.Attributes.TargetNavigatorList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator.Attributes.CurrentNavigatorTarget'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TargetNavigator.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackState'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mPlaybackStateEnum.kPlaying:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.StartTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m255\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.Duration'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.PlaybackSpeed'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeEnd'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.SeekRangeStart'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaPlayback.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput.Attributes.MediaInputList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput.Attributes.CurrentMediaInput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.MediaInput.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LowPower'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.LowPower.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.KeypadInput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.KeypadInput.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher.Attributes.AcceptHeaderList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher.Attributes.SupportedStreamingProtocols'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ContentLauncher.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput.Attributes.AudioOutputList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput.Attributes.CurrentAudioOutput'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AudioOutput.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationLauncher'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationLauncher.Attributes.ApplicationLauncherList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationLauncher.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.VendorName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.VendorId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationName'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ProductId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationStatus'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mApplicationStatusEnum.kStopped:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ApplicationVersion'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.AllowedVendorList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ApplicationBasic.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccountLogin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.AccountLogin.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Boolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Bitmap8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Bitmap16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Bitmap32'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Bitmap64'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int24u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int32u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int40u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int48u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int56u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int64u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int24s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int32s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int40s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int48s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int56s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int64s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Enum8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Enum16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.FloatSingle'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.FloatDouble'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.OctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ListInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m0\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ListOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb''\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ListStructOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mTestListStructOctet\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moperationalCert\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.LongOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.CharString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.LongCharString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.EpochUs'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.EpochS'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.VendorId'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ListNullablesAndOptionalsStruct'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mNullablesAndOptionalsStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableInt\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moptionalInt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableOptionalInt\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableString\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moptionalString\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableOptionalString\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableStruct\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moptionalStruct\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableOptionalStruct\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableList\u001b[0m=\u001b[35mNull\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33moptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mnullableOptionalList\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.EnumAttr'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.StructAttr'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m70\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-20\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m200\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.RangeRestrictedInt16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-100\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ListLongOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[32mb'0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ListFabricScoped'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mTestFabricScoped\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mfabricIndex\u001b[0m=\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.TimedWriteBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.GeneralErrorBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.InvalidDataType:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m141\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ClusterErrorBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mValueDecodeFailure\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mTLVValue\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mReason\u001b[0m=\u001b[1;35mInteractionModelError\u001b[0m\u001b[1m(\u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mStatus.Failure:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableBoolean'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap32'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableBitmap64'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt24u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt32u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt40u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt48u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt56u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt64u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt24s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt32s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt40s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt48s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt56s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableInt64s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableEnum8'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableEnum16'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableFloatSingle'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableFloatDouble'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableOctetString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32mb''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableCharString'\u001b[0m\u001b[1m>\u001b[0m: \u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableEnumAttr'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableStruct'\u001b[0m\u001b[1m>\u001b[0m: Null,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt8u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m70\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt8s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-20\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m200\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.NullableRangeRestrictedInt16s'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-100\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.MeasurementType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.TotalActivePower'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltage'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32768\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsVoltageMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m32768\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrent'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.RmsCurrentMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m65535\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePower'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMin'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ActivePowerMax'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m-1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.ElectricalMeasurement.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.NameSupport'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m128\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.StartUpOnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.FeatureMap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.DeviceList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ServerList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m6\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m29\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1030\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClientList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.PartsList'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.Occupancy'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorType'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.OccupancySensorTypeBitmap'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing.Attributes.ClusterRevision'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [('*')])" - ] - }, - { - "cell_type": "markdown", - "id": "7209813d-81d8-4f4c-8d4a-73a69569c86d", - "metadata": {}, - "source": [ - "#### Alternative 'Cluster' View\n", - "\n", - "The above encapsulates each attribute as a 'cluster-object' key within the top-level cluster instance. Instead, an alternative view each attribute is represented as a field in the object can be retrieved by passing in `True` to the third argument:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "b46b9c2a-30c9-48e9-84ce-fe261cc10a5f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.Groups'>: Groups(\n",
-       "│   │   │   nameSupport=128,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=None,\n",
-       "│   │   │   clusterRevision=3\n",
-       "│   │   ),\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: OnOff(\n",
-       "│   │   │   onOff=False,\n",
-       "│   │   │   globalSceneControl=True,\n",
-       "│   │   │   onTime=0,\n",
-       "│   │   │   offWaitTime=0,\n",
-       "│   │   │   startUpOnOff=0,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=0,\n",
-       "│   │   │   clusterRevision=4\n",
-       "│   │   ),\n",
-       "│   │   <class 'chip.clusters.Objects.Descriptor'>: Descriptor(\n",
-       "│   │   │   deviceList=[\n",
-       "│   │   │   │   DeviceType(\n",
-       "│   │   │   │   │   type=256,\n",
-       "│   │   │   │   │   revision=1\n",
-       "│   │   │   │   )\n",
-       "│   │   │   ],\n",
-       "│   │   │   serverList=[\n",
-       "│   │   │   │   4,\n",
-       "│   │   │   │   6,\n",
-       "│   │   │   │   29,\n",
-       "│   │   │   │   1030\n",
-       "│   │   │   ],\n",
-       "│   │   │   clientList=[],\n",
-       "│   │   │   partsList=[],\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=None,\n",
-       "│   │   │   clusterRevision=1\n",
-       "│   │   ),\n",
-       "│   │   <class 'chip.clusters.Objects.OccupancySensing'>: OccupancySensing(\n",
-       "│   │   │   occupancy=0,\n",
-       "│   │   │   occupancySensorType=0,\n",
-       "│   │   │   occupancySensorTypeBitmap=1,\n",
-       "│   │   │   pirOccupiedToUnoccupiedDelay=None,\n",
-       "│   │   │   pirUnoccupiedToOccupiedDelay=None,\n",
-       "│   │   │   pirUnoccupiedToOccupiedThreshold=None,\n",
-       "│   │   │   ultrasonicOccupiedToUnoccupiedDelay=None,\n",
-       "│   │   │   ultrasonicUnoccupiedToOccupiedDelay=None,\n",
-       "│   │   │   ultrasonicUnoccupiedToOccupiedThreshold=None,\n",
-       "│   │   │   physicalContactOccupiedToUnoccupiedDelay=None,\n",
-       "│   │   │   physicalContactUnoccupiedToOccupiedDelay=None,\n",
-       "│   │   │   physicalContactUnoccupiedToOccupiedThreshold=None,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=None,\n",
-       "│   │   │   clusterRevision=2\n",
-       "│   │   )\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Groups'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mGroups\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mnameSupport\u001b[0m=\u001b[1;36m128\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m3\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mOnOff\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33monOff\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mglobalSceneControl\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33monTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33moffWaitTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mstartUpOnOff\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.Descriptor'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mDescriptor\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mdeviceList\u001b[0m=\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;35mDeviceType\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mtype\u001b[0m=\u001b[1;36m256\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ │ \u001b[0m\u001b[33mrevision\u001b[0m=\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mserverList\u001b[0m=\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m4\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m6\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m29\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[1;36m1030\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mclientList\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpartsList\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m1\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OccupancySensing'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mOccupancySensing\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33moccupancy\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33moccupancySensorType\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33moccupancySensorTypeBitmap\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpirOccupiedToUnoccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpirUnoccupiedToOccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mpirUnoccupiedToOccupiedThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33multrasonicOccupiedToUnoccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33multrasonicUnoccupiedToOccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33multrasonicUnoccupiedToOccupiedThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mphysicalContactOccupiedToUnoccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mphysicalContactUnoccupiedToOccupiedDelay\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mphysicalContactUnoccupiedToOccupiedThreshold\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [2], True)" - ] - }, - { - "cell_type": "markdown", - "id": "1e852897-ce10-4885-bd84-b1aa060b9b6c", - "metadata": {}, - "source": [ - "#### Read Events:\n", - "\n", - "A `ReadEvents` API exists that behaves similarly to the `ReadAttributes` API. It permits the same degrees of wildcard expression as its counterpart and follows the same format for expressing all wildcard permutations." - ] - }, - { - "cell_type": "markdown", - "id": "11f23767-c8a8-4ecd-8d38-023b3872eceb", - "metadata": {}, - "source": [ - "#### Read all events:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "5ef28449-1262-4b06-9984-4a2f9c409450", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "[\n",
-       "EventReadResult(\n",
-       "│   │   Header=EventHeader(\n",
-       "│   │   │   EndpointId=1,\n",
-       "│   │   │   Event=None,\n",
-       "│   │   │   EventNumber=0,\n",
-       "│   │   │   Priority=<EventPriority.DEBUG: 1>,\n",
-       "│   │   │   Timestamp=<EventTimestampType.SYSTEM: 0>,\n",
-       "│   │   │   TimestampType=None\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>,\n",
-       "│   │   Data=TestEvent(\n",
-       "│   │   │   arg1=0,\n",
-       "│   │   │   arg2=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   arg3=False,\n",
-       "│   │   │   arg4=SimpleStruct(\n",
-       "│   │   │   │   a=0,\n",
-       "│   │   │   │   b=False,\n",
-       "│   │   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   │   d=b'',\n",
-       "│   │   │   │   e='',\n",
-       "│   │   │   │   f=0,\n",
-       "│   │   │   │   g=0.0,\n",
-       "│   │   │   │   h=0.0\n",
-       "│   │   │   ),\n",
-       "│   │   │   arg5=[],\n",
-       "│   │   │   arg6=[]\n",
-       "│   │   )\n",
-       ")\n",
-       "]\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mHeader\u001b[0m=\u001b[1;35mEventHeader\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mEvent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.DEBUG:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mTimestamp\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventTimestampType.SYSTEM:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mTimestampType\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mData\u001b[0m=\u001b[1;35mTestEvent\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg3\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg4\u001b[0m=\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg5\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg6\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Force an event to get emitted.\n", - "await devCtrl.SendCommand(2, 1, Clusters.TestCluster.Commands.TestEmitTestEventRequest())\n", - "\n", - "await devCtrl.ReadEvent(2, [('*')])" - ] - }, - { - "cell_type": "markdown", - "id": "b93ee082-2a7f-47db-8c92-e7accc216086", - "metadata": {}, - "source": [ - "### Subscription Interaction\n", - "\n", - "To subscribe to a Node, the same `ReadAttributes` API is used to trigger a subscription, with a valid `reportInterval` tuple passed in being used as a way to indicate the request to create a subscription." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "921b58f7-cdfb-436f-813a-412cbf7a018d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
<Subscription (Id=6469889299346410316)>\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m<\u001b[0m\u001b[1;95mSubscription\u001b[0m\u001b[39m \u001b[0m\u001b[1;39m(\u001b[0m\u001b[33mId\u001b[0m\u001b[39m=\u001b[0m\u001b[1;36m6469889299346410316\u001b[0m\u001b[1;39m)\u001b[0m\u001b[1m>\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "reportingTimingParams = (0, 2) # MinInterval = 0s, MaxInterval = 2s\n", - "subscription = await devCtrl.ReadAttribute(2, [(2, Clusters.OnOff)], True, reportingTimingParams)\n", - "subscription" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "ebd8f6aa-cf7b-4396-a83a-ad2fdacad1ae", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "2: {\n",
-       "│   │   <class 'chip.clusters.Objects.OnOff'>: OnOff(\n",
-       "│   │   │   onOff=False,\n",
-       "│   │   │   globalSceneControl=True,\n",
-       "│   │   │   onTime=0,\n",
-       "│   │   │   offWaitTime=0,\n",
-       "│   │   │   startUpOnOff=0,\n",
-       "│   │   │   attributeList=None,\n",
-       "│   │   │   featureMap=0,\n",
-       "│   │   │   clusterRevision=4\n",
-       "│   │   )\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m2\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;35mOnOff\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33monOff\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mglobalSceneControl\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33monTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33moffWaitTime\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mstartUpOnOff\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mattributeList\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mfeatureMap\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mclusterRevision\u001b[0m=\u001b[1;36m4\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "subscription.GetAttributes()" - ] - }, - { - "cell_type": "markdown", - "id": "866329a7-7757-4a5d-b7b0-4d70a86b65b0", - "metadata": {}, - "source": [ - "#### Trigger Report\n", - "\n", - "To trigger a report, let's alter the state of the on/off switch on EP1. That should trigger the generation of a set of attribute reports.\n", - "\n", - "The `SubscriptionTransaction` object returned by `ReadAttribute` permits installing a callback that is invoked on any attribute report. A default callback is installed above that just dumps out the attribute data." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "b0d34116-6c9b-4aee-a8a0-f92091654b4c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>,\n",
-       "'Value': True\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[3;92mTrue\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'>,\n",
-       "'Value': True\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.GlobalSceneControl'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[3;92mTrue\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'>,\n",
-       "'Value': 0\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OffWaitTime'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.SendCommand(2, 2, Clusters.OnOff.Commands.On())\n", - "time.sleep(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "eb712364-4311-4bcb-91a4-2e9f26b825a1", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OnOff'>,\n",
-       "'Value': False\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnOff'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[3;91mFalse\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Attribute Changed:\n" - ] - }, - { - "data": { - "text/html": [ - "
{\n",
-       "'Endpoint': 2,\n",
-       "'Attribute': <class 'chip.clusters.Objects.OnOff.Attributes.OnTime'>,\n",
-       "'Value': 0\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Endpoint'\u001b[0m: \u001b[1;36m2\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Attribute'\u001b[0m: \u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.OnOff.Attributes.OnTime'\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[32m'Value'\u001b[0m: \u001b[1;36m0\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.SendCommand(2, 2, Clusters.OnOff.Commands.Off())\n", - "time.sleep(1)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "50aa8d53-0fe3-4489-badd-3db9f78ea210", - "metadata": {}, - "outputs": [], - "source": [ - "subscription.Shutdown()" - ] - }, - { - "cell_type": "markdown", - "id": "dad3f8bf-431e-496f-b2a7-6e675e3d3ee2", - "metadata": {}, - "source": [ - "#### Subscribe to Events" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "7db20b08-fed9-46f6-ab46-9e69c82a87fb", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "reportingTimingParams = (0, 2) # MinInterval = 0s, MaxInterval = 2s\n", - "subscription = await devCtrl.ReadEvent(2, [()], reportingTimingParams)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "d8599eec-b1e1-4936-aea2-11c2a015a7a7", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "[\n",
-       "EventReadResult(\n",
-       "│   │   Header=EventHeader(\n",
-       "│   │   │   EndpointId=1,\n",
-       "│   │   │   Event=None,\n",
-       "│   │   │   EventNumber=0,\n",
-       "│   │   │   Priority=<EventPriority.DEBUG: 1>,\n",
-       "│   │   │   Timestamp=<EventTimestampType.SYSTEM: 0>,\n",
-       "│   │   │   TimestampType=None\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>,\n",
-       "│   │   Data=TestEvent(\n",
-       "│   │   │   arg1=0,\n",
-       "│   │   │   arg2=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   arg3=False,\n",
-       "│   │   │   arg4=SimpleStruct(\n",
-       "│   │   │   │   a=0,\n",
-       "│   │   │   │   b=False,\n",
-       "│   │   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   │   d=b'',\n",
-       "│   │   │   │   e='',\n",
-       "│   │   │   │   f=0,\n",
-       "│   │   │   │   g=0.0,\n",
-       "│   │   │   │   h=0.0\n",
-       "│   │   │   ),\n",
-       "│   │   │   arg5=[],\n",
-       "│   │   │   arg6=[]\n",
-       "│   │   )\n",
-       ")\n",
-       "]\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;35mEventReadResult\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mHeader\u001b[0m=\u001b[1;35mEventHeader\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mEvent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.DEBUG:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mTimestamp\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventTimestampType.SYSTEM:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mTimestampType\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mData\u001b[0m=\u001b[1;35mTestEvent\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg3\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg4\u001b[0m=\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ │ \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg5\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33marg6\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "subscription.GetEvents()" - ] - }, - { - "cell_type": "markdown", - "id": "4ff2d257-ea1b-4957-97ed-fd6518740218", - "metadata": {}, - "source": [ - "### Trigger Event\n", - "\n", - "Force an event to get emitted, which after a short while, should generate a report and trigger the print out of the received event:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "93cb4c17-b3c7-4462-b448-397171458416", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Received Event:\n" - ] - }, - { - "data": { - "text/html": [ - "
EventReadResult(\n",
-       "Header=EventHeader(\n",
-       "│   │   EndpointId=1,\n",
-       "│   │   Event=None,\n",
-       "│   │   EventNumber=1,\n",
-       "│   │   Priority=<EventPriority.DEBUG: 1>,\n",
-       "│   │   Timestamp=<EventTimestampType.SYSTEM: 0>,\n",
-       "│   │   TimestampType=None\n",
-       "),\n",
-       "Status=<Status.Success: 0>,\n",
-       "Data=TestEvent(\n",
-       "│   │   arg1=0,\n",
-       "│   │   arg2=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   arg3=False,\n",
-       "│   │   arg4=SimpleStruct(\n",
-       "│   │   │   a=0,\n",
-       "│   │   │   b=False,\n",
-       "│   │   │   c=<SimpleEnum.kUnspecified: 0>,\n",
-       "│   │   │   d=b'',\n",
-       "│   │   │   e='',\n",
-       "│   │   │   f=0,\n",
-       "│   │   │   g=0.0,\n",
-       "│   │   │   h=0.0\n",
-       "│   │   ),\n",
-       "│   │   arg5=[],\n",
-       "│   │   arg6=[]\n",
-       ")\n",
-       ")\n",
-       "
\n" - ], - "text/plain": [ - "\u001b[1;35mEventReadResult\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mHeader\u001b[0m=\u001b[1;35mEventHeader\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mEvent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mEventNumber\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mPriority\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventPriority.DEBUG:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m1\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mTimestamp\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mEventTimestampType.SYSTEM:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mTimestampType\u001b[0m=\u001b[3;35mNone\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ \u001b[0m\u001b[33mData\u001b[0m=\u001b[1;35mTestEvent\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33marg1\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33marg2\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33marg3\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33marg4\u001b[0m=\u001b[1;35mSimpleStruct\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33ma\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mb\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mc\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mSimpleEnum.kUnspecified:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33md\u001b[0m=\u001b[32mb\u001b[0m\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33me\u001b[0m=\u001b[32m''\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mf\u001b[0m=\u001b[1;36m0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mg\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mh\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1;36m.0\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33marg5\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33marg6\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[1m)\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.SendCommand(2, 1, Clusters.TestCluster.Commands.TestEmitTestEventRequest())\n", - "time.sleep(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "6e294da6-1e71-444d-952b-0e1d3b8268b6", - "metadata": {}, - "outputs": [], - "source": [ - "subscription.Shutdown()" - ] - }, - { - "cell_type": "markdown", - "id": "e2b7e2ea-497f-40e7-86c5-198ad1a80950", - "metadata": {}, - "source": [ - "### Write Interaction\n", - "\n", - "To write attribute data, the `WriteAttribute` API can be used. It requires a NodeId and a list of cluster object encapsulated data for the attribute being written." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "95c78192-d895-4784-b8e6-4f8884bb1f92", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "[\n",
-       "AttributeStatus(\n",
-       "│   │   Path=AttributePath(\n",
-       "│   │   │   EndpointId=1,\n",
-       "│   │   │   ClusterId=1295,\n",
-       "│   │   │   AttributeId=6\n",
-       "│   │   ),\n",
-       "│   │   Status=<Status.Success: 0>\n",
-       ")\n",
-       "]\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m[\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;35mAttributeStatus\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mPath\u001b[0m=\u001b[1;35mAttributePath\u001b[0m\u001b[1m(\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mEndpointId\u001b[0m=\u001b[1;36m1\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mClusterId\u001b[0m=\u001b[1;36m1295\u001b[0m,\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[33mAttributeId\u001b[0m=\u001b[1;36m6\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m)\u001b[0m,\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[33mStatus\u001b[0m=\u001b[1m<\u001b[0m\u001b[1;95mStatus.Success:\u001b[0m\u001b[39m \u001b[0m\u001b[1;36m0\u001b[0m\u001b[1m>\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m)\u001b[0m\n", - "\u001b[1m]\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.WriteAttribute(2, [ (1, Clusters.TestCluster.Attributes.Int16u(2)) ])" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "69fcf8e6-a49e-471e-9169-14c4fee88f2e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n",
-       "{\n",
-       "1: {\n",
-       "│   │   <class 'chip.clusters.Objects.TestCluster'>: {\n",
-       "│   │   │   <class 'chip.clusters.Objects.TestCluster.Attributes.Int16u'>: 2\n",
-       "│   │   }\n",
-       "}\n",
-       "}\n",
-       "
\n" - ], - "text/plain": [ - "\n", - "\u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1;36m1\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1m{\u001b[0m\n", - "\u001b[2;32m│ │ │ \u001b[0m\u001b[1m<\u001b[0m\u001b[1;95mclass\u001b[0m\u001b[39m \u001b[0m\u001b[32m'chip.clusters.Objects.TestCluster.Attributes.Int16u'\u001b[0m\u001b[1m>\u001b[0m: \u001b[1;36m2\u001b[0m\n", - "\u001b[2;32m│ │ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[2;32m│ \u001b[0m\u001b[1m}\u001b[0m\n", - "\u001b[1m}\u001b[0m\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "await devCtrl.ReadAttribute(2, [ (1, Clusters.TestCluster.Attributes.Int16u) ])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.5" - }, - "vscode": { - "interpreter": { - "hash": "f7fd7085b4be428477fa1342305f4ebb7800cfd7c4438123a54b78fc013e2c1b" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/scripts/build_python.sh b/scripts/build_python.sh index 14d381f33860ac..87b567a7e5c256 100755 --- a/scripts/build_python.sh +++ b/scripts/build_python.sh @@ -44,6 +44,7 @@ declare case_retry_delta declare install_virtual_env declare clean_virtual_env=yes declare install_pytest_requirements=yes +declare install_jupyterlab=no help() { @@ -67,6 +68,7 @@ Input Options: --include_pytest_deps Install requirements.txt for running scripts/tests and src/python_testing scripts. Defaults to yes. + -j, --jupyter-lab Install jupyterlab requirements. --extra_packages PACKAGES Install extra Python packages from PyPI -z --pregen_dir DIRECTORY Directory where generated zap files have been pre-generated. " @@ -132,6 +134,9 @@ while (($#)); do pregen_dir=$2 shift ;; + --jupyter-lab | -j) + install_jupyterlab=yes + ;; -*) help echo "Unknown Option \"$1\"" @@ -230,10 +235,19 @@ if [ -n "$install_virtual_env" ]; then "$ENVIRONMENT_ROOT"/bin/pip install -r "$CHIP_ROOT/src/python_testing/requirements.txt" fi + if [ "$install_jupyterlab" = "yes" ]; then + echo_blue "Installing JupyterLab kernels and lsp..." + "$ENVIRONMENT_ROOT"/bin/pip install -r "$CHIP_ROOT/scripts/jupyterlab_requirements.txt" + fi + echo "" echo_green "Compilation completed and WHL package installed in: " echo_blue " $ENVIRONMENT_ROOT" echo "" echo_green "To use please run:" echo_bold_white " source $ENVIRONMENT_ROOT/bin/activate" + + if [ "$install_jupyterlab" = "yes" ]; then + echo_bold_white " jupyter-lab" + fi fi diff --git a/scripts/jupyterlab_requirements.txt b/scripts/jupyterlab_requirements.txt new file mode 100644 index 00000000000000..2a2c2c30b9b0fa --- /dev/null +++ b/scripts/jupyterlab_requirements.txt @@ -0,0 +1,17 @@ +# Requirements for running chip-repl in jupyterlab +# Once installed, start with +# +# jupyter-lab +# +# -------------------------------------- +# import chip.native +# import pkgutil +# module = pkgutil.get_loader('chip.ChipReplStartup') +# %run {module.path} +# -------------------------------------- +# + +jupyterlab +ipykernel +jupyterlab-lsp +python-lsp-server diff --git a/src/controller/python/chip/ChipReplStartup.py b/src/controller/python/chip/ChipReplStartup.py index 779636ed128bb8..a49638cb99e56d 100644 --- a/src/controller/python/chip/ChipReplStartup.py +++ b/src/controller/python/chip/ChipReplStartup.py @@ -2,9 +2,10 @@ import atexit import builtins import logging +import os +import pathlib import chip.CertificateAuthority -import chip.discovery import chip.FabricAdmin import chip.logging import chip.native @@ -51,7 +52,10 @@ def ReplInit(debug): certificateAuthorityManager = None +@atexit.register def StackShutdown(): + if not certificateAuthorityManager: + return certificateAuthorityManager.Shutdown() builtins.chipStack.Shutdown() @@ -77,50 +81,91 @@ def mattersetdebug(enableDebugMode: bool = True): builtins.enableDebugMode = enableDebugMode -console = Console() - -parser = argparse.ArgumentParser() -parser.add_argument( - "-p", "--storagepath", - help="Path to persistent storage configuration file (default: /tmp/repl-storage.json)", - action="store", - default="/tmp/repl-storage.json") -parser.add_argument( - "-d", "--debug", help="Set default logging level to debug.", action="store_true") -parser.add_argument( - "-t", "--trust-store", help="Path to the PAA trust store.", action="store", default="./credentials/development/paa-root-certs") -args = parser.parse_args() - -chip.native.Init() - -ReplInit(args.debug) -chipStack = ChipStack(persistentStoragePath=args.storagepath, enableServerInteractions=False) -certificateAuthorityManager = chip.CertificateAuthority.CertificateAuthorityManager(chipStack, chipStack.GetStorageManager()) - -certificateAuthorityManager.LoadAuthoritiesFromStorage() - -if (len(certificateAuthorityManager.activeCaList) == 0): - ca = certificateAuthorityManager.NewCertificateAuthority() - ca.NewFabricAdmin(vendorId=0xFFF1, fabricId=1) -elif (len(certificateAuthorityManager.activeCaList[0].adminList) == 0): - certificateAuthorityManager.activeCaList[0].NewFabricAdmin(vendorId=0xFFF1, fabricId=1) - -caList = certificateAuthorityManager.activeCaList - -devCtrl = caList[0].adminList[0].NewController(paaTrustStorePath=args.trust_store) -builtins.devCtrl = devCtrl - -atexit.register(StackShutdown) - -console.print( - '\n\n[blue]The following objects have been created:') - -console.print( - '''\t[red]certificateAuthorityManager[blue]:\tManages a list of CertificateAuthority instances. -\t[red]caList[blue]:\t\t\t\tThe list of CertificateAuthority instances. -\t[red]caList[n][m][blue]:\t\t\tA specific FabricAdmin object at index m for the nth CertificateAuthority instance.''') +def main(): + console = Console() -console.print( - f'\n\n[blue]Default CHIP Device Controller (NodeId: {devCtrl.nodeId}): ' - f'has been initialized to manage [bold red]caList[0].adminList[0][blue] (FabricId = {caList[0].adminList[0].fabricId}), ' - 'and is available as [bold red]devCtrl') + parser = argparse.ArgumentParser() + parser.add_argument( + "-p", "--storagepath", + help="Path to persistent storage configuration file (default: /tmp/repl-storage.json)", + action="store", + default="/tmp/repl-storage.json") + parser.add_argument( + "-d", "--debug", help="Set default logging level to debug.", action="store_true") + parser.add_argument( + "-t", "--trust-store", help="Path to the PAA trust store.", action="store", default="./credentials/development/paa-root-certs") + args = parser.parse_args() + + if not os.path.exists(args.trust_store): + # there is a chance that the script is being run from a sub-path of a checkout. + # try to adjust for convenience + store_path = pathlib.Path(args.trust_store) + if not store_path.is_absolute(): + prefix = pathlib.Path().absolute() + while prefix != prefix.parent: + if prefix.joinpath(store_path).exists(): + oldpath = args.trust_store + args.trust_store = prefix.joinpath(store_path).as_posix() + console.print(f''' +[bold] Replacing [/] store path {oldpath} with {args.trust_store} +Note that you are still running from {os.getcwd()} so other relative paths may be off. + ''') + break + prefix = prefix.parent + + if not os.path.exists(args.trust_store): + console.print(f''' +[bold red] Missing directory: [/]{args.trust_store} +[bold] Your current directory: [/]{os.getcwd()} + +Please add a valid `--trust-store` argument to your script. If using jupyterlab, +the command should look like: + +%run {{module.path}} --trust-store /chip/root/credentials/development/paa-root-certs + +or run `os.chdir` to the root of your CHIP repository checkout. + ''') + # nothing we can do ... things will NOT work + return + + chip.native.Init() + + global certificateAuthorityManager + global chipStack + global caList + global devCtrl + + ReplInit(args.debug) + + chipStack = ChipStack(persistentStoragePath=args.storagepath, enableServerInteractions=False) + certificateAuthorityManager = chip.CertificateAuthority.CertificateAuthorityManager(chipStack, chipStack.GetStorageManager()) + + certificateAuthorityManager.LoadAuthoritiesFromStorage() + + if not certificateAuthorityManager.activeCaList: + ca = certificateAuthorityManager.NewCertificateAuthority() + ca.NewFabricAdmin(vendorId=0xFFF1, fabricId=1) + elif not certificateAuthorityManager.activeCaList[0].adminList: + certificateAuthorityManager.activeCaList[0].NewFabricAdmin(vendorId=0xFFF1, fabricId=1) + + caList = certificateAuthorityManager.activeCaList + + devCtrl = caList[0].adminList[0].NewController(paaTrustStorePath=args.trust_store) + builtins.devCtrl = devCtrl + + console.print( + '\n\n[blue]The following objects have been created:') + + console.print( + '''\t[red]certificateAuthorityManager[blue]:\tManages a list of CertificateAuthority instances. + \t[red]caList[blue]:\t\t\t\tThe list of CertificateAuthority instances. + \t[red]caList[n][m][blue]:\t\t\tA specific FabricAdmin object at index m for the nth CertificateAuthority instance.''') + + console.print( + f'\n\n[blue]Default CHIP Device Controller (NodeId: {devCtrl.nodeId}): ' + f'has been initialized to manage [bold red]caList[0].adminList[0][blue] (FabricId = {caList[0].adminList[0].fabricId}), ' + 'and is available as [bold red]devCtrl') + + +if __name__ == "__main__": + main() From 74566700841ad861878f30bf4f428db2c5871baa Mon Sep 17 00:00:00 2001 From: joonhaengHeo <85541460+joonhaengHeo@users.noreply.github.com> Date: Sat, 27 Jan 2024 02:32:46 +0900 Subject: [PATCH 06/28] [Android] Change cert create time to UTC (#31705) * Change cert create time to UTC * fix build error --- .../devicecontroller/ChipDeviceController.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java index 817a88c7d883ee..e4b59ac387429e 100644 --- a/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java +++ b/src/controller/java/src/chip/devicecontroller/ChipDeviceController.java @@ -25,10 +25,12 @@ import chip.devicecontroller.model.ChipEventPath; import chip.devicecontroller.model.DataVersionFilter; import chip.devicecontroller.model.InvokeElement; +import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Optional; +import java.util.TimeZone; import javax.annotation.Nullable; /** Controller to interact with the CHIP device. */ @@ -1193,8 +1195,8 @@ public void invoke( public static byte[] createRootCertificate( KeypairDelegate keypair, long issuerId, @Nullable Long fabricId) { // current time - Calendar start = Calendar.getInstance(); - Calendar end = Calendar.getInstance(); + Calendar start = Calendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC)); + Calendar end = Calendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC)); // current time + 10 years end.add(Calendar.YEAR, 10); return createRootCertificate(keypair, issuerId, fabricId, start, end); @@ -1215,9 +1217,9 @@ public static byte[] createIntermediateCertificate( long issuerId, @Nullable Long fabricId) { // current time - Calendar start = Calendar.getInstance(); + Calendar start = Calendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC)); // current time + 10 years - Calendar end = Calendar.getInstance(); + Calendar end = Calendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC)); end.add(Calendar.YEAR, 10); return createIntermediateCertificate( rootKeypair, rootCertificate, intermediatePublicKey, issuerId, fabricId, start, end); @@ -1251,9 +1253,9 @@ public static byte[] createOperationalCertificate( long nodeId, List caseAuthenticatedTags) { // current time - Calendar start = Calendar.getInstance(); + Calendar start = Calendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC)); // current time + 10 years - Calendar end = Calendar.getInstance(); + Calendar end = Calendar.getInstance(TimeZone.getTimeZone(ZoneOffset.UTC)); end.add(Calendar.YEAR, 10); return createOperationalCertificate( signingKeypair, From 69f8bd5fec04bec6aa30d20244e715b396efcb8c Mon Sep 17 00:00:00 2001 From: jamesharrow <93921463+jamesharrow@users.noreply.github.com> Date: Sat, 27 Jan 2024 00:08:38 +0000 Subject: [PATCH 07/28] =?UTF-8?q?Enabled=20Electrical=20Energy=20Measureme?= =?UTF-8?q?nt=20in=20example-energy-management-ap=E2=80=A6=20(#31622)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enabled Electrical Energy Measurement in example-energy-management-app ZAP and regen all. * Added ElectricalEnergyMeasurement to chip-repl __init__.py * Restyled by isort * Changed feature map to indicate CUME and IMP support only * Adding into __all__ some missing clusters which are causing flake8 issues. * Removed out of date comment * Added a test event trigger to fake energy reporting readings into the EEM cluster (hooks ready for EPM cluster) * Added new Energy Reporting TE Trigger delegate * Updated random calculation and scaled into mWh (divide by 3600) * Restyled by whitespace * Restyled by gn * Removed accidental launch.json inclusion * Fix for ARM linux etc builds due to gn dependency check error * Added code review suggestions. * More code review suggestions fixed. * Added electrical-energy-measurement-server to CMakelist to fix linker issue. --------- Co-authored-by: Restyled.io --- .../energy-management-app.matter | 91 +++++++ .../energy-management-app.zap | 148 +++++++++++ .../include/EVSEManufacturerImpl.h | 50 ++++ .../include/EnergyEvseDelegateImpl.h | 8 + .../src/EVSEManufacturerImpl.cpp | 234 ++++++++++++++++++ .../esp32/main/CMakeLists.txt | 1 + examples/energy-management-app/linux/args.gni | 1 + examples/energy-management-app/linux/main.cpp | 1 - examples/platform/linux/AppMain.cpp | 9 + examples/platform/linux/BUILD.gn | 7 + src/app/chip_data_model.gni | 7 + ...nergyReportingTestEventTriggerDelegate.cpp | 40 +++ .../EnergyReportingTestEventTriggerDelegate.h | 83 +++++++ .../electrical-energy-measurement-server.cpp | 45 ++-- .../electrical-energy-measurement-server.h | 11 + .../python/chip/clusters/__init__.py | 6 +- 16 files changed, 711 insertions(+), 31 deletions(-) create mode 100644 src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.cpp create mode 100644 src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.h diff --git a/examples/energy-management-app/energy-management-common/energy-management-app.matter b/examples/energy-management-app/energy-management-common/energy-management-app.matter index 2c580b5d463276..dae189309d4dbb 100644 --- a/examples/energy-management-app/energy-management-common/energy-management-app.matter +++ b/examples/energy-management-app/energy-management-common/energy-management-app.matter @@ -900,6 +900,85 @@ cluster GroupKeyManagement = 63 { fabric command access(invoke: administer) KeySetReadAllIndices(): KeySetReadAllIndicesResponse = 4; } +/** This cluster provides a mechanism for querying data about the electrical energy imported or provided by the server. */ +provisional cluster ElectricalEnergyMeasurement = 145 { + revision 1; + + enum MeasurementTypeEnum : enum16 { + kUnspecified = 0; + kVoltage = 1; + kActiveCurrent = 2; + kReactiveCurrent = 3; + kApparentCurrent = 4; + kActivePower = 5; + kReactivePower = 6; + kApparentPower = 7; + kRMSVoltage = 8; + kRMSCurrent = 9; + kRMSPower = 10; + kFrequency = 11; + kPowerFactor = 12; + kNeutralCurrent = 13; + kElectricalEnergy = 14; + } + + bitmap Feature : bitmap32 { + kImportedEnergy = 0x1; + kExportedEnergy = 0x2; + kCumulativeEnergy = 0x4; + kPeriodicEnergy = 0x8; + } + + struct MeasurementAccuracyRangeStruct { + int64s rangeMin = 0; + int64s rangeMax = 1; + optional percent100ths percentMax = 2; + optional percent100ths percentMin = 3; + optional percent100ths percentTypical = 4; + optional int64u fixedMax = 5; + optional int64u fixedMin = 6; + optional int64u fixedTypical = 7; + } + + struct MeasurementAccuracyStruct { + MeasurementTypeEnum measurementType = 0; + boolean measured = 1; + int64s minMeasuredValue = 2; + int64s maxMeasuredValue = 3; + MeasurementAccuracyRangeStruct accuracyRanges[] = 4; + } + + struct EnergyMeasurementStruct { + int64s energy = 0; + optional epoch_s startTimestamp = 1; + optional epoch_s endTimestamp = 2; + optional systime_ms startSystime = 3; + optional systime_ms endSystime = 4; + } + + info event CumulativeEnergyMeasured = 0 { + optional EnergyMeasurementStruct energyImported = 0; + optional EnergyMeasurementStruct energyExported = 1; + } + + info event PeriodicEnergyMeasured = 1 { + optional EnergyMeasurementStruct energyImported = 0; + optional EnergyMeasurementStruct energyExported = 1; + } + + readonly attribute MeasurementAccuracyStruct accuracy = 0; + readonly attribute optional nullable EnergyMeasurementStruct cumulativeEnergyImported = 1; + readonly attribute optional nullable EnergyMeasurementStruct cumulativeEnergyExported = 2; + readonly attribute optional nullable EnergyMeasurementStruct periodicEnergyImported = 3; + readonly attribute optional nullable EnergyMeasurementStruct periodicEnergyExported = 4; + readonly attribute command_id generatedCommandList[] = 65528; + readonly attribute command_id acceptedCommandList[] = 65529; + readonly attribute event_id eventList[] = 65530; + readonly attribute attrib_id attributeList[] = 65531; + readonly attribute bitmap32 featureMap = 65532; + readonly attribute int16u clusterRevision = 65533; +} + /** This cluster allows a client to manage the power draw of a device. An example of such a client could be an Energy Management System (EMS) which controls an Energy Smart Appliance (ESA). */ provisional cluster DeviceEnergyManagement = 152 { revision 3; @@ -1598,6 +1677,18 @@ endpoint 1 { callback attribute clusterRevision; } + server cluster ElectricalEnergyMeasurement { + emits event CumulativeEnergyMeasured; + callback attribute accuracy; + callback attribute cumulativeEnergyImported; + callback attribute generatedCommandList; + callback attribute acceptedCommandList; + callback attribute eventList; + callback attribute attributeList; + ram attribute featureMap default = 5; + ram attribute clusterRevision default = 1; + } + server cluster DeviceEnergyManagement { emits event PowerAdjustStart; emits event PowerAdjustEnd; diff --git a/examples/energy-management-app/energy-management-common/energy-management-app.zap b/examples/energy-management-app/energy-management-common/energy-management-app.zap index 78485dfabbd55d..0e1f15b808317d 100644 --- a/examples/energy-management-app/energy-management-common/energy-management-app.zap +++ b/examples/energy-management-app/energy-management-common/energy-management-app.zap @@ -2517,6 +2517,154 @@ } ] }, + { + "name": "Electrical Energy Measurement", + "code": 145, + "mfgCode": null, + "define": "ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER", + "side": "server", + "enabled": 1, + "apiMaturity": "provisional", + "attributes": [ + { + "name": "Accuracy", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "MeasurementAccuracyStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "CumulativeEnergyImported", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "EnergyMeasurementStruct", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "GeneratedCommandList", + "code": 65528, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AcceptedCommandList", + "code": 65529, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "EventList", + "code": 65530, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "AttributeList", + "code": 65531, + "mfgCode": null, + "side": "server", + "type": "array", + "included": 1, + "storageOption": "External", + "singleton": 0, + "bounded": 0, + "defaultValue": null, + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "FeatureMap", + "code": 65532, + "mfgCode": null, + "side": "server", + "type": "bitmap32", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "5", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "ClusterRevision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "1", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ], + "events": [ + { + "name": "CumulativeEnergyMeasured", + "code": 0, + "mfgCode": null, + "side": "server", + "included": 1 + } + ] + }, { "name": "Device Energy Management", "code": 152, diff --git a/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h b/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h index df757f7374e672..f1c3eac6f60dc9 100644 --- a/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h +++ b/examples/energy-management-app/energy-management-common/include/EVSEManufacturerImpl.h @@ -60,6 +60,56 @@ class EVSEManufacturer */ static void ApplicationCallbackHandler(const EVSECbInfo * cb, intptr_t arg); + /** + * @brief Allows a client application to send in power readings into the system + * + * @param[in] aEndpointId - Endpoint to send to EPM Cluster + * @param[in] aActivePower_mW - Power measured in milli-watts + * @param[in] aVoltage_mV - Voltage measured in milli-volts + * @param[in] aCurrent_mA - Current measured in milli-amps + */ + CHIP_ERROR SendPowerReading(EndpointId aEndpointId, int64_t aActivePower_mW, int64_t aVoltage_mV, int64_t aCurrent_mA); + + /** + * @brief Allows a client application to send in energy readings into the system + * + * This is a helper function to add timestamps to the readings + * + * @param[in] aCumulativeEnergyImported -total energy imported in milli-watthours + * @param[in] aCumulativeEnergyExported -total energy exported in milli-watthours + */ + CHIP_ERROR SendEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, int64_t aCumulativeEnergyExported); + + /** Fake Meter data generation - used for testing EPM/EEM clusters */ + /** + * @brief Starts a fake load/generator to periodically callback the power and energy + * clusters. + * @param[in] aEndpointId - which endpoint is the meter to be updated on + * @param[in] aPower_mW - the mean power of the load + * Positive power indicates Imported energy (e.g. a load) + * Negative power indicated Exported energy (e.g. a generator) + * @param[in] aPowerRandomness_mW This is used to scale random power fluctuations around the mean power of the load + * + * @param[in] aInterval_s - the callback interval in seconds + * @param[in] bReset - boolean: true will reset the energy values to 0 + */ + void StartFakeReadings(EndpointId aEndpointId, int64_t aPower_mW, uint32_t aPowerRandomness_mW, uint8_t aInterval_s, + bool bReset); + + /** + * @brief Stops any active updates to the fake load data callbacks + */ + void StopFakeReadings(); + + /** + * @brief Sends fake meter data into the cluster and restarts the timer + */ + void FakeReadingsUpdate(); + /** + * @brief Timer expiry callback to handle fake load + */ + static void FakeReadingsTimerExpiry(System::Layer * systemLayer, void * manufacturer); + private: EnergyEvseManager * mInstance; diff --git a/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h b/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h index 558f7c13df2766..e6f5c8c324d91e 100644 --- a/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h +++ b/examples/energy-management-app/energy-management-common/include/EnergyEvseDelegateImpl.h @@ -26,6 +26,14 @@ #include using chip::Protocols::InteractionModel::Status; + +/** + * @brief Helper function to get current timestamp in Epoch format + * + * @param chipEpoch reference to hold return timestamp + */ +CHIP_ERROR GetEpochTS(uint32_t & chipEpoch); + namespace chip { namespace app { namespace Clusters { diff --git a/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp b/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp index fe51c9da664b6d..70cd63e7926c8d 100644 --- a/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp +++ b/examples/energy-management-app/energy-management-common/src/EVSEManufacturerImpl.cpp @@ -18,12 +18,16 @@ #include #include +#include +#include #include using namespace chip; using namespace chip::app; using namespace chip::app::Clusters; using namespace chip::app::Clusters::EnergyEvse; +using namespace chip::app::Clusters::ElectricalEnergyMeasurement; +using namespace chip::app::Clusters::ElectricalEnergyMeasurement::Structs; CHIP_ERROR EVSEManufacturer::Init() { @@ -89,6 +93,179 @@ CHIP_ERROR EVSEManufacturer::Shutdown() return CHIP_NO_ERROR; } +/** + * @brief Allows a client application to send in power readings into the system + * + * @param[in] aEndpointId - Endpoint to send to EPM Cluster + * @param[in] aActivePower_mW - Power measured in milli-watts + * @param[in] aVoltage_mV - Voltage measured in milli-volts + * @param[in] aCurrent_mA - Current measured in milli-amps + */ +CHIP_ERROR EVSEManufacturer::SendPowerReading(EndpointId aEndpointId, int64_t aActivePower_mW, int64_t aVoltage_mV, + int64_t aCurrent_mA) +{ + // TODO add Power Readings when EPM cluster is merged + + return CHIP_NO_ERROR; +} + +/** + * @brief Allows a client application to send in energy readings into the system + * + * This is a helper function to add timestamps to the readings + * + * @param[in] aCumulativeEnergyImported -total energy imported in milli-watthours + * @param[in] aCumulativeEnergyExported -total energy exported in milli-watthours + */ +CHIP_ERROR EVSEManufacturer::SendEnergyReading(EndpointId aEndpointId, int64_t aCumulativeEnergyImported, + int64_t aCumulativeEnergyExported) +{ + MeasurementData * data = MeasurementDataForEndpoint(aEndpointId); + + EnergyMeasurementStruct::Type energyImported; + EnergyMeasurementStruct::Type energyExported; + + // Get current timestamp + uint32_t currentTimestamp; + CHIP_ERROR err = GetEpochTS(currentTimestamp); + if (err != CHIP_NO_ERROR) + { + ChipLogError(AppServer, "GetEpochTS returned error getting timestamp"); + return err; + } + + /** IMPORT */ + // Copy last endTimestamp into new startTimestamp if it exists + energyImported.startTimestamp.ClearValue(); + if (data->cumulativeImported.HasValue()) + { + energyImported.startTimestamp = data->cumulativeImported.Value().endTimestamp; + } + + energyImported.endTimestamp.SetValue(currentTimestamp); + energyImported.energy = aCumulativeEnergyImported; + + /** EXPORT */ + // Copy last endTimestamp into new startTimestamp if it exists + energyExported.startTimestamp.ClearValue(); + if (data->cumulativeExported.HasValue()) + { + energyExported.startTimestamp = data->cumulativeExported.Value().endTimestamp; + } + energyExported.endTimestamp.SetValue(currentTimestamp); + energyExported.energy = aCumulativeEnergyExported; + + // call the SDK to update attributes and generate an event + if (!NotifyCumulativeEnergyMeasured(aEndpointId, MakeOptional(energyImported), MakeOptional(energyExported))) + { + ChipLogError(AppServer, "Failed to notify Cumulative Energy reading."); + return CHIP_ERROR_INTERNAL; + } + + return CHIP_NO_ERROR; +} + +struct FakeReadingsData +{ + bool bEnabled; /* If enabled then the timer callback will re-trigger */ + EndpointId mEndpointId; /* Which endpoint the meter is on */ + uint8_t mInterval_s; /* Interval in seconds to callback */ + int64_t mPower_mW; /* Power on the load in mW (signed value) +ve = imported */ + uint32_t mPowerRandomness_mW; /* The amount to randomize the Power on the load in mW */ + /* These energy values can only be positive values. + * however the underlying energy type (power_mWh) is signed, so keeping with that convention */ + int64_t mTotalEnergyImported = 0; /* Energy Imported which is updated if mPower > 0 */ + int64_t mTotalEnergyExported = 0; /* Energy Imported which is updated if mPower < 0 */ +}; + +static FakeReadingsData gFakeReadingsData; + +/* This helper routine starts and handles a callback */ +/** + * @brief Starts a fake load/generator to periodically callback the power and energy + * clusters. + * @param[in] aEndpointId - which endpoint is the meter to be updated on + * @param[in] aPower_mW - the mean power of the load + * Positive power indicates Imported energy (e.g. a load) + * Negative power indicated Exported energy (e.g. a generator) + * @param[in] aPowerRandomness_mW This is used to define the std.dev of the + * random power values around the mean power of the load + * + * @param[in] aInterval_s - the callback interval in seconds + * @param[in] bReset - boolean: true will reset the energy values to 0 + */ +void EVSEManufacturer::StartFakeReadings(EndpointId aEndpointId, int64_t aPower_mW, uint32_t aPowerRandomness_mW, + uint8_t aInterval_s, bool bReset) +{ + gFakeReadingsData.bEnabled = true; + gFakeReadingsData.mEndpointId = aEndpointId; + gFakeReadingsData.mPower_mW = aPower_mW; + gFakeReadingsData.mPowerRandomness_mW = aPowerRandomness_mW; + gFakeReadingsData.mInterval_s = aInterval_s; + + if (bReset) + { + gFakeReadingsData.mTotalEnergyImported = 0; + gFakeReadingsData.mTotalEnergyExported = 0; + } + + // Call update function to kick off regular readings + FakeReadingsUpdate(); +} +/** + * @brief Stops any active updates to the fake load data callbacks + */ +void EVSEManufacturer::StopFakeReadings() +{ + gFakeReadingsData.bEnabled = false; +} +/** + * @brief Sends fake meter data into the cluster and restarts the timer + */ +void EVSEManufacturer::FakeReadingsUpdate() +{ + /* Check to see if the fake Load is still running - don't send updates if the timer was already cancelled */ + if (!gFakeReadingsData.bEnabled) + { + return; + } + + // Update meter values + // Avoid using floats - so we will do a basic rand() call which will generate a integer value between 0 and RAND_MAX + // first compute power as a mean + some random value in range 0 to mPowerRandomness_mW + int64_t power = (rand() % gFakeReadingsData.mPowerRandomness_mW); + power += gFakeReadingsData.mPower_mW; // add in the base power + + // TODO call the EPM cluster to send a power reading + + // update the energy meter - we'll assume that the power has been constant during the previous interval + if (gFakeReadingsData.mPower_mW > 0) + { + // Positive power - means power is imported + gFakeReadingsData.mTotalEnergyImported += ((power * gFakeReadingsData.mInterval_s) / 3600); + } + else + { + // Negative power - means power is exported, but the cumulative energy is positive + gFakeReadingsData.mTotalEnergyExported += ((-power * gFakeReadingsData.mInterval_s) / 3600); + } + + SendEnergyReading(gFakeReadingsData.mEndpointId, gFakeReadingsData.mTotalEnergyImported, + gFakeReadingsData.mTotalEnergyExported); + + // start/restart the timer + DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds32(gFakeReadingsData.mInterval_s), FakeReadingsTimerExpiry, this); +} +/** + * @brief Timer expiry callback to handle fake load + */ +void EVSEManufacturer::FakeReadingsTimerExpiry(System::Layer * systemLayer, void * manufacturer) +{ + EVSEManufacturer * mn = reinterpret_cast(manufacturer); + + mn->FakeReadingsUpdate(); +} + /** * @brief Main Callback handler - to be implemented by Manufacturer * @@ -231,6 +408,37 @@ void SetTestEventTrigger_EVSEDiagnosticsComplete() dg->HwDiagnosticsComplete(); } +void SetTestEventTrigger_FakeReadingsLoadStart() +{ + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); + + int64_t aPower_mW = 1'000'000; // Fake load 1000 W + uint32_t aPowerRandomness_mW = 20'000; // randomness 20W + uint8_t aInterval_s = 2; // 2s updates + bool bReset = true; + mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aInterval_s, bReset); +} + +void SetTestEventTrigger_FakeReadingsGeneratorStart() +{ + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); + + int64_t aPower_mW = -3'000'000; // Fake Generator -3000 W + uint32_t aPowerRandomness_mW = 20'000; // randomness 20W + uint8_t aInterval_s = 5; // 5s updates + bool bReset = true; + mn->StartFakeReadings(EndpointId(1), aPower_mW, aPowerRandomness_mW, aInterval_s, bReset); +} + +void SetTestEventTrigger_FakeReadingsStop() +{ + EVSEManufacturer * mn = GetEvseManufacturer(); + VerifyOrDieWithMsg(mn != nullptr, AppServer, "EVSEManufacturer is null"); + mn->StopFakeReadings(); +} + bool HandleEnergyEvseTestEventTrigger(uint64_t eventTrigger) { EnergyEvseTrigger trigger = static_cast(eventTrigger); @@ -284,3 +492,29 @@ bool HandleEnergyEvseTestEventTrigger(uint64_t eventTrigger) return true; } + +bool HandleEnergyReportingTestEventTrigger(uint64_t eventTrigger) +{ + EnergyReportingTrigger trigger = static_cast(eventTrigger); + + switch (trigger) + { + case EnergyReportingTrigger::kFakeReadingsStop: + ChipLogProgress(Support, "[EnergyReporting-Test-Event] => Stop Fake load"); + SetTestEventTrigger_FakeReadingsStop(); + break; + case EnergyReportingTrigger::kFakeReadingsLoadStart_1kW_2s: + ChipLogProgress(Support, "[EnergyReporting-Test-Event] => Start Fake load 1kW @2s Import"); + SetTestEventTrigger_FakeReadingsLoadStart(); + break; + case EnergyReportingTrigger::kFakeReadingsGenStart_3kW_5s: + ChipLogProgress(Support, "[EnergyReporting-Test-Event] => Start Fake generator 3kW @5s Export"); + SetTestEventTrigger_FakeReadingsGeneratorStart(); + break; + + default: + return false; + } + + return true; +} diff --git a/examples/energy-management-app/esp32/main/CMakeLists.txt b/examples/energy-management-app/esp32/main/CMakeLists.txt index 46f97d766dbfeb..edba8f9671d1bc 100644 --- a/examples/energy-management-app/esp32/main/CMakeLists.txt +++ b/examples/energy-management-app/esp32/main/CMakeLists.txt @@ -65,6 +65,7 @@ set(SRC_DIRS_LIST "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/groups-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/group-key-mgmt-server" "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/mode-base-server" + "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/electrical-energy-measurement-server" ) set(PRIV_REQUIRES_LIST chip QRCode bt led_strip app_update openthread driver nvs_flash spi_flash) diff --git a/examples/energy-management-app/linux/args.gni b/examples/energy-management-app/linux/args.gni index b7c71c3097a680..e1000e6cb3fa27 100644 --- a/examples/energy-management-app/linux/args.gni +++ b/examples/energy-management-app/linux/args.gni @@ -30,3 +30,4 @@ matter_enable_tracing_support = true chip_enable_read_client = false chip_enable_energy_evse_trigger = true +chip_enable_energy_reporting_trigger = true diff --git a/examples/energy-management-app/linux/main.cpp b/examples/energy-management-app/linux/main.cpp index 824fa17316cc70..a150b82c4bb171 100644 --- a/examples/energy-management-app/linux/main.cpp +++ b/examples/energy-management-app/linux/main.cpp @@ -208,7 +208,6 @@ CHIP_ERROR EVSEManufacturerInit() } /* Now create EVSEManufacturer */ - // TODO this takes just the EVSE Instance for now, but will need the DEM adding gEvseManufacturer = std::make_unique(gEvseInstance.get()); if (!gEvseManufacturer) { diff --git a/examples/platform/linux/AppMain.cpp b/examples/platform/linux/AppMain.cpp index 933502dc050c69..04274ab2f33c24 100644 --- a/examples/platform/linux/AppMain.cpp +++ b/examples/platform/linux/AppMain.cpp @@ -86,6 +86,9 @@ #if CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER #include #endif +#if CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER +#include +#endif #include #include @@ -571,6 +574,12 @@ void ChipLinuxAppMainLoop(AppMainLoopImplementation * impl) }; otherDelegate = &energyEvseTestEventTriggerDelegate; #endif +#if CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER + static EnergyReportingTestEventTriggerDelegate energyReportingTestEventTriggerDelegate{ + ByteSpan(LinuxDeviceOptions::GetInstance().testEventTriggerEnableKey), otherDelegate + }; + otherDelegate = &energyReportingTestEventTriggerDelegate; +#endif // For general testing of TestEventTrigger, we have a common "core" event trigger delegate. static SampleTestEventTriggerDelegate testEventTriggerDelegate; diff --git a/examples/platform/linux/BUILD.gn b/examples/platform/linux/BUILD.gn index fbbf7e1833894e..f82702be227709 100644 --- a/examples/platform/linux/BUILD.gn +++ b/examples/platform/linux/BUILD.gn @@ -23,6 +23,7 @@ declare_args() { chip_enable_smoke_co_trigger = false chip_enable_boolean_state_configuration_trigger = false chip_enable_energy_evse_trigger = false + chip_enable_energy_reporting_trigger = false } config("app-main-config") { @@ -47,6 +48,10 @@ source_set("energy-evse-test-event-trigger") { sources = [ "${chip_root}/src/app/clusters/energy-evse-server/EnergyEvseTestEventTriggerDelegate.h" ] } +source_set("energy-reporting-test-event-trigger") { + sources = [ "${chip_root}/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.h" ] +} + source_set("app-main") { defines = [ "ENABLE_TRACING=${matter_enable_tracing_support}" ] sources = [ @@ -71,6 +76,7 @@ source_set("app-main") { public_deps = [ ":boolean-state-configuration-test-event-trigger", ":energy-evse-test-event-trigger", + ":energy-reporting-test-event-trigger", ":smco-test-event-trigger", "${chip_root}/src/lib", "${chip_root}/src/platform/logging:force_stdio", @@ -110,6 +116,7 @@ source_set("app-main") { "CHIP_DEVICE_CONFIG_ENABLE_SMOKE_CO_TRIGGER=${chip_enable_smoke_co_trigger}", "CHIP_DEVICE_CONFIG_ENABLE_BOOLEAN_STATE_CONFIGURATION_TRIGGER=${chip_enable_boolean_state_configuration_trigger}", "CHIP_DEVICE_CONFIG_ENABLE_ENERGY_EVSE_TRIGGER=${chip_enable_energy_evse_trigger}", + "CHIP_DEVICE_CONFIG_ENABLE_ENERGY_REPORTING_TRIGGER=${chip_enable_energy_reporting_trigger}", ] public_configs = [ ":app-main-config" ] diff --git a/src/app/chip_data_model.gni b/src/app/chip_data_model.gni index 7f8f477c19a2cd..6404eb306d2c45 100644 --- a/src/app/chip_data_model.gni +++ b/src/app/chip_data_model.gni @@ -352,6 +352,13 @@ template("chip_data_model") { "${_app_root}/clusters/${cluster}/BDXDiagnosticLogsProvider.h", "${_app_root}/clusters/${cluster}/DiagnosticLogsProviderDelegate.h", ] + } else if (cluster == "electrical-energy-measurement-server") { + sources += [ + "${_app_root}/clusters/${cluster}/${cluster}.cpp", + "${_app_root}/clusters/${cluster}/${cluster}.h", + "${_app_root}/clusters/${cluster}/EnergyReportingTestEventTriggerDelegate.cpp", + "${_app_root}/clusters/${cluster}/EnergyReportingTestEventTriggerDelegate.h", + ] } else { sources += [ "${_app_root}/clusters/${cluster}/${cluster}.cpp" ] } diff --git a/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.cpp b/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.cpp new file mode 100644 index 00000000000000..210ab401bc2221 --- /dev/null +++ b/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.cpp @@ -0,0 +1,40 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "EnergyReportingTestEventTriggerDelegate.h" + +namespace chip { + +bool EnergyReportingTestEventTriggerDelegate::DoesEnableKeyMatch(const ByteSpan & enableKey) const +{ + return !mEnableKey.empty() && mEnableKey.data_equal(enableKey); +} + +CHIP_ERROR EnergyReportingTestEventTriggerDelegate::HandleEventTrigger(uint64_t eventTrigger) +{ + if (HandleEnergyReportingTestEventTrigger(eventTrigger)) + { + return CHIP_NO_ERROR; + } + if (mOtherDelegate != nullptr) + { + return mOtherDelegate->HandleEventTrigger(eventTrigger); + } + return CHIP_ERROR_INVALID_ARGUMENT; +} + +} // namespace chip diff --git a/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.h b/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.h new file mode 100644 index 00000000000000..a7beef6c2838ce --- /dev/null +++ b/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerDelegate.h @@ -0,0 +1,83 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +namespace chip { + +/* + * These Test EventTrigger values can be used to fake meter reading data + * + * They are sent along with the enableKey (manufacturer defined secret) + * in the General Diagnostic cluster TestEventTrigger command + */ +enum class EnergyReportingTrigger : uint64_t +{ + // We use the Electrical Energy Measurement cluster ID as our TE trigger space + // Stop Fake readings + kFakeReadingsStop = 0x0091'0000'0000'0000, + // Fake a load (importing) readings at 1kW 230V 4.34A with 2s updates + kFakeReadingsLoadStart_1kW_2s = 0x0091'0000'0000'0001, + // Fake a generator (exporting) readings at 3kW 230V 3.33A with 5s updates + kFakeReadingsGenStart_3kW_5s = 0x0091'0000'0000'0002, + +}; + +class EnergyReportingTestEventTriggerDelegate : public TestEventTriggerDelegate +{ +public: + /** + * This class expects the enableKey ByteSpan to be valid forever. + * Typically this feature is only enabled in certification testing + * and uses a static secret key in the device for testing (e.g. in factory data) + */ + explicit EnergyReportingTestEventTriggerDelegate(const ByteSpan & enableKey, TestEventTriggerDelegate * otherDelegate) : + mEnableKey(enableKey), mOtherDelegate(otherDelegate) + {} + + /* This function returns True if the enableKey received in the TestEventTrigger command + * matches the value passed into the constructor. + */ + bool DoesEnableKeyMatch(const ByteSpan & enableKey) const override; + + /** This function must return True if the eventTrigger is recognised and handled + * It must return False to allow a higher level TestEvent handler to check other + * clusters that may handle it. + */ + CHIP_ERROR HandleEventTrigger(uint64_t eventTrigger) override; + +private: + ByteSpan mEnableKey; + TestEventTriggerDelegate * mOtherDelegate; +}; + +} // namespace chip + +/** + * @brief User handler for handling the test event trigger + * + * @note If TestEventTrigger is enabled, it needs to be implemented in the app + * + * @param eventTrigger Event trigger to handle + * + * @retval true on success + * @retval false if error happened + */ +bool HandleEnergyReportingTestEventTrigger(uint64_t eventTrigger); diff --git a/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp b/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp index fcc75ef319d60c..728b41dee02f74 100644 --- a/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp +++ b/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.cpp @@ -33,36 +33,9 @@ using namespace chip::app::Clusters::ElectricalEnergyMeasurement; using namespace chip::app::Clusters::ElectricalEnergyMeasurement::Attributes; using namespace chip::app::Clusters::ElectricalEnergyMeasurement::Structs; -struct MeasurementData -{ - MeasurementAccuracyStruct::Type measurementAccuracy; - Optional cumulativeImported; - Optional cumulativeExported; - Optional periodicImported; - Optional periodicExported; -}; - MeasurementData gMeasurements[EMBER_AF_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT]; -MeasurementData * MeasurementDataForEndpoint(EndpointId endpointId) -{ - auto index = emberAfGetClusterServerEndpointIndex(endpointId, app::Clusters::ElectricalEnergyMeasurement::Id, - EMBER_AF_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT); - - if (index == kEmberInvalidEndpointIndex) - { - return nullptr; - } - - if (index >= EMBER_AF_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT) - { - ChipLogError(NotSpecified, "Internal error: invalid/unexpected energy measurement index."); - return nullptr; - } - return &gMeasurements[index]; -} - class ElectricalEnergyMeasurementAttrAccess : public app::AttributeAccessInterface { public: @@ -126,6 +99,24 @@ namespace app { namespace Clusters { namespace ElectricalEnergyMeasurement { +MeasurementData * MeasurementDataForEndpoint(EndpointId endpointId) +{ + auto index = emberAfGetClusterServerEndpointIndex(endpointId, app::Clusters::ElectricalEnergyMeasurement::Id, + EMBER_AF_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT); + + if (index == kEmberInvalidEndpointIndex) + { + return nullptr; + } + + if (index >= EMBER_AF_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT) + { + ChipLogError(NotSpecified, "Internal error: invalid/unexpected energy measurement index."); + return nullptr; + } + return &gMeasurements[index]; +} + CHIP_ERROR SetMeasurementAccuracy(EndpointId endpointId, const MeasurementAccuracyStruct::Type & accuracy) { diff --git a/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.h b/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.h index 8647b9bde0b750..9c3d87683d680c 100644 --- a/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.h +++ b/src/app/clusters/electrical-energy-measurement-server/electrical-energy-measurement-server.h @@ -26,6 +26,15 @@ namespace app { namespace Clusters { namespace ElectricalEnergyMeasurement { +struct MeasurementData +{ + Structs::MeasurementAccuracyStruct::Type measurementAccuracy; + Optional cumulativeImported; + Optional cumulativeExported; + Optional periodicImported; + Optional periodicExported; +}; + bool NotifyCumulativeEnergyMeasured(EndpointId endpointId, const Optional & energyImported, const Optional & energyExported); @@ -34,6 +43,8 @@ bool NotifyPeriodicEnergyMeasured(EndpointId endpointId, const Optional Date: Fri, 26 Jan 2024 16:12:51 -0800 Subject: [PATCH 08/28] iOS tv-casting-app: simplified command/attribute APIs (#31640) * iOS tv-casting-app: simplified command/attribute APIs --- examples/tv-casting-app/APIs.md | 207 +++++++++++++++++- .../project.pbxproj | 92 ++++++++ .../xcschemes/MatterTvCastingBridge.xcscheme | 66 ++++++ .../MatterTvCastingBridge/MCAttribute.h | 48 ++++ .../MatterTvCastingBridge/MCAttribute.mm | 50 +++++ .../MCAttributeObjects.h | 30 +++ .../MCAttributeObjects.mm | 109 +++++++++ .../MCAttribute_Internal.h | 120 ++++++++++ .../MatterTvCastingBridge/MCCastingPlayer.h | 16 +- .../MatterTvCastingBridge/MCCastingPlayer.mm | 26 ++- .../MCCastingPlayer_Internal.h | 33 +++ .../MatterTvCastingBridge/MCCluster.h | 36 +++ .../MatterTvCastingBridge/MCCluster.mm | 42 ++++ .../MatterTvCastingBridge/MCClusterObjects.h | 47 ++++ .../MatterTvCastingBridge/MCClusterObjects.mm | 52 +++++ .../MCCluster_Internal.h | 35 +++ .../MatterTvCastingBridge/MCCommand.h | 39 ++++ .../MatterTvCastingBridge/MCCommand.mm | 50 +++++ .../MatterTvCastingBridge/MCCommandObjects.h | 60 +++++ .../MatterTvCastingBridge/MCCommandObjects.mm | 132 +++++++++++ .../MCCommand_Internal.h | 98 +++++++++ .../MCDeviceTypeStruct.h | 33 +++ .../MCDeviceTypeStruct.m | 31 +++ .../MatterTvCastingBridge/MCEndpoint.h | 46 ++++ .../MatterTvCastingBridge/MCEndpoint.mm | 133 +++++++++++ .../MCEndpointClusterType.h | 28 +++ .../MCEndpoint_Internal.h | 33 +++ .../MatterTvCastingBridge/MCObserver.h | 29 +++ .../MatterTvCastingBridge.h | 8 + .../TvCasting.xcodeproj/project.pbxproj | 28 +++ .../xcschemes/TvCasting Release.xcscheme | 2 +- .../xcshareddata/xcschemes/TvCasting.xcscheme | 2 +- .../TvCasting/MCActionSelectorView.swift | 72 ++++++ ...licationBasicReadVendorIDExampleView.swift | 52 +++++ ...ionBasicReadVendorIDExampleViewModel.swift | 96 ++++++++ .../TvCasting/MCConnectionExampleView.swift | 7 +- .../MCConnectionExampleViewModel.swift | 19 +- ...CContentLauncherLaunchURLExampleView.swift | 79 +++++++ ...entLauncherLaunchURLExampleViewModel.swift | 94 ++++++++ ...ckSubscribeToCurrentStateExampleView.swift | 52 +++++ ...scribeToCurrentStateExampleViewModel.swift | 99 +++++++++ .../tv-casting-common/core/Attribute.h | 11 +- .../tv-casting-common/core/CastingApp.h | 2 +- .../tv-casting-common/core/Command.h | 1 - .../tv-casting-common/core/Endpoint.h | 1 + 45 files changed, 2299 insertions(+), 47 deletions(-) create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge.xcodeproj/xcshareddata/xcschemes/MatterTvCastingBridge.xcscheme create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.mm create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.mm create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute_Internal.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer_Internal.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.mm create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.mm create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster_Internal.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.mm create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.mm create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand_Internal.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.m create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.mm create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpointClusterType.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint_Internal.h create mode 100644 examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCObserver.h create mode 100644 examples/tv-casting-app/darwin/TvCasting/TvCasting/MCActionSelectorView.swift create mode 100644 examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleView.swift create mode 100644 examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleViewModel.swift create mode 100644 examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleView.swift create mode 100644 examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift create mode 100644 examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleView.swift create mode 100644 examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift diff --git a/examples/tv-casting-app/APIs.md b/examples/tv-casting-app/APIs.md index 4afb4f6556fe28..f0fdb32484a72e 100644 --- a/examples/tv-casting-app/APIs.md +++ b/examples/tv-casting-app/APIs.md @@ -773,7 +773,8 @@ func connect(selectedCastingPlayer: MCCastingPlayer?) { ### Select an Endpoint on the Casting Player -_{Complete Endpoint selection examples: [Linux](linux/simple-app-helper.cpp)}_ +_{Complete Endpoint selection examples: [Linux](linux/simple-app-helper.cpp) | +[iOS](darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift)}_ On a successful connection with a `CastingPlayer`, a Casting Client may select one of the Endpoints to interact with based on its attributes (e.g. Vendor ID, @@ -799,6 +800,19 @@ if (it != endpoints.end()) } ``` +On iOS, it can select an `MCEndpoint` similarly and as shown below. + +```swift +// VendorId of the MCEndpoint on the MCCastingPlayer that the MCCastingApp desires to interact with after connection +let sampleEndpointVid: Int = 65521 +... +// select the MCEndpoint on the MCCastingPlayer to invoke the command on +if let endpoint: MCEndpoint = castingPlayer.endpoints().filter({ $0.vendorId().intValue == sampleEndpointVid}).first +{ +... +} +``` + ## Interacting with a Casting Endpoint Once the Casting Client has selected an `Endpoint`, it is ready to @@ -819,13 +833,14 @@ response types to use with these APIs: ### Issuing Commands -_{Complete Command invocation examples: [Linux](linux/simple-app-helper.cpp)}_ +_{Complete Command invocation examples: [Linux](linux/simple-app-helper.cpp) | +[iOS](darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift)}_ -The Casting Client can get a reference to a `endpoint` on a `CastingPlayer`, +The Casting Client can get a reference to an `Endpoint` on a `CastingPlayer`, check if it supports the required cluster/command, and send commands to it. It can then handle any command response / error the `CastingPlayer` sends back. -On Linux, for example, given an `endpoint`, it can send a `LaunchURL` command +On Linux, for example, given an `Endpoint`, it can send a `LaunchURL` command (part of the Content Launcher cluster) by calling the `Invoke` API on a `Command` of type `matter::casting::core::Command` @@ -865,9 +880,65 @@ void InvokeContentLauncherLaunchURL(matter::casting::memory::Strong + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.h new file mode 100644 index 00000000000000..ba9f40c24c519c --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.h @@ -0,0 +1,48 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCObserver.h" + +#import + +#ifndef MCAttribute_h +#define MCAttribute_h + +@interface MCAttribute<__covariant ObjectType> : NSObject + +/** + * @brief Reads the value of the MCAttribute that belongs to the associated MCEndpoint and corresponding MCCluster + * @param context current context passed back in completion block + * @param completion Called when attribute read completes with nil NSError if successful and before, after values. On failure, the NSError describes the error + */ +- (void)read:(void * _Nullable)context + completion:(void (^_Nonnull)(void * _Nullable context, ObjectType _Nullable before, ObjectType _Nullable after, NSError * _Nullable error))completion; + +/** + * @brief Subscribe to the value of the MCAttribute that belongs to the associated MCEndpoint and corresponding MCCluster + * @param context current context passed back in completion block + * @param completion Called when attribute read completes with nil NSError if successful and before, after values. On failure, the NSError describes the error + * @param minInterval the requested minimum interval boundary floor in seconds for attribute udpates + * @param maxInterval the requested maximum interval boundary ceiling in seconds for attribute udpates + */ +- (void)subscribe:(void * _Nullable)context + completion:(void (^_Nonnull)(void * _Nullable context, ObjectType _Nullable before, ObjectType _Nullable after, NSError * _Nullable error))completion + minInterval:(NSNumber * _Nonnull)minInterval + maxInterval:(NSNumber * _Nonnull)maxInterval; +@end + +#endif /* MCAttribute_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.mm new file mode 100644 index 00000000000000..09397ab86f7060 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute.mm @@ -0,0 +1,50 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCAttribute_Internal.h" +#import "MCCastingApp.h" + +#import + +@implementation MCAttribute + +- (instancetype _Nonnull)initWithCppAttribute:(void *)cppAttribute +{ + if (self = [super init]) { + _cppAttribute = cppAttribute; + } + return self; +} + +- (void)read:(void * _Nullable)context completion:(void (^_Nonnull __strong)(void * _Nullable, id _Nullable __strong, id _Nullable __strong, NSError * _Nullable __strong))completion +{ +} + +- (void)subscribe:(void * _Nullable)context completion:(void (^_Nonnull __strong)(void * _Nullable, id _Nullable __strong, id _Nullable __strong, NSError * _Nullable __strong))completion minInterval:(NSNumber *)minInterval maxInterval:(NSNumber *)maxInterval +{ +} + +- (void)write:(id _Nonnull)value withCompletionBlock:(void (^_Nonnull __strong)(NSError * _Nullable __strong))completionBlock +{ +} + +- (id _Nullable)getObjTypeFromCpp:(std::any)cppValue +{ + return nil; +} + +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.h new file mode 100644 index 00000000000000..d8f371ee1eebbe --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.h @@ -0,0 +1,30 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCAttribute.h" +#import + +#ifndef MCAttributeObjects_h +#define MCAttributeObjects_h + +@interface MCApplicationBasicClusterVendorIDAttribute : MCAttribute +@end + +@interface MCMediaPlaybackClusterCurrentStateAttribute : MCAttribute +@end + +#endif /* MCAttributeObjects_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.mm new file mode 100644 index 00000000000000..5ce91d5ec781bb --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttributeObjects.mm @@ -0,0 +1,109 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCAttributeObjects.h" + +#import "MCAttribute_Internal.h" +#import "MCCastingApp.h" +#import "MCErrorUtils.h" + +#include "core/Attribute.h" +#include + +#import + +@implementation MCApplicationBasicClusterVendorIDAttribute +- (void)read:(void * _Nullable)context + completion:(void (^_Nonnull __strong)(void * _Nullable, id _Nullable __strong before, id _Nullable __strong after, NSError * _Nullable __strong error))completion +{ + MCAttributeTemplate * mcAttribute = new MCAttributeTemplate(self.cppAttribute, + [self](std::any cppValue) { + return [self getObjTypeFromCpp:cppValue]; + }); + mcAttribute->read(context, [mcAttribute, completion](void * context, id before, id after, NSError * err) { + completion(context, before, after, err); + delete mcAttribute; + }); +} + +- (void)subscribe:(void * _Nullable)context + completion:(void (^_Nonnull __strong)(void * _Nullable, id _Nullable __strong before, id _Nullable __strong after, NSError * _Nullable __strong error))completion + minInterval:(NSNumber * _Nonnull)minInterval + maxInterval:(NSNumber * _Nonnull)maxInterval +{ + MCAttributeTemplate * mcAttribute = new MCAttributeTemplate(self.cppAttribute, + [self](std::any cppValue) { + return [self getObjTypeFromCpp:cppValue]; + }); + mcAttribute->subscribe( + context, [mcAttribute, completion](void * context, id before, id after, NSError * err) { + completion(context, before, after, err); + delete mcAttribute; + }, minInterval, maxInterval); +} + +- (id _Nullable)getObjTypeFromCpp:(std::any)cppValue +{ + NSNumber * outValue = nil; + if (cppValue.type() == typeid(std::shared_ptr)) { + std::shared_ptr valueSharedPtr = std::any_cast>(cppValue); + outValue = valueSharedPtr != nil ? [NSNumber numberWithUnsignedInteger:*valueSharedPtr] : nil; + } + return outValue; +} +@end + +@implementation MCMediaPlaybackClusterCurrentStateAttribute +- (void)read:(void * _Nullable)context + completion:(void (^_Nonnull __strong)(void * _Nullable, id _Nullable __strong before, id _Nullable __strong after, NSError * _Nullable __strong error))completion +{ + MCAttributeTemplate * mcAttribute = new MCAttributeTemplate(self.cppAttribute, + [self](std::any cppValue) { + return [self getObjTypeFromCpp:cppValue]; + }); + mcAttribute->read(context, [mcAttribute, completion](void * context, id before, id after, NSError * err) { + completion(context, before, after, err); + delete mcAttribute; + }); +} + +- (void)subscribe:(void * _Nullable)context + completion:(void (^_Nonnull __strong)(void * _Nullable, id _Nullable __strong before, id _Nullable __strong after, NSError * _Nullable __strong error))completion + minInterval:(NSNumber * _Nonnull)minInterval + maxInterval:(NSNumber * _Nonnull)maxInterval +{ + MCAttributeTemplate * mcAttribute = new MCAttributeTemplate(self.cppAttribute, + [self](std::any cppValue) { + return [self getObjTypeFromCpp:cppValue]; + }); + mcAttribute->subscribe( + context, [mcAttribute, completion](void * context, id before, id after, NSError * err) { + completion(context, before, after, err); + delete mcAttribute; + }, minInterval, maxInterval); +} + +- (id _Nullable)getObjTypeFromCpp:(std::any)cppValue +{ + NSNumber * outValue = nil; + if (cppValue.type() == typeid(std::shared_ptr)) { + std::shared_ptr valueSharedPtr = std::any_cast>(cppValue); + outValue = valueSharedPtr != nil ? [NSNumber numberWithUnsignedInteger:static_cast(*valueSharedPtr)] : nil; + } + return outValue; +} +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute_Internal.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute_Internal.h new file mode 100644 index 00000000000000..9a0c7e0385f515 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCAttribute_Internal.h @@ -0,0 +1,120 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCAttribute.h" + +#import "MCCastingApp.h" +#import "MCErrorUtils.h" +#include "core/Attribute.h" +#include + +#import +#include +#include +#include + +#ifndef MCAttribute_Internal_h +#define MCAttribute_Internal_h + +@interface MCAttribute () + +@property (nonatomic, readwrite) void * _Nonnull cppAttribute; + +- (instancetype _Nonnull)initWithCppAttribute:(void * _Nonnull)cppAttribute; + +- (id _Nullable)getObjTypeFromCpp:(std::any)cppValue; + +@end + +template +class MCAttributeTemplate { +public: + MCAttributeTemplate(void * _Nonnull cppAttribute, + std::function getObjTypeFromCppFn) + { + mCppAttribute = cppAttribute; + mGetObjTypeFromCppFn = getObjTypeFromCppFn; + } + + void read(void * _Nullable context, std::function completion) + { + dispatch_queue_t workQueue = [[MCCastingApp getSharedInstance] getWorkQueue], clientQueue = [[MCCastingApp getSharedInstance] getClientQueue]; + dispatch_sync(workQueue, ^{ + matter::casting::core::Attribute * attribute = static_cast *>(mCppAttribute); + + attribute->Read( + context, + [clientQueue, completion, this](void * context, chip::Optional before, typename TypeInfo::DecodableArgType after) { + NSNumber *objCBefore = nil, *objCAfter = nil; + if (before.HasValue()) { + ChipLogProgress(AppServer, " converting 'before' value from Cpp to ObjC"); + std::any anyBefore = std::any(std::make_shared(before.Value())); + objCBefore = mGetObjTypeFromCppFn(anyBefore); + } + ChipLogProgress(AppServer, " converting 'after' value from Cpp to ObjC"); + std::any anyAfter = std::any(std::make_shared(after)); + objCAfter = mGetObjTypeFromCppFn(anyAfter); + dispatch_async(clientQueue, ^{ + completion(context, objCBefore, objCAfter, nil); + }); + }, + [clientQueue, completion](void * context, CHIP_ERROR error) { + dispatch_async(clientQueue, ^{ + completion(context, nil, nil, [MCErrorUtils NSErrorFromChipError:error]); + }); + }); + }); + } + + void subscribe(void * _Nullable context, std::function completion, + NSNumber * _Nonnull minInterval, NSNumber * _Nonnull maxInterval) + { + dispatch_queue_t workQueue = [[MCCastingApp getSharedInstance] getWorkQueue], clientQueue = [[MCCastingApp getSharedInstance] getClientQueue]; + dispatch_sync(workQueue, ^{ + matter::casting::core::Attribute * attribute = static_cast *>(mCppAttribute); + + attribute->Subscribe( + context, + [clientQueue, completion, this](void * context, chip::Optional before, typename TypeInfo::DecodableArgType after) { + NSNumber *objCBefore = nil, *objCAfter = nil; + if (before.HasValue()) { + ChipLogProgress(AppServer, " converting 'before' value from Cpp to ObjC"); + std::any anyBefore = std::any(std::make_shared(before.Value())); + objCBefore = mGetObjTypeFromCppFn(anyBefore); + } + ChipLogProgress(AppServer, " converting 'after' value from Cpp to ObjC"); + std::any anyAfter = std::any(std::make_shared(after)); + objCAfter = mGetObjTypeFromCppFn(anyAfter); + dispatch_async(clientQueue, ^{ + completion(context, objCBefore, objCAfter, nil); + }); + }, + [clientQueue, completion](void * context, CHIP_ERROR error) { + dispatch_async(clientQueue, ^{ + completion(context, nil, nil, [MCErrorUtils NSErrorFromChipError:error]); + }); + }, + minInterval.intValue, + maxInterval.intValue); + }); + } + +private: + void * _Nonnull mCppAttribute; + std::function mGetObjTypeFromCppFn; +}; +#endif /* MCAttribute_Internal_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h index 4259fe53cc7121..cc3d90e8a2f922 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.h @@ -48,20 +48,20 @@ - (void)verifyOrEstablishConnectionWithCompletionBlock:(void (^_Nonnull)(NSError * _Nullable))completion timeout:(long long)timeout desiredEndpointFilter:(MCEndpointFilter * _Nullable)desiredEndpointFilter; /** - * @brief (async) Verifies that a connection exists with this CastingPlayer, or triggers a new session request. If the - * CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on disk, this will execute the user + * @brief (async) Verifies that a connection exists with this MCCastingPlayer, or triggers a new session request. If the + * MCCastingApp does not have the nodeId and fabricIndex of this MCCastingPlayer cached on disk, this will execute the user * directed commissioning process. * * @param completion - called back when the connection process completes. Parameter is nil if it completed successfully - * @param desiredEndpointFilter - Attributes (such as VendorId) describing an Endpoint that the client wants to interact + * @param desiredEndpointFilter - Attributes (such as VendorId) describing an MCEndpoint that the client wants to interact * with after commissioning. If this value is passed in, the VerifyOrEstablishConnection will force User Directed - * Commissioning, in case the desired Endpoint is not found in the on-device cached information about the CastingPlayer + * Commissioning, in case the desired Endpoint is not found in the on-device cached information about the MCCastingPlayer * (if any) */ - (void)verifyOrEstablishConnectionWithCompletionBlock:(void (^_Nonnull)(NSError * _Nullable))completion desiredEndpointFilter:(MCEndpointFilter * _Nullable)desiredEndpointFilter; /** - * @brief Sets the internal connection state of this CastingPlayer to "disconnected" + * @brief Sets the internal connection state of this MCCastingPlayer to "disconnected" */ - (void)disconnect; @@ -72,8 +72,10 @@ - (uint32_t)deviceType; - (NSArray * _Nonnull)ipAddresses; -// TODO -// - (NSArray * _Nonnull)endpoints; +/** + * @brief Returns the NSArray of MCEndpoints associated with this MCCastingPlayer + */ +- (NSArray * _Nonnull)endpoints; - (nonnull instancetype)init UNAVAILABLE_ATTRIBUTE; + (nonnull instancetype)new UNAVAILABLE_ATTRIBUTE; diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm index 40ea160d5abc3b..45cc9568f472a1 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer.mm @@ -18,6 +18,7 @@ #import "MCCastingPlayer.h" #import "MCCastingApp.h" +#import "MCEndpoint_Internal.h" #import "MCErrorUtils.h" #import "core/CastingPlayer.h" @@ -78,12 +79,6 @@ - (void)disconnect }); } -- (NSString * _Nonnull)description -{ - return [NSString stringWithFormat:@"%@ with Product ID: %d and Vendor ID: %d. Resolved IPAddr?: %@", - self.deviceName, self.productId, self.vendorId, self.ipAddresses != nil && self.ipAddresses.count > 0 ? @"YES" : @"NO"]; -} - - (instancetype _Nonnull)initWithCppCastingPlayer:(matter::casting::memory::Strong)cppCastingPlayer { if (self = [super init]) { @@ -92,6 +87,12 @@ - (instancetype _Nonnull)initWithCppCastingPlayer:(matter::casting::memory::Stro return self; } +- (NSString * _Nonnull)description +{ + return [NSString stringWithFormat:@"%@ with Product ID: %hu and Vendor ID: %hu. Resolved IPAddr?: %@", + self.deviceName, self.productId, self.vendorId, self.ipAddresses != nil && self.ipAddresses.count > 0 ? @"YES" : @"NO"]; +} + - (NSString * _Nonnull)identifier { return [NSString stringWithCString:_cppCastingPlayer->GetId() encoding:NSUTF8StringEncoding]; @@ -128,11 +129,16 @@ - (NSArray * _Nonnull)ipAddresses return ipAddresses; } -// TODO convert to Obj-C endpoints and return -/*- (NSArray * _Nonnull)endpoints +- (NSArray * _Nonnull)endpoints { - return [NSMutableArray new]; -}*/ + NSMutableArray * endpoints = [NSMutableArray new]; + const std::vector> cppEndpoints = _cppCastingPlayer->GetEndpoints(); + for (matter::casting::memory::Strong cppEndpoint : cppEndpoints) { + MCEndpoint * endpoint = [[MCEndpoint alloc] initWithCppEndpoint:cppEndpoint]; + [endpoints addObject:endpoint]; + } + return endpoints; +} - (BOOL)isEqualToMCCastingPlayer:(MCCastingPlayer * _Nullable)other { diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer_Internal.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer_Internal.h new file mode 100644 index 00000000000000..6c52733c3d6909 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCastingPlayer_Internal.h @@ -0,0 +1,33 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCastingPlayer.h" + +#import "core/CastingPlayer.h" + +#import + +#ifndef MCCastingPlayer_Internal_h +#define MCCastingPlayer_Internal_h + +@interface MCCastingPlayer () + +- (instancetype _Nonnull)initWithCppCastingPlayer:(matter::casting::memory::Strong)cppCastingPlayer; + +@end + +#endif /* MCCastingPlayer_Internal_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.h new file mode 100644 index 00000000000000..bd150b7c6ea8e5 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.h @@ -0,0 +1,36 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCommand.h" +#import "MCEndpoint.h" +#import + +#ifndef MCCluster_h +#define MCCluster_h + +@class MCEndpoint; + +@interface MCCluster : NSObject + +/** + * @brief Get the MCEndpoint corresponding to this MCCluster + */ +- (MCEndpoint * _Nonnull)endpoint; + +@end + +#endif /* MCCluster_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.mm new file mode 100644 index 00000000000000..ecb7a9175925d2 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster.mm @@ -0,0 +1,42 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCClusterObjects.h" +#import "MCCluster_Internal.h" + +#import "MCEndpoint_Internal.h" + +#import "core/Endpoint.h" + +#import + +@implementation MCCluster + +- (instancetype _Nonnull)initWithCppCluster:(matter::casting::memory::Strong)cppCluster +{ + if (self = [super init]) { + _cppCluster = cppCluster; + } + return self; +} + +- (MCEndpoint * _Nonnull)endpoint +{ + return [[MCEndpoint alloc] initWithCppEndpoint:_cppCluster->GetEndpoint().lock()]; +} + +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.h new file mode 100644 index 00000000000000..290b747702e272 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.h @@ -0,0 +1,47 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCAttributeObjects.h" +#import "MCCluster.h" +#import "MCCommandObjects.h" +#import + +#ifndef MCClusterObjects_h +#define MCClusterObjects_h + +@interface MCContentLauncherCluster : MCCluster +/** + * @brief Returns non-nil pointer to MCContentLauncherClusterLaunchURLCommand if supported, nil otherwise + */ +- (MCContentLauncherClusterLaunchURLCommand * _Nullable)launchURLCommand; +@end + +@interface MCApplicationBasicCluster : MCCluster +/** + * @brief Returns non-nil pointer to MCApplicationBasicClusterVendorIDAttribute if supported, nil otherwise + */ +- (MCApplicationBasicClusterVendorIDAttribute * _Nullable)vendorIDAttribute; +@end + +@interface MCMediaPlaybackCluster : MCCluster +/** + * @brief Returns non-nil pointer to MCMediaPlaybackClusterCurrentStateAttribute if supported, nil otherwise + */ +- (MCMediaPlaybackClusterCurrentStateAttribute * _Nullable)currentStateAttribute; +@end + +#endif /* MCClusterObjects_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.mm new file mode 100644 index 00000000000000..397dc628ffb405 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCClusterObjects.mm @@ -0,0 +1,52 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCClusterObjects.h" + +#import "MCAttribute_Internal.h" +#import "MCCluster_Internal.h" +#import "MCCommand_Internal.h" + +#include "core/Attribute.h" +#include "core/Command.h" +#include + +#import + +@implementation MCContentLauncherCluster +- (id)launchURLCommand +{ + void * cppCommand = self.cppCluster->GetCommand(chip::app::Clusters::ContentLauncher::Commands::LaunchURL::Id); + return cppCommand != nil ? [[MCContentLauncherClusterLaunchURLCommand alloc] initWithCppCommand:cppCommand] : nil; +} +@end + +@implementation MCApplicationBasicCluster +- (id)vendorIDAttribute +{ + void * cppAttribute = self.cppCluster->GetAttribute(chip::app::Clusters::ApplicationBasic::Attributes::VendorID::Id); + return cppAttribute != nil ? [[MCApplicationBasicClusterVendorIDAttribute alloc] initWithCppAttribute:cppAttribute] : nil; +} +@end + +@implementation MCMediaPlaybackCluster +- (id)currentStateAttribute +{ + void * cppAttribute = self.cppCluster->GetAttribute(chip::app::Clusters::MediaPlayback::Attributes::CurrentState::Id); + return cppAttribute != nil ? [[MCMediaPlaybackClusterCurrentStateAttribute alloc] initWithCppAttribute:cppAttribute] : nil; +} +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster_Internal.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster_Internal.h new file mode 100644 index 00000000000000..5342d5e466109f --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCluster_Internal.h @@ -0,0 +1,35 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCluster.h" + +#import "core/Endpoint.h" + +#import + +#ifndef MCCluster_Internal_h +#define MCCluster_Internal_h + +@interface MCCluster () + +@property (nonatomic, readwrite) matter::casting::memory::Strong cppCluster; + +- (instancetype _Nonnull)initWithCppCluster:(matter::casting::memory::Strong)cppCluster; + +@end + +#endif /* MCCluster_Internal_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.h new file mode 100644 index 00000000000000..634d72a75affb5 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.h @@ -0,0 +1,39 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#ifndef MCCommand_h +#define MCCommand_h + +@interface MCCommand : NSObject + +/** + * @brief Invokes this MCCommand on the associated MCEndpoint and corresponding MCCluster + * + * @param request request data corresponding to this command invocation + * @param completion Called when command execution completes with nil NSError if successful and responseData. On failure, the NSError describes the error + * @param timedInvokeTimeoutMs command timeout in ms + */ +- (void)invoke:(RequestType _Nonnull)request + context:(void * _Nullable)context + completion:(void (^_Nonnull)(void * _Nullable, NSError * _Nullable, ResponseType _Nullable))completion + timedInvokeTimeoutMs:(NSNumber * _Nullable)timedInvokeTimeoutMs; + +@end + +#endif /* MCCommand_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.mm new file mode 100644 index 00000000000000..b70945c7b022be --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand.mm @@ -0,0 +1,50 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCastingApp.h" +#import "MCCommand_Internal.h" + +#import + +@implementation MCCommand + +- (instancetype _Nonnull)initWithCppCommand:(void *)cppCommand +{ + if (self = [super init]) { + _cppCommand = cppCommand; + } + return self; +} + +- (void)invoke:(id _Nonnull)request + context:(void * _Nullable)context + completion:(void (^_Nonnull __strong)(void * _Nullable, NSError * _Nullable __strong, id _Nullable __strong))completion + timedInvokeTimeoutMs:(NSNumber * _Nullable)timedInvokeTimeoutMs +{ +} + +- (std::any)getCppRequestFromObjC:(id _Nonnull)objcRequest +{ + return nil; +} + +- (id _Nullable)getObjCResponseFromCpp:(std::any)cppResponse +{ + return nil; +} + +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.h new file mode 100644 index 00000000000000..c600d151febf1f --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.h @@ -0,0 +1,60 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCommand.h" +#import + +#ifndef MCCommandObjects_h +#define MCCommandObjects_h + +@interface MCContentLauncherClusterDimensionStruct : NSObject +@property (nonatomic, copy) NSNumber * _Nonnull width; +@property (nonatomic, copy) NSNumber * _Nonnull height; +@property (nonatomic, copy) NSNumber * _Nonnull metric; +@end + +@interface MCContentLauncherClusterStyleInformationStruct : NSObject +@property (nonatomic, copy) NSString * _Nullable imageURL; +@property (nonatomic, copy) NSString * _Nullable imageUrl; +@property (nonatomic, copy) NSString * _Nullable color; +@property (nonatomic, copy) MCContentLauncherClusterDimensionStruct * _Nullable size; +@end + +@interface MCContentLauncherClusterBrandingInformationStruct : NSObject +@property (nonatomic, copy) NSString * _Nonnull providerName; +@property (nonatomic, copy) MCContentLauncherClusterStyleInformationStruct * _Nullable background; +@property (nonatomic, copy) MCContentLauncherClusterStyleInformationStruct * _Nullable logo; +@property (nonatomic, copy) MCContentLauncherClusterStyleInformationStruct * _Nullable progressBar; +@property (nonatomic, copy) MCContentLauncherClusterStyleInformationStruct * _Nullable splash; +@property (nonatomic, copy) MCContentLauncherClusterStyleInformationStruct * _Nullable waterMark; +@end + +@interface MCContentLauncherClusterLaunchURLRequest : NSObject +@property (nonatomic, copy) NSString * _Nonnull contentURL; +@property (nonatomic, copy) NSString * _Nullable displayString; +@property (nonatomic, copy) MCContentLauncherClusterBrandingInformationStruct * _Nullable brandingInformation; +@end + +@interface MCContentLauncherClusterLauncherResponse : NSObject +@property (nonatomic, copy) NSNumber * _Nonnull status; +@property (nonatomic, copy) NSString * _Nullable data; +@end + +@interface MCContentLauncherClusterLaunchURLCommand : MCCommand +@end + +#endif /* MCCommandObjects_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.mm new file mode 100644 index 00000000000000..8c37d0911668fb --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommandObjects.mm @@ -0,0 +1,132 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCommandObjects.h" + +#import "MCCastingApp.h" +#import "MCCommand_Internal.h" +#import "MCErrorUtils.h" + +#include "core/Command.h" +#include + +#import + +@implementation MCContentLauncherClusterLaunchURLRequest + +- (instancetype)init +{ + if (self = [super init]) { + _contentURL = @""; + _displayString = nil; + _brandingInformation = nil; + } + return self; +} + +- (id)copyWithZone:(NSZone * _Nullable)zone; +{ + auto other = [[MCContentLauncherClusterLaunchURLRequest alloc] init]; + other.contentURL = self.contentURL; + other.displayString = self.displayString; + other.brandingInformation = self.brandingInformation; + return other; +} + +- (NSString *)description +{ + NSString * descriptionString = [NSString stringWithFormat:@"<%@: contentURL:%@; displayString:%@; brandingInformation:%@; >", NSStringFromClass([self class]), _contentURL, _displayString, _brandingInformation]; + return descriptionString; +} +@end + +@implementation MCContentLauncherClusterLauncherResponse + +- (instancetype)init +{ + if (self = [super init]) { + _status = @(0); + _data = nil; + } + return self; +} + +- (id)copyWithZone:(NSZone * _Nullable)zone; +{ + auto other = [[MCContentLauncherClusterLauncherResponse alloc] init]; + + other.status = self.status; + other.data = self.data; + return other; +} + +- (instancetype)initWithDecodableStruct:(const chip::app::Clusters::ContentLauncher::Commands::LauncherResponse::DecodableType &)decodableStruct +{ + if (self = [super init]) { + _status = [NSNumber numberWithUnsignedChar:chip::to_underlying(decodableStruct.status)]; + _data = [[NSString alloc] initWithBytes:decodableStruct.data.Value().data() length:decodableStruct.data.Value().size() encoding:NSUTF8StringEncoding]; + } + return self; +} + +@end + +@implementation MCContentLauncherClusterLaunchURLCommand + +- (void)invoke:(id)request + context:(void * _Nullable)context + completion:(void (^_Nonnull __strong)(void *, NSError *, id))completion + timedInvokeTimeoutMs:(NSNumber * _Nullable)timedInvokeTimeoutMs +{ + MCCommandTemplate * mcCommand = new MCCommandTemplate( + self.cppCommand, + [self](id objCRequest) { + return [self getCppRequestFromObjC:objCRequest]; + }, + [self](std::any cppResponse) { + return [self getObjCResponseFromCpp:cppResponse]; + }); + mcCommand->invoke( + request, context, [mcCommand, completion](void * context, NSError * err, id response) { + completion(context, err, response); + delete mcCommand; + }, timedInvokeTimeoutMs); +} + +- (std::any)getCppRequestFromObjC:(MCContentLauncherClusterLaunchURLRequest *)objcRequest +{ + VerifyOrReturnValue(objcRequest != nil, nullptr); + + std::shared_ptr cppRequest = std::make_shared(); + cppRequest->contentURL = chip::CharSpan([objcRequest.contentURL UTF8String], [objcRequest.contentURL lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); + if (objcRequest.displayString != nil) { + cppRequest->displayString = chip::Optional(chip::CharSpan([objcRequest.displayString UTF8String], [objcRequest.displayString lengthOfBytesUsingEncoding:NSUTF8StringEncoding])); + } + cppRequest->brandingInformation = chip::MakeOptional(chip::app::Clusters::ContentLauncher::Structs::BrandingInformationStruct::Type()); // TODO: map brandingInformation + return std::any(cppRequest); +} + +- (id)getObjCResponseFromCpp:(std::any)cppResponse +{ + MCContentLauncherClusterLauncherResponse * objCResponse = nil; + if (cppResponse.type() == typeid(std::shared_ptr)) { + std::shared_ptr responseSharedPtr = std::any_cast>(cppResponse); + objCResponse = responseSharedPtr != nil ? [[MCContentLauncherClusterLauncherResponse alloc] initWithDecodableStruct:*responseSharedPtr] : nil; + } + return objCResponse; +} +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand_Internal.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand_Internal.h new file mode 100644 index 00000000000000..384004467fef30 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCCommand_Internal.h @@ -0,0 +1,98 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCommand.h" + +#import "MCCastingApp.h" +#import "MCErrorUtils.h" +#include "core/Command.h" +#include + +#import +#include +#include +#include + +#ifndef MCCommand_Internal_h +#define MCCommand_Internal_h + +@interface MCCommand () + +@property (nonatomic, readwrite) void * _Nonnull cppCommand; + +- (instancetype _Nonnull)initWithCppCommand:(void * _Nonnull)cppCommand; + +- (std::any)getCppRequestFromObjC:(id _Nonnull)objcRequest; + +- (id _Nullable)getObjCResponseFromCpp:(std::any)cppResponse; +@end + +template +class MCCommandTemplate { +public: + MCCommandTemplate(void * _Nonnull cppCommand, + std::function getCppRequestFromObjCFn, + std::function getObjCResponseFromCppFn) + { + mCppCommand = cppCommand; + mGetCppRequestFromObjCFn = getCppRequestFromObjCFn; + mGetObjCResponseFromCppFn = getObjCResponseFromCppFn; + } + + void invoke(id _Nonnull request, void * _Nullable context, std::function completion, NSNumber * _Nullable timedInvokeTimeoutMs) + { + dispatch_queue_t workQueue = [[MCCastingApp getSharedInstance] getWorkQueue], clientQueue = [[MCCastingApp getSharedInstance] getClientQueue]; + dispatch_sync(workQueue, ^{ + ChipLogProgress(AppServer, " converting 'request' from ObjC to Cpp"); + std::shared_ptr cppRequest = nil; + std::any anyRequest = mGetCppRequestFromObjCFn(request); + if (anyRequest.type() == typeid(std::shared_ptr)) { + cppRequest = std::any_cast>(anyRequest); + } + if (cppRequest == nil) { + dispatch_async(clientQueue, ^{ + completion(context, [MCErrorUtils NSErrorFromChipError:CHIP_ERROR_INVALID_ARGUMENT], nil); + }); + return; + } + + matter::casting::core::Command * command = static_cast *>(mCppCommand); + command->Invoke( + *cppRequest, context, + [clientQueue, completion, this](void * context, const typename Type::ResponseType & response) { + ChipLogProgress(AppServer, " converting 'response' from Cpp to ObjC"); + id objCResponse = mGetObjCResponseFromCppFn(std::any(std::make_shared(response))); + dispatch_async(clientQueue, ^{ + completion(context, nil, objCResponse); + }); + }, + [clientQueue, completion](void * context, CHIP_ERROR err) { + dispatch_async(clientQueue, ^{ + completion(context, [MCErrorUtils NSErrorFromChipError:err], nil); + }); + }, + timedInvokeTimeoutMs != nil ? chip::MakeOptional(timedInvokeTimeoutMs.intValue) : chip::NullOptional); + }); + } + +private: + void * _Nonnull mCppCommand; + std::function mGetCppRequestFromObjCFn; + std::function mGetObjCResponseFromCppFn; +}; + +#endif /* MCCommand_Internal_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.h new file mode 100644 index 00000000000000..e893f65ecbf7a5 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.h @@ -0,0 +1,33 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#ifndef MCDeviceTypeStruct_h +#define MCDeviceTypeStruct_h + +@interface MCDeviceTypeStruct : NSObject + +@property (nonatomic, strong, readonly) NSNumber * _Nonnull deviceType; + +@property (nonatomic, strong, readonly) NSNumber * _Nonnull revision; + +- (instancetype _Nonnull)initWithDeviceType:(uint32_t)deviceType revision:(uint16_t)revision; + +@end + +#endif /* MCDeviceTypeStruct_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.m b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.m new file mode 100644 index 00000000000000..d50e81a83f09e1 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCDeviceTypeStruct.m @@ -0,0 +1,31 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCDeviceTypeStruct.h" + +@implementation MCDeviceTypeStruct + +- (instancetype _Nonnull)initWithDeviceType:(uint32_t)deviceType revision:(uint16_t)revision +{ + if (self = [super init]) { + _deviceType = [NSNumber numberWithUnsignedInt:deviceType]; + _revision = [NSNumber numberWithUnsignedShort:revision]; + } + return self; +} + +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.h new file mode 100644 index 00000000000000..d252bd3c92f3e1 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.h @@ -0,0 +1,46 @@ +/** + * + * Copyright (c) 2020-2023 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCCastingPlayer.h" +#import "MCCluster.h" +#import "MCEndpointClusterType.h" + +#import + +#ifndef MCEndpoint_h +#define MCEndpoint_h + +@class MCCastingPlayer; +@class MCCluster; + +@interface MCEndpoint : NSObject + +- (NSNumber * _Nonnull)identifier; +- (NSNumber * _Nonnull)vendorId; +- (NSNumber * _Nonnull)productId; +- (NSArray * _Nonnull)deviceTypeList; +- (MCCastingPlayer * _Nonnull)castingPlayer; + +- (nonnull instancetype)init UNAVAILABLE_ATTRIBUTE; ++ (nonnull instancetype)new UNAVAILABLE_ATTRIBUTE; + +- (BOOL)hasCluster:(MCEndpointClusterType)type; +- (MCCluster * _Nullable)clusterForType:(MCEndpointClusterType)type; + +@end + +#endif /* MCEndpoint_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.mm b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.mm new file mode 100644 index 00000000000000..006488aed03eb5 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint.mm @@ -0,0 +1,133 @@ +/** + * + * Copyright (c) 2023 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCEndpoint_Internal.h" + +#import "MCCastingPlayer_Internal.h" +#import "MCCluster_Internal.h" +#import "MCDeviceTypeStruct.h" + +#import "MCClusterObjects.h" + +#import "clusters/Clusters.h" +#import "core/Endpoint.h" + +#import + +@interface MCEndpoint () + +@property (nonatomic, readwrite) matter::casting::memory::Strong cppEndpoint; + +@end + +@implementation MCEndpoint + +- (instancetype _Nonnull)initWithCppEndpoint:(matter::casting::memory::Strong)cppEndpoint +{ + if (self = [super init]) { + _cppEndpoint = cppEndpoint; + } + return self; +} + +- (NSNumber * _Nonnull)identifier +{ + return [NSNumber numberWithUnsignedShort:_cppEndpoint->GetId()]; +} + +- (NSNumber * _Nonnull)productId +{ + return [NSNumber numberWithUnsignedShort:_cppEndpoint->GetProductId()]; +} + +- (NSNumber * _Nonnull)vendorId +{ + return [NSNumber numberWithUnsignedShort:_cppEndpoint->GetVendorId()]; +} + +- (NSArray * _Nonnull)deviceTypeList +{ + NSMutableArray * deviceTypeList = [NSMutableArray new]; + std::vector cppDeviceTypeList = _cppEndpoint->GetDeviceTypeList(); + for (chip::app::Clusters::Descriptor::Structs::DeviceTypeStruct::DecodableType cppDeviceTypeStruct : cppDeviceTypeList) { + MCDeviceTypeStruct * deviceTypeStruct = [[MCDeviceTypeStruct alloc] initWithDeviceType:cppDeviceTypeStruct.deviceType revision:cppDeviceTypeStruct.revision]; + [deviceTypeList addObject:deviceTypeStruct]; + } + return deviceTypeList; +} + +- (MCCastingPlayer * _Nonnull)castingPlayer +{ + return [[MCCastingPlayer alloc] initWithCppCastingPlayer:std::shared_ptr(_cppEndpoint->GetCastingPlayer())]; +} + +- (MCCluster * _Nullable)clusterForType:(MCEndpointClusterType)type +{ + switch (type) { + case MCEndpointClusterTypeContentLauncher: + return [[MCContentLauncherCluster alloc] initWithCppCluster:_cppEndpoint->GetCluster()]; + + case MCEndpointClusterTypeApplicationBasic: + return [[MCApplicationBasicCluster alloc] initWithCppCluster:_cppEndpoint->GetCluster()]; + + case MCEndpointClusterTypeMediaPlayback: + return [[MCMediaPlaybackCluster alloc] initWithCppCluster:_cppEndpoint->GetCluster()]; + + default: + ChipLogError(AppServer, "MCEndpointClusterType not found"); + break; + } + return nil; +} + +- (BOOL)hasCluster:(MCEndpointClusterType)type +{ + return [self clusterForType:type] != nil; +} + +- (BOOL)isEqualToMCEndpoint:(MCEndpoint * _Nullable)other +{ + return [self.identifier isEqualToNumber:other.identifier]; +} + +- (BOOL)isEqual:(id _Nullable)other +{ + if (other == nil) { + return NO; + } + + if (self == other) { + return YES; + } + + if (![other isKindOfClass:[MCEndpoint class]]) { + return NO; + } + + return [self isEqualToMCEndpoint:(MCEndpoint *) other]; +} + +- (NSUInteger)hash +{ + const NSUInteger prime = 31; + NSUInteger result = 1; + + result = prime * result + [self.identifier hash]; + + return result; +} +@end diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpointClusterType.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpointClusterType.h new file mode 100644 index 00000000000000..7137dd1ed96042 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpointClusterType.h @@ -0,0 +1,28 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MCEndpointClusterType_h +#define MCEndpointClusterType_h + +typedef enum _MCEndpointClusterType +{ + MCEndpointClusterTypeApplicationBasic, + MCEndpointClusterTypeContentLauncher, + MCEndpointClusterTypeMediaPlayback +} MCEndpointClusterType; + +#endif /* MCEndpointClusterType_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint_Internal.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint_Internal.h new file mode 100644 index 00000000000000..53b1d6bf22218e --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCEndpoint_Internal.h @@ -0,0 +1,33 @@ +/** + * + * Copyright (c) 2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "MCEndpoint.h" + +#import "core/Endpoint.h" + +#import + +#ifndef MCEndpoint_Internal_h +#define MCEndpoint_Internal_h + +@interface MCEndpoint () + +- (instancetype _Nonnull)initWithCppEndpoint:(matter::casting::memory::Strong)cppEndpoint; + +@end + +#endif /* MCEndpoint_Internal_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCObserver.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCObserver.h new file mode 100644 index 00000000000000..a1ca48f8b87616 --- /dev/null +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MCObserver.h @@ -0,0 +1,29 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#ifndef MCObserver_h +#define MCObserver_h + +@protocol MCObserver + +- (void)attribute:(NSObject * _Nonnull)sender valueDidChange:(NSValue * _Nullable)value oldValue:(NSValue * _Nullable)oldValue; + +@end + +#endif /* MCObserver_h */ diff --git a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MatterTvCastingBridge.h b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MatterTvCastingBridge.h index 9329bc657b9c32..093f02b9455b0d 100644 --- a/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MatterTvCastingBridge.h +++ b/examples/tv-casting-app/darwin/MatterTvCastingBridge/MatterTvCastingBridge/MatterTvCastingBridge.h @@ -26,11 +26,19 @@ FOUNDATION_EXPORT const unsigned char MatterTvCastingBridgeVersionString[]; #import "CastingServerBridge.h" // Add simplified casting API headers here +#import "MCAttribute.h" +#import "MCAttributeObjects.h" #import "MCCastingApp.h" #import "MCCastingPlayer.h" #import "MCCastingPlayerDiscovery.h" +#import "MCCluster.h" +#import "MCClusterObjects.h" +#import "MCCommand.h" +#import "MCCommandObjects.h" #import "MCCommissionableData.h" #import "MCCryptoUtils.h" #import "MCDataSource.h" #import "MCDeviceAttestationCredentials.h" +#import "MCEndpointClusterType.h" #import "MCEndpointFilter.h" +#import "MCObserver.h" diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/project.pbxproj b/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/project.pbxproj index 1fd70f6b3f48fb..e7005121a06352 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/project.pbxproj +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 3C40586E2B632DC500C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C40586D2B632DC500C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleView.swift */; }; + 3C4058702B632DDB00C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C40586F2B632DDB00C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift */; }; + 3C4F52302B51F32000BB8A10 /* MCContentLauncherLaunchURLExampleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4F522F2B51F32000BB8A10 /* MCContentLauncherLaunchURLExampleViewModel.swift */; }; + 3C4F52322B5721D000BB8A10 /* MCContentLauncherLaunchURLExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C4F52312B5721D000BB8A10 /* MCContentLauncherLaunchURLExampleView.swift */; }; + 3C621CB12B6078A9005CDBA3 /* MCApplicationBasicReadVendorIDExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C621CB02B6078A9005CDBA3 /* MCApplicationBasicReadVendorIDExampleView.swift */; }; + 3C621CB32B6078B7005CDBA3 /* MCApplicationBasicReadVendorIDExampleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C621CB22B6078B7005CDBA3 /* MCApplicationBasicReadVendorIDExampleViewModel.swift */; }; + 3C621CB52B607FFD005CDBA3 /* MCActionSelectorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C621CB42B607FFD005CDBA3 /* MCActionSelectorView.swift */; }; 3C69204A2AA1368F00D0F613 /* MCInitializationExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6920492AA1368F00D0F613 /* MCInitializationExample.swift */; }; 3C81C75328F8C79E001CB9D1 /* StartFromCacheView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C81C75228F8C79E001CB9D1 /* StartFromCacheView.swift */; }; 3C81C75528F8C7B6001CB9D1 /* StartFromCacheViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C81C75428F8C7B6001CB9D1 /* StartFromCacheViewModel.swift */; }; @@ -51,6 +58,13 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 3C40586D2B632DC500C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCMediaPlaybackSubscribeToCurrentStateExampleView.swift; sourceTree = ""; }; + 3C40586F2B632DDB00C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift; sourceTree = ""; }; + 3C4F522F2B51F32000BB8A10 /* MCContentLauncherLaunchURLExampleViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCContentLauncherLaunchURLExampleViewModel.swift; sourceTree = ""; }; + 3C4F52312B5721D000BB8A10 /* MCContentLauncherLaunchURLExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCContentLauncherLaunchURLExampleView.swift; sourceTree = ""; }; + 3C621CB02B6078A9005CDBA3 /* MCApplicationBasicReadVendorIDExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCApplicationBasicReadVendorIDExampleView.swift; sourceTree = ""; }; + 3C621CB22B6078B7005CDBA3 /* MCApplicationBasicReadVendorIDExampleViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCApplicationBasicReadVendorIDExampleViewModel.swift; sourceTree = ""; }; + 3C621CB42B607FFD005CDBA3 /* MCActionSelectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCActionSelectorView.swift; sourceTree = ""; }; 3C6920492AA1368F00D0F613 /* MCInitializationExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCInitializationExample.swift; sourceTree = ""; }; 3C75075E284C1DF800D7DB3A /* TvCasting.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TvCasting.entitlements; sourceTree = ""; }; 3C7507AC285299DF00D7DB3A /* CommissionerDiscoveryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommissionerDiscoveryView.swift; sourceTree = ""; }; @@ -131,6 +145,13 @@ 3C94377C2B364D380096E5F4 /* MCDiscoveryExampleViewModel.swift */, 3C94378F2B3B3FF90096E5F4 /* MCConnectionExampleView.swift */, 3C94377E2B364D510096E5F4 /* MCConnectionExampleViewModel.swift */, + 3C621CB42B607FFD005CDBA3 /* MCActionSelectorView.swift */, + 3C4F52312B5721D000BB8A10 /* MCContentLauncherLaunchURLExampleView.swift */, + 3C4F522F2B51F32000BB8A10 /* MCContentLauncherLaunchURLExampleViewModel.swift */, + 3C621CB02B6078A9005CDBA3 /* MCApplicationBasicReadVendorIDExampleView.swift */, + 3C621CB22B6078B7005CDBA3 /* MCApplicationBasicReadVendorIDExampleViewModel.swift */, + 3C40586D2B632DC500C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleView.swift */, + 3C40586F2B632DDB00C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift */, EAF14298296D561900E17793 /* CertTestView.swift */, EAF1429A296D57DF00E17793 /* CertTestViewModel.swift */, 3CC0E8FB2841DD3400EC6A18 /* ContentView.swift */, @@ -248,9 +269,14 @@ files = ( 3C81C75328F8C79E001CB9D1 /* StartFromCacheView.swift in Sources */, 3C94377F2B364D510096E5F4 /* MCConnectionExampleViewModel.swift in Sources */, + 3C4058702B632DDB00C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift in Sources */, 3C81C75528F8C7B6001CB9D1 /* StartFromCacheViewModel.swift in Sources */, 3CCB8745286A5D0F00771BAD /* CommissionerDiscoveryView.swift in Sources */, + 3C621CB12B6078A9005CDBA3 /* MCApplicationBasicReadVendorIDExampleView.swift in Sources */, 3CCB8746286A5D0F00771BAD /* CommissionerDiscoveryViewModel.swift in Sources */, + 3C4F52302B51F32000BB8A10 /* MCContentLauncherLaunchURLExampleViewModel.swift in Sources */, + 3C621CB32B6078B7005CDBA3 /* MCApplicationBasicReadVendorIDExampleViewModel.swift in Sources */, + 3C621CB52B607FFD005CDBA3 /* MCActionSelectorView.swift in Sources */, 3C81C75928F8E42D001CB9D1 /* ConnectionViewModel.swift in Sources */, 3CA1CA7A28E281080023ED44 /* ClusterSelectorView.swift in Sources */, 3C94378E2B3B3CB00096E5F4 /* MCDiscoveryExampleView.swift in Sources */, @@ -259,6 +285,7 @@ 3C94377D2B364D380096E5F4 /* MCDiscoveryExampleViewModel.swift in Sources */, 3CCB8747286A5D0F00771BAD /* CommissioningView.swift in Sources */, 3CCB8748286A5D0F00771BAD /* CommissioningViewModel.swift in Sources */, + 3C4F52322B5721D000BB8A10 /* MCContentLauncherLaunchURLExampleView.swift in Sources */, 3CAC955B29BA948700BEA5C3 /* ExampleDAC.swift in Sources */, 3CA1CA7E28E284950023ED44 /* MediaPlaybackViewModel.swift in Sources */, 3CCB8749286A5D0F00771BAD /* ContentLauncherView.swift in Sources */, @@ -268,6 +295,7 @@ 3CC0E8FC2841DD3400EC6A18 /* ContentView.swift in Sources */, 3CA1CA7C28E282150023ED44 /* MediaPlaybackView.swift in Sources */, 3CC0E8FA2841DD3400EC6A18 /* TvCastingApp.swift in Sources */, + 3C40586E2B632DC500C7C6D6 /* MCMediaPlaybackSubscribeToCurrentStateExampleView.swift in Sources */, 3C9437902B3B3FF90096E5F4 /* MCConnectionExampleView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting Release.xcscheme b/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting Release.xcscheme index 05333fbe6fe932..e769afbac5e4a5 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting Release.xcscheme +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting Release.xcscheme @@ -53,7 +53,7 @@ diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting.xcscheme b/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting.xcscheme index 2bdbabd75539cb..c64d5160489c18 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting.xcscheme +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting.xcodeproj/xcshareddata/xcschemes/TvCasting.xcscheme @@ -53,7 +53,7 @@ diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCActionSelectorView.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCActionSelectorView.swift new file mode 100644 index 00000000000000..1ddc8d9539f554 --- /dev/null +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCActionSelectorView.swift @@ -0,0 +1,72 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import SwiftUI + +struct MCActionSelectorView: View { + var selectedCastingPlayer: MCCastingPlayer? + + init(_selectedCastingPlayer: MCCastingPlayer?) { + self.selectedCastingPlayer = _selectedCastingPlayer + } + + var body: some View { + VStack(alignment: .leading) { + NavigationLink( + destination: MCContentLauncherLaunchURLExampleView(_selectedCastingPlayer: self.selectedCastingPlayer), + label: { + Text("ContentLauncher Launch URL") + .frame(width: 300, height: 30, alignment: .center) + .border(Color.black, width: 1) + } + ).background(Color.blue) + .foregroundColor(Color.white) + .padding() + + NavigationLink( + destination: MCApplicationBasicReadVendorIDExampleView(_selectedCastingPlayer: self.selectedCastingPlayer), + label: { + Text("ApplicationBasic Read VendorID") + .frame(width: 300, height: 30, alignment: .center) + .border(Color.black, width: 1) + } + ).background(Color.blue) + .foregroundColor(Color.white) + .padding() + + NavigationLink( + destination: MCMediaPlaybackSubscribeToCurrentStateExampleView(_selectedCastingPlayer: self.selectedCastingPlayer), + label: { + Text("MediaPlayback Subscribe to CurrentState") + .frame(width: 300, height: 30, alignment: .center) + .border(Color.black, width: 1) + } + ).background(Color.blue) + .foregroundColor(Color.white) + .padding() + + } + .navigationTitle("Select an action") + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .top) + } +} + +struct MCActionSelectorView_Previews: PreviewProvider { + static var previews: some View { + MCActionSelectorView(_selectedCastingPlayer: nil) + } +} diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleView.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleView.swift new file mode 100644 index 00000000000000..7a84abf1ab0ce4 --- /dev/null +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleView.swift @@ -0,0 +1,52 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import SwiftUI + +struct MCApplicationBasicReadVendorIDExampleView: View { + @StateObject var viewModel = MCApplicationBasicReadVendorIDExampleViewModel() + + var selectedCastingPlayer: MCCastingPlayer? + + init(_selectedCastingPlayer: MCCastingPlayer?) { + self.selectedCastingPlayer = _selectedCastingPlayer + } + + var body: some View { + VStack(alignment: .leading) + { + Button("Read VendorID!") { + viewModel.read(castingPlayer: self.selectedCastingPlayer!) + } + .background(Color.blue) + .foregroundColor(Color.white) + .cornerRadius(4) + .border(Color.black, width: 1) + .padding() + + Text(viewModel.status ?? "") + } + .navigationTitle("ApplicationBasic Read VendorID") + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .top) + } +} + +struct MCApplicationBasicReadVendorIDExampleView_Previews: PreviewProvider { + static var previews: some View { + MCApplicationBasicReadVendorIDExampleView(_selectedCastingPlayer: nil) + } +} diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleViewModel.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleViewModel.swift new file mode 100644 index 00000000000000..32e20e4b324ca3 --- /dev/null +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCApplicationBasicReadVendorIDExampleViewModel.swift @@ -0,0 +1,96 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import Foundation +import os.log + +class MCApplicationBasicReadVendorIDExampleViewModel: ObservableObject { + let Log = Logger(subsystem: "com.matter.casting", + category: "MCApplicationBasicReadVendorIDExampleViewModel") + + @Published var status: String?; + + // VendorId of the MCEndpoint on the MCCastingPlayer that the MCCastingApp desires to interact with after connection + let sampleEndpointVid: Int = 65521 + + func read(castingPlayer: MCCastingPlayer) + { + // select the MCEndpoint on the MCCastingPlayer to invoke the command on + if let endpoint: MCEndpoint = castingPlayer.endpoints().filter({ $0.vendorId().intValue == sampleEndpointVid}).first + { + // validate that the selected endpoint supports the ApplicationBasic cluster + if(!endpoint.hasCluster(MCEndpointClusterTypeApplicationBasic)) + { + self.Log.error("No ApplicationBasic cluster supporting endpoint found") + DispatchQueue.main.async + { + self.status = "No ApplicationBasic cluster supporting endpoint found" + } + return + } + + // get ApplicationBasic cluster from the endpoint + let applicationBasiccluster: MCApplicationBasicCluster = endpoint.cluster(for: MCEndpointClusterTypeApplicationBasic) as! MCApplicationBasicCluster + + // get the vendorIDAttribute from the applicationBasiccluster + let vendorIDAttribute: MCApplicationBasicClusterVendorIDAttribute? = applicationBasiccluster.vendorIDAttribute() + if(vendorIDAttribute == nil) + { + self.Log.error("VendorID attribute not supported on cluster") + DispatchQueue.main.async + { + self.status = "VendorID attribute not supported on cluster" + } + return + } + + + // call read on vendorIDAttribute and pass in a completion block + vendorIDAttribute!.read(nil) { context, before, after, err in + DispatchQueue.main.async + { + if(err != nil) + { + self.Log.error("Error when reading VendorID value \(String(describing: err))") + self.status = "Error when reading VendorID value \(String(describing: err))" + return + } + + if(before != nil) + { + self.Log.info("Read VendorID value: \(String(describing: after)) Before: \(String(describing: before))") + self.status = "Read VendorID value: \(String(describing: after)) Before: \(String(describing: before))" + } + else + { + self.Log.info("Read VendorID value: \(String(describing: after))") + self.status = "Read VendorID value: \(String(describing: after))" + } + } + } + } + else + { + self.Log.error("No endpoint matching the example VID found") + DispatchQueue.main.async + { + self.status = "No endpoint matching the example VID found" + } + } + } +} diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleView.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleView.swift index 0dd6d302f7b968..87448bf46b4790 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleView.swift +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleView.swift @@ -39,9 +39,8 @@ struct MCConnectionExampleView: View { if(connectionSuccess) { - /* TODO add this back in - NavigationLink( - destination: ClusterSelectorView(), + NavigationLink( + destination: MCActionSelectorView(_selectedCastingPlayer: self.selectedCastingPlayer), label: { Text("Next") .frame(width: 100, height: 30, alignment: .center) @@ -50,7 +49,7 @@ struct MCConnectionExampleView: View { ).background(Color.blue) .foregroundColor(Color.white) .frame(maxHeight: .infinity, alignment: .bottom) - .padding()*/ + .padding() } } } diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleViewModel.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleViewModel.swift index 9d130b5e7737ee..13cdad3d8e60f1 100644 --- a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleViewModel.swift +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCConnectionExampleViewModel.swift @@ -35,15 +35,18 @@ class MCConnectionExampleViewModel: ObservableObject { desiredEndpointFilter.vendorId = kDesiredEndpointVendorId selectedCastingPlayer?.verifyOrEstablishConnection(completionBlock: { err in self.Log.error("MCConnectionExampleViewModel connect() completed with \(err)") - if(err == nil) + DispatchQueue.main.async { - self.connectionSuccess = true - self.connectionStatus = "Connected!" - } - else - { - self.connectionSuccess = false - self.connectionStatus = "Connection failed with \(String(describing: err))" + if(err == nil) + { + self.connectionSuccess = true + self.connectionStatus = "Connected!" + } + else + { + self.connectionSuccess = false + self.connectionStatus = "Connection failed with \(String(describing: err))" + } } }, desiredEndpointFilter: desiredEndpointFilter) } diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleView.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleView.swift new file mode 100644 index 00000000000000..520ea86804e765 --- /dev/null +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleView.swift @@ -0,0 +1,79 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import SwiftUI + +struct MCContentLauncherLaunchURLExampleView : View { + @StateObject var viewModel = MCContentLauncherLaunchURLExampleViewModel() + + var selectedCastingPlayer: MCCastingPlayer? + + @State private var contentUrl: String = "" + @State private var displayString: String = "" + + init(_selectedCastingPlayer: MCCastingPlayer?) { + self.selectedCastingPlayer = _selectedCastingPlayer + } + + var body: some View { + VStack(alignment: .leading) { + + HStack() { + Text("Content URL") + + TextField( + "https://www.test.com/videoid", + text: $contentUrl + ) + .textInputAutocapitalization(.never) + .disableAutocorrection(true) + .border(.secondary) + } + + HStack() { + Text("Display string") + + TextField( + "Test video", + text: $displayString + ) + .textInputAutocapitalization(.never) + .disableAutocorrection(true) + .border(.secondary) + } + + Button("Invoke Launch URL!") { + viewModel.invokeCommand(castingPlayer: self.selectedCastingPlayer!, contentUrl: contentUrl, displayString: displayString) + } + .background(Color.blue) + .foregroundColor(Color.white) + .cornerRadius(4) + .border(Color.black, width: 1) + .padding() + + Text(viewModel.status ?? "") + } + .navigationTitle("Content Launcher Launch URL") + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .top) + } +} + +struct MCCommandInvocationExampleView_Previews: PreviewProvider { + static var previews: some View { + MCContentLauncherLaunchURLExampleView(_selectedCastingPlayer: nil) + } +} diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift new file mode 100644 index 00000000000000..b74a91a77b7286 --- /dev/null +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCContentLauncherLaunchURLExampleViewModel.swift @@ -0,0 +1,94 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import Foundation +import os.log + +class MCContentLauncherLaunchURLExampleViewModel: ObservableObject { + let Log = Logger(subsystem: "com.matter.casting", + category: "MCContentLauncherLaunchURLExampleViewModel") + + @Published var status: String?; + + // VendorId of the MCEndpoint on the MCCastingPlayer that the MCCastingApp desires to interact with after connection + let sampleEndpointVid: Int = 65521 + + func invokeCommand(castingPlayer: MCCastingPlayer, contentUrl: String, displayString: String) + { + // select the MCEndpoint on the MCCastingPlayer to invoke the command on + if let endpoint: MCEndpoint = castingPlayer.endpoints().filter({ $0.vendorId().intValue == sampleEndpointVid}).first + { + // validate that the selected endpoint supports the ContentLauncher cluster + if(!endpoint.hasCluster(MCEndpointClusterTypeContentLauncher)) + { + self.Log.error("No ContentLauncher cluster supporting endpoint found") + DispatchQueue.main.async + { + self.status = "No ContentLauncher cluster supporting endpoint found" + } + return + } + + // get ContentLauncher cluster from the endpoint + let contentLaunchercluster: MCContentLauncherCluster = endpoint.cluster(for: MCEndpointClusterTypeContentLauncher) as! MCContentLauncherCluster + + // get the launchURLCommand from the contentLauncherCluster + let launchURLCommand: MCContentLauncherClusterLaunchURLCommand? = contentLaunchercluster.launchURLCommand() + if(launchURLCommand == nil) + { + self.Log.error("LaunchURL not supported on cluster") + DispatchQueue.main.async + { + self.status = "LaunchURL not supported on cluster" + } + return + } + + // create the LaunchURL request + let request: MCContentLauncherClusterLaunchURLRequest = MCContentLauncherClusterLaunchURLRequest() + request.contentURL = contentUrl + request.displayString = displayString + + // call invoke on launchURLCommand while passing in a completion block + launchURLCommand!.invoke(request, context: nil, completion: { context, err, response in + DispatchQueue.main.async + { + if(err == nil) + { + self.Log.info("LaunchURLCommand invoke completion success with \(String(describing: response))") + self.status = "Success. Response data: \(String(describing: response?.data))" + } + else + { + self.Log.error("LaunchURLCommand invoke completion failure with \(String(describing: err))") + self.status = "Failure: \(String(describing: err))" + } + } + }, + timedInvokeTimeoutMs: 5000) // time out after 5000ms + } + else + { + self.Log.error("No endpoint matching the example VID found") + DispatchQueue.main.async + { + self.status = "No endpoint matching the example VID found" + } + } + } +} diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleView.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleView.swift new file mode 100644 index 00000000000000..f99ea71cd0875b --- /dev/null +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleView.swift @@ -0,0 +1,52 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import SwiftUI + +struct MCMediaPlaybackSubscribeToCurrentStateExampleView: View { + @StateObject var viewModel = MCMediaPlaybackSubscribeToCurrentStateExampleViewModel() + + var selectedCastingPlayer: MCCastingPlayer? + + init(_selectedCastingPlayer: MCCastingPlayer?) { + self.selectedCastingPlayer = _selectedCastingPlayer + } + + var body: some View { + VStack(alignment: .leading) + { + Button("Subscribe to CurrentState!") { + viewModel.subscribe(castingPlayer: self.selectedCastingPlayer!) + } + .background(Color.blue) + .foregroundColor(Color.white) + .cornerRadius(4) + .border(Color.black, width: 1) + .padding() + + Text(viewModel.status ?? "") + } + .navigationTitle("MediaPlayback Subscribe to CurrentState") + .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .top) + } +} + +struct MCMediaPlaybackSubscribeToCurrentStateExampleView_Previews: PreviewProvider { + static var previews: some View { + MCMediaPlaybackSubscribeToCurrentStateExampleView(_selectedCastingPlayer: nil) + } +} diff --git a/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift new file mode 100644 index 00000000000000..5d30f096052a84 --- /dev/null +++ b/examples/tv-casting-app/darwin/TvCasting/TvCasting/MCMediaPlaybackSubscribeToCurrentStateExampleViewModel.swift @@ -0,0 +1,99 @@ +/** + * + * Copyright (c) 2020-2024 Project CHIP Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import Foundation +import os.log + +class MCMediaPlaybackSubscribeToCurrentStateExampleViewModel: ObservableObject { + let Log = Logger(subsystem: "com.matter.casting", + category: "MCMediaPlaybackSubscribeToCurrentStateExampleViewModel") + + @Published var status: String?; + + // VendorId of the MCEndpoint on the MCCastingPlayer that the MCCastingApp desires to interact with after connection + let sampleEndpointVid: Int = 65521 + + func subscribe(castingPlayer: MCCastingPlayer) + { + // select the MCEndpoint on the MCCastingPlayer to invoke the command on + if let endpoint: MCEndpoint = castingPlayer.endpoints().filter({ $0.vendorId().intValue == sampleEndpointVid}).first + { + // validate that the selected endpoint supports the MediaPlayback cluster + if(!endpoint.hasCluster(MCEndpointClusterTypeMediaPlayback)) + { + self.Log.error("No MediaPlayback cluster supporting endpoint found") + DispatchQueue.main.async + { + self.status = "No MediaPlayback cluster supporting endpoint found" + } + return + } + + // get MediaPlayback cluster from the endpoint + let mediaPlaybackCluster: MCMediaPlaybackCluster = endpoint.cluster(for: MCEndpointClusterTypeMediaPlayback) as! MCMediaPlaybackCluster + + // get the currentStateAttribute from the mediaPlaybackCluster + let currentStateAttribute: MCMediaPlaybackClusterCurrentStateAttribute? = mediaPlaybackCluster.currentStateAttribute() + if(currentStateAttribute == nil) + { + self.Log.error("CurrentState attribute not supported on cluster") + DispatchQueue.main.async + { + self.status = "CurrentState attribute not supported on cluster" + } + return + } + + + // call read on currentStateAttribute and pass in a completion block + currentStateAttribute!.read(nil) { context, before, after, err in + + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "HH:mm:ss" + let currentTime = dateFormatter.string(from: Date()) + DispatchQueue.main.async + { + if(err != nil) + { + self.Log.error("Error when reading CurrentState value \(String(describing: err)) at \(currentTime)") + self.status = "Error when reading CurrentState value \(String(describing: err)) at \(currentTime)" + return + } + if(before != nil) + { + self.Log.info("Read CurrentState value: \(String(describing: after)) Before: \(String(describing: before)) at \(currentTime)") + self.status = "Read CurrentState value: \(String(describing: after)) Before: \(String(describing: before)) at \(currentTime)" + } + else + { + self.Log.info("Read CurrentState value: \(String(describing: after)) at \(currentTime)") + self.status = "Read CurrentState value: \(String(describing: after)) at \(currentTime)" + } + } + } + } + else + { + self.Log.error("No endpoint matching the example VID found") + DispatchQueue.main.async + { + self.status = "No endpoint matching the example VID found" + } + } + } +} diff --git a/examples/tv-casting-app/tv-casting-common/core/Attribute.h b/examples/tv-casting-app/tv-casting-common/core/Attribute.h index 08296135afa070..6ce2aa046680ad 100644 --- a/examples/tv-casting-app/tv-casting-common/core/Attribute.h +++ b/examples/tv-casting-app/tv-casting-common/core/Attribute.h @@ -67,8 +67,7 @@ class Attribute /** * @brief Reads the value of the Attribute that belongs to the associated Endpoint and corresponding Cluster - * - * @param context + * @param context current context passed back in successCb/FailureCb * @param successCb Called when the Attribute is read successfully, with the value of the attribute after reading, as well as * before (if the Attribute had been previously read) * @param failureCb Called when there is a failure in reading the Attribute @@ -159,7 +158,7 @@ class Attribute * @brief Writes the value of the Attribute to an associated Endpoint and corresponding Cluster * * @param requestData value of the Attribute to be written - * @param context + * @param context current context passed back in successCb/FailureCb * @param successCb Called when the Attribute is written successfully * @param failureCb Called when there is a failure in writing the Attribute * @param aTimedWriteTimeoutMs write timeout @@ -239,12 +238,12 @@ class Attribute /** * @brief Subscribes to the value of the Attribute that belongs to the associated Endpoint and corresponding Cluster * - * @param context + * @param context current context passed back in successCb/FailureCb * @param successCb Called when the Attribute is read successfully, with the value of the attribute after reading, as well as * before (if the Attribute had been previously read) * @param failureCb Called when there is a failure in reading the Attribute - * @param minIntervalFloorSeconds - * @param maxIntervalCeilingSeconds + * @param minIntervalFloorSeconds the requested minimum interval boundary floor in seconds for attribute udpates + * @param maxIntervalCeilingSeconds the requested maximum interval boundary ceiling in seconds for attribute udpates */ void Subscribe(void * context, ReadResponseSuccessCallbackFn successCb, ReadResponseFailureCallbackFn failureCb, uint16_t minIntervalFloorSeconds, uint16_t maxIntervalCeilingSeconds) diff --git a/examples/tv-casting-app/tv-casting-common/core/CastingApp.h b/examples/tv-casting-app/tv-casting-common/core/CastingApp.h index ed26e24709e6c5..f286aad3cbde7f 100644 --- a/examples/tv-casting-app/tv-casting-common/core/CastingApp.h +++ b/examples/tv-casting-app/tv-casting-common/core/CastingApp.h @@ -47,7 +47,7 @@ class CastingApp /** * @brief Initializes the CastingApp with appParameters * - * @param appParameters + * @param appParameters AppParameters required to Start up the CastingApp * @return CHIP_ERROR */ CHIP_ERROR Initialize(const matter::casting::support::AppParameters & appParameters); diff --git a/examples/tv-casting-app/tv-casting-common/core/Command.h b/examples/tv-casting-app/tv-casting-common/core/Command.h index 3075053b98493a..b3e3e44ec50457 100644 --- a/examples/tv-casting-app/tv-casting-common/core/Command.h +++ b/examples/tv-casting-app/tv-casting-common/core/Command.h @@ -43,7 +43,6 @@ class Command * @brief Invokes this command on the associated Endpoint and corresponding Cluster * * @param request request data corresponding to this command invocation - * @param context * @param successCb Called on command execution success, with responseData * @param failureCb Called on command execution failure * @param timedInvokeTimeoutMs command timeout diff --git a/examples/tv-casting-app/tv-casting-common/core/Endpoint.h b/examples/tv-casting-app/tv-casting-common/core/Endpoint.h index 006fde019dd182..4da8cd56210b07 100644 --- a/examples/tv-casting-app/tv-casting-common/core/Endpoint.h +++ b/examples/tv-casting-app/tv-casting-common/core/Endpoint.h @@ -46,6 +46,7 @@ class EndpointAttributes }; class CastingPlayer; +class BaseCluster; /** * @brief An Endpoint on a CastingPlayer e.g. a Speaker or a Matter Content App From e03a83c93eca08242d0ce28b65c83e29e14972d5 Mon Sep 17 00:00:00 2001 From: Philip Gregor <147669098+pgregorr-amazon@users.noreply.github.com> Date: Fri, 26 Jan 2024 16:55:40 -0800 Subject: [PATCH 09/28] tv-casting-app: simplified android connection API (#31617) --- .../com/chip/casting/app/MainActivity.java | 19 +- .../casting/ConnectionExampleFragment.java | 147 +++++++++++++++ .../casting/DiscoveryExampleFragment.java | 5 +- .../matter/casting/core/CastingPlayer.java | 56 ++++-- .../casting/core/MatterCastingPlayer.java | 49 +++++ .../casting/support/DeviceTypeStruct.java | 28 +++ .../casting/support/EndpointFilter.java | 35 ++++ .../main/jni/cpp/core/CastingPlayer-JNI.cpp | 171 ++++++++++++++++++ .../src/main/jni/cpp/core/CastingPlayer-JNI.h | 41 +++++ .../cpp/core/CastingPlayerDiscovery-JNI.cpp | 2 + .../support/CastingPlayerConverter-JNI.cpp | 4 + .../fragment_matter_connection_example.xml | 23 +++ .../App/app/src/main/res/values/strings.xml | 1 + examples/tv-casting-app/android/BUILD.gn | 4 + .../tv-casting-common/core/CastingPlayer.cpp | 20 +- src/lib/support/JniTypeWrappers.h | 16 ++ 16 files changed, 584 insertions(+), 37 deletions(-) create mode 100644 examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/ConnectionExampleFragment.java create mode 100644 examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/DeviceTypeStruct.java create mode 100644 examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/EndpointFilter.java create mode 100644 examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.cpp create mode 100644 examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.h create mode 100644 examples/tv-casting-app/android/App/app/src/main/res/layout/fragment_matter_connection_example.xml diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java index c0b1bcb5a860df..9db82781d855b8 100644 --- a/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/chip/casting/app/MainActivity.java @@ -11,6 +11,7 @@ import com.chip.casting.TvCastingApp; import com.chip.casting.util.GlobalCastingConstants; import com.chip.casting.util.PreferencesConfigurationManager; +import com.matter.casting.ConnectionExampleFragment; import com.matter.casting.DiscoveryExampleFragment; import com.matter.casting.InitializationExample; import com.matter.casting.core.CastingPlayer; @@ -20,7 +21,8 @@ public class MainActivity extends AppCompatActivity implements CommissionerDiscoveryFragment.Callback, ConnectionFragment.Callback, SelectClusterFragment.Callback, - DiscoveryExampleFragment.Callback { + DiscoveryExampleFragment.Callback, + ConnectionExampleFragment.Callback { private static final String TAG = MainActivity.class.getSimpleName(); @@ -58,10 +60,9 @@ public void handleCommissioningButtonClicked(DiscoveredNodeData commissioner) { } @Override - public void handleConnectionButtonClicked(CastingPlayer player) { + public void handleConnectionButtonClicked(CastingPlayer castingPlayer) { Log.i(TAG, "MainActivity.handleConnectionButtonClicked() called"); - // TODO: In future PR, show fragment that connects to the player. - // showFragment(ConnectionFragment.newInstance(CastingPlayer player)); + showFragment(ConnectionExampleFragment.newInstance(castingPlayer)); } @Override @@ -69,6 +70,14 @@ public void handleCommissioningComplete() { showFragment(SelectClusterFragment.newInstance(tvCastingApp)); } + @Override + public void handleConnectionComplete(CastingPlayer castingPlayer) { + Log.i(TAG, "MainActivity.handleConnectionComplete() called "); + + // TODO: Implement in following PRs. Select Cluster Fragment. + // showFragment(SelectClusterFragment.newInstance(tvCastingApp)); + } + @Override public void handleContentLauncherSelected() { showFragment(ContentLauncherFragment.newInstance(tvCastingApp)); @@ -115,7 +124,7 @@ private boolean initJni() { private void showFragment(Fragment fragment, boolean showOnBack) { Log.d( TAG, - "showFragment called with " + fragment.getClass().getSimpleName() + " and " + showOnBack); + "showFragment() called with " + fragment.getClass().getSimpleName() + " and " + showOnBack); FragmentTransaction fragmentTransaction = getSupportFragmentManager() .beginTransaction() diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/ConnectionExampleFragment.java b/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/ConnectionExampleFragment.java new file mode 100644 index 00000000000000..c6462cd52690e5 --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/ConnectionExampleFragment.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.matter.casting; + +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import com.R; +import com.matter.casting.core.CastingPlayer; +import com.matter.casting.support.DeviceTypeStruct; +import com.matter.casting.support.EndpointFilter; +import java.util.ArrayList; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executors; + +/** A {@link Fragment} to Verify or establish a connection with a selected Casting Player. */ +public class ConnectionExampleFragment extends Fragment { + private static final String TAG = ConnectionExampleFragment.class.getSimpleName(); + // Time (in sec) to keep the commissioning window open, if commissioning is required. + // Must be >= 3 minutes. + private static final long MIN_CONNECTION_TIMEOUT_SEC = 3 * 60; + private final CastingPlayer targetCastingPlayer; + private TextView connectionFragmentStatusTextView; + private Button connectionFragmentNextButton; + + public ConnectionExampleFragment(CastingPlayer targetCastingPlayer) { + Log.i(TAG, "ConnectionExampleFragment() called with target CastingPlayer"); + this.targetCastingPlayer = targetCastingPlayer; + } + + /** + * Use this factory method to create a new instance of this fragment using the provided + * parameters. + * + * @return A new instance of fragment ConnectionExampleFragment. + */ + public static ConnectionExampleFragment newInstance(CastingPlayer castingPlayer) { + Log.i(TAG, "newInstance() called"); + return new ConnectionExampleFragment(castingPlayer); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Log.i(TAG, "onCreate() called"); + } + + @Override + public View onCreateView( + LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + Log.i(TAG, "onCreateView() called"); + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_matter_connection_example, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Log.i(TAG, "onViewCreated() called"); + + connectionFragmentStatusTextView = getView().findViewById(R.id.connectionFragmentStatusText); + connectionFragmentStatusTextView.setText( + "Verifying or establishing connection with Casting Player with device name: " + + targetCastingPlayer.getDeviceName()); + + connectionFragmentNextButton = getView().findViewById(R.id.connectionFragmentNextButton); + Callback callback = (ConnectionExampleFragment.Callback) this.getActivity(); + connectionFragmentNextButton.setOnClickListener( + v -> { + Log.i(TAG, "onViewCreated() NEXT clicked. Calling handleConnectionComplete()"); + callback.handleConnectionComplete(targetCastingPlayer); + }); + + Executors.newSingleThreadExecutor() + .submit( + () -> { + Log.d(TAG, "onViewCreated() calling verifyOrEstablishConnection()"); + + EndpointFilter desiredEndpointFilter = + new EndpointFilter(null, 65521, new ArrayList()); + // The desired commissioning window timeout and EndpointFilter are optional. + CompletableFuture completableFuture = + targetCastingPlayer.VerifyOrEstablishConnection( + MIN_CONNECTION_TIMEOUT_SEC, desiredEndpointFilter); + + Log.d(TAG, "onViewCreated() verifyOrEstablishConnection() called"); + + completableFuture + .thenRun( + () -> { + Log.i( + TAG, + "CompletableFuture.thenRun(), connected to CastingPlayer with deviceId: " + + targetCastingPlayer.getDeviceId()); + getActivity() + .runOnUiThread( + () -> { + connectionFragmentStatusTextView.setText( + "Connected to Casting Player with device name: " + + targetCastingPlayer.getDeviceName()); + connectionFragmentNextButton.setEnabled(true); + }); + }) + .exceptionally( + exc -> { + Log.e( + TAG, + "CompletableFuture.exceptionally(), CastingPLayer connection failed: " + + exc.getMessage()); + getActivity() + .runOnUiThread( + () -> { + connectionFragmentStatusTextView.setText( + "Casting Player connection failed due to: " + + exc.getMessage()); + }); + return null; + }); + }); + } + + /** Interface for notifying the host. */ + public interface Callback { + /** Notifies listener to trigger transition on completion of connection */ + void handleConnectionComplete(CastingPlayer castingPlayer); + } +} diff --git a/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java b/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java index 4c5d68fdb60654..67db95be2637df 100644 --- a/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java +++ b/examples/tv-casting-app/android/App/app/src/main/java/com/matter/casting/DiscoveryExampleFragment.java @@ -338,11 +338,10 @@ public View getView(int i, View view, ViewGroup viewGroup) { CastingPlayer castingPlayer = playerList.get(i); Log.d( TAG, - "OnItemClickListener.onClick() called for castingPlayer with deviceId: " + "OnClickListener.onClick() called for CastingPlayer with deviceId: " + castingPlayer.getDeviceId()); DiscoveryExampleFragment.Callback callback1 = (DiscoveryExampleFragment.Callback) context; - // TODO: In following PRs. Implement CastingPlayer connection - // callback1.handleCommissioningButtonClicked(castingPlayer); + callback1.handleConnectionButtonClicked(castingPlayer); }; playerDescription.setOnClickListener(clickListener); return view; diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java index 71ea4767a03994..723f1b8e93b1a5 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/CastingPlayer.java @@ -16,8 +16,10 @@ */ package com.matter.casting.core; +import com.matter.casting.support.EndpointFilter; import java.net.InetAddress; import java.util.List; +import java.util.concurrent.CompletableFuture; /** * The CastingPlayer interface defines a Matter commissioner that is able to play media to a @@ -55,24 +57,38 @@ public interface CastingPlayer { @Override int hashCode(); - // TODO: Implement in following PRs. Related to player connection implementation. - // List getEndpoints(); - // - // ConnectionState getConnectionState(); - // - // CompletableFuture connect(long timeout); - // - // static class ConnectionState extends Observable { - // private boolean connected; - // - // void setConnected(boolean connected) { - // this.connected = connected; - // setChanged(); - // notifyObservers(this.connected); - // } - // - // boolean isConnected() { - // return connected; - // } - // } + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @param commissioningWindowTimeoutSec (Optional) time (in sec) to keep the commissioning window + * open, if commissioning is required. Needs to be >= MIN_CONNECTION_TIMEOUT_SEC. + * @param desiredEndpointFilter (Optional) Attributes (such as VendorId) describing an Endpoint + * that the client wants to interact with after commissioning. If this value is passed in, the + * VerifyOrEstablishConnection will force User Directed Commissioning, in case the desired + * Endpoint is not found in the on device CastingStore. + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + CompletableFuture VerifyOrEstablishConnection( + long commissioningWindowTimeoutSec, EndpointFilter desiredEndpointFilter); + + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + CompletableFuture VerifyOrEstablishConnection(); } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java index ecc76a575a115b..d5d93c3204ec34 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/core/MatterCastingPlayer.java @@ -16,9 +16,11 @@ */ package com.matter.casting.core; +import com.matter.casting.support.EndpointFilter; import java.net.InetAddress; import java.util.List; import java.util.Objects; +import java.util.concurrent.CompletableFuture; /** * A Matter Casting Player represents a Matter commissioner that is able to play media to a physical @@ -27,6 +29,13 @@ * the service discovered/resolved. */ public class MatterCastingPlayer implements CastingPlayer { + private static final String TAG = MatterCastingPlayer.class.getSimpleName(); + /** + * Time (in sec) to keep the commissioning window open, if commissioning is required. Must be >= 3 + * minutes. + */ + public static final long MIN_CONNECTION_TIMEOUT_SEC = 3 * 60; + private boolean connected; private String deviceId; private String deviceName; @@ -37,6 +46,7 @@ public class MatterCastingPlayer implements CastingPlayer { private int productId; private int vendorId; private long deviceType; + protected long _cppCastingPlayer; public MatterCastingPlayer( boolean connected, @@ -137,4 +147,43 @@ public boolean equals(Object o) { MatterCastingPlayer that = (MatterCastingPlayer) o; return Objects.equals(this.deviceId, that.deviceId); } + + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @param commissioningWindowTimeoutSec (Optional) time (in sec) to keep the commissioning window + * open, if commissioning is required. Needs to be >= MIN_CONNECTION_TIMEOUT_SEC. + * @param desiredEndpointFilter (Optional) Attributes (such as VendorId) describing an Endpoint + * that the client wants to interact with after commissioning. If this value is passed in, the + * VerifyOrEstablishConnection will force User Directed Commissioning, in case the desired + * Endpoint is not found in the on device CastingStore. + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + @Override + public native CompletableFuture VerifyOrEstablishConnection( + long commissioningWindowTimeoutSec, EndpointFilter desiredEndpointFilter); + + /** + * Verifies that a connection exists with this CastingPlayer, or triggers a new session request. + * If the CastingApp does not have the nodeId and fabricIndex of this CastingPlayer cached on + * disk, this will execute the user directed commissioning process. + * + * @return A CompletableFuture that completes when the VerifyOrEstablishConnection is completed. + * The CompletableFuture will be completed with a Void value if the + * VerifyOrEstablishConnection is successful. Otherwise, the CompletableFuture will be + * completed with an Exception. The Exception will be of type + * com.matter.casting.core.CastingException. If the VerifyOrEstablishConnection fails, the + * CastingException will contain the error code and message from the CastingApp. + */ + @Override + public CompletableFuture VerifyOrEstablishConnection() { + return VerifyOrEstablishConnection(MIN_CONNECTION_TIMEOUT_SEC, null); + } } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/DeviceTypeStruct.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/DeviceTypeStruct.java new file mode 100644 index 00000000000000..4c0271c69ecdf2 --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/DeviceTypeStruct.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.matter.casting.support; + +/** A class to describe a Matter device type. */ +public class DeviceTypeStruct { + public long deviceType; + public int revision; + + public DeviceTypeStruct(long deviceType, int revision) { + this.deviceType = deviceType; + this.revision = revision; + } +} diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/EndpointFilter.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/EndpointFilter.java new file mode 100644 index 00000000000000..1152e48b95890c --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/matter/casting/support/EndpointFilter.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.matter.casting.support; + +import java.util.List; + +/** Describes an Endpoint that the client wants to connect to. */ +public class EndpointFilter { + // Value of null means unspecified + public Integer productId; + // Value of null means unspecified + public Integer vendorId; + public List requiredDeviceTypes; + + public EndpointFilter( + Integer productId, Integer vendorId, List requiredDeviceTypes) { + this.productId = productId; + this.vendorId = vendorId; + this.requiredDeviceTypes = requiredDeviceTypes; + } +} diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.cpp new file mode 100644 index 00000000000000..2c0fe914232778 --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "CastingPlayer-JNI.h" + +#include "../JNIDACProvider.h" +#include "../support/CastingPlayerConverter-JNI.h" +#include "../support/ErrorConverter-JNI.h" +#include "../support/RotatingDeviceIdUniqueIdProvider-JNI.h" +#include "core/CastingApp.h" // from tv-casting-common +#include "core/CastingPlayer.h" // from tv-casting-common +#include "core/CastingPlayerDiscovery.h" // from tv-casting-common + +#include +#include +#include +#include +#include + +using namespace chip; + +#define JNI_METHOD(RETURN, METHOD_NAME) \ + extern "C" JNIEXPORT RETURN JNICALL Java_com_matter_casting_core_MatterCastingPlayer_##METHOD_NAME + +namespace matter { +namespace casting { +namespace core { + +JNI_METHOD(jobject, VerifyOrEstablishConnection) +(JNIEnv * env, jobject thiz, jlong commissioningWindowTimeoutSec, jobject desiredEndpointFilterJavaObject) +{ + chip::DeviceLayer::StackLock lock; + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() called with a timeout of: %ld seconds", + static_cast(commissioningWindowTimeoutSec)); + + // Convert the CastingPlayer jlong to a CastingPlayer pointer + jclass castingPlayerClass = env->GetObjectClass(thiz); + jfieldID _cppCastingPlayerFieldId = env->GetFieldID(castingPlayerClass, "_cppCastingPlayer", "J"); + VerifyOrReturnValue( + _cppCastingPlayerFieldId != nullptr, nullptr, + ChipLogError(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() _cppCastingPlayerFieldId == nullptr")); + + jlong _cppCastingPlayerValue = env->GetLongField(thiz, _cppCastingPlayerFieldId); + CastingPlayer * castingPlayer = reinterpret_cast(_cppCastingPlayerValue); + VerifyOrReturnValue(castingPlayer != nullptr, nullptr, + ChipLogError(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() castingPlayer == nullptr")); + + // Create a new Java CompletableFuture + jclass completableFutureClass = env->FindClass("java/util/concurrent/CompletableFuture"); + jmethodID completableFutureConstructor = env->GetMethodID(completableFutureClass, "", "()V"); + jobject completableFutureObj = env->NewObject(completableFutureClass, completableFutureConstructor); + jobject completableFutureObjGlobalRef = env->NewGlobalRef(completableFutureObj); + VerifyOrReturnValue( + completableFutureObjGlobalRef != nullptr, nullptr, + ChipLogError(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() completableFutureObjGlobalRef == nullptr")); + + ConnectCallback callback = [completableFutureObjGlobalRef](CHIP_ERROR err, CastingPlayer * playerPtr) { + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() ConnectCallback called"); + VerifyOrReturn(completableFutureObjGlobalRef != nullptr, + ChipLogError(AppServer, "ConnectCallback, completableFutureObjGlobalRef == nullptr")); + + JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + VerifyOrReturn(env != nullptr, ChipLogError(AppServer, "ConnectCallback, env == nullptr")); + // Ensures proper cleanup of local references to Java objects. + JniLocalReferenceManager manager(env); + // Ensures proper cleanup of global references to Java objects. + JniGlobalRefWrapper globalRefWrapper(completableFutureObjGlobalRef); + + jclass completableFutureClass = env->FindClass("java/util/concurrent/CompletableFuture"); + VerifyOrReturn(completableFutureClass != nullptr, + ChipLogError(AppServer, "ConnectCallback, completableFutureClass == nullptr"); + env->DeleteGlobalRef(completableFutureObjGlobalRef);); + + if (err == CHIP_NO_ERROR) + { + ChipLogProgress(AppServer, "ConnectCallback, Connected to Casting Player with device ID: %s", playerPtr->GetId()); + jmethodID completeMethod = env->GetMethodID(completableFutureClass, "complete", "(Ljava/lang/Object;)Z"); + VerifyOrReturn(completeMethod != nullptr, ChipLogError(AppServer, "ConnectCallback, completeMethod == nullptr")); + + chip::DeviceLayer::StackUnlock unlock; + env->CallBooleanMethod(completableFutureObjGlobalRef, completeMethod, nullptr); + } + else + { + ChipLogError(AppServer, "ConnectCallback, connection error: %" CHIP_ERROR_FORMAT, err.Format()); + jmethodID completeExceptionallyMethod = + env->GetMethodID(completableFutureClass, "completeExceptionally", "(Ljava/lang/Throwable;)Z"); + VerifyOrReturn(completeExceptionallyMethod != nullptr, + ChipLogError(AppServer, "ConnectCallback, completeExceptionallyMethod == nullptr")); + + // Create a Throwable object (e.g., RuntimeException) to pass to completeExceptionallyMethod + jclass throwableClass = env->FindClass("java/lang/RuntimeException"); + VerifyOrReturn(throwableClass != nullptr, ChipLogError(AppServer, "ConnectCallback, throwableClass == nullptr")); + jmethodID throwableConstructor = env->GetMethodID(throwableClass, "", "(Ljava/lang/String;)V"); + VerifyOrReturn(throwableConstructor != nullptr, + ChipLogError(AppServer, "ConnectCallback, throwableConstructor == nullptr")); + jstring errorMessage = env->NewStringUTF(err.Format()); + VerifyOrReturn(errorMessage != nullptr, ChipLogError(AppServer, "ConnectCallback, errorMessage == nullptr")); + jobject throwableObject = env->NewObject(throwableClass, throwableConstructor, errorMessage); + VerifyOrReturn(throwableObject != nullptr, ChipLogError(AppServer, "ConnectCallback, throwableObject == nullptr")); + + chip::DeviceLayer::StackUnlock unlock; + env->CallBooleanMethod(completableFutureObjGlobalRef, completeExceptionallyMethod, throwableObject); + } + }; + + if (desiredEndpointFilterJavaObject == nullptr) + { + ChipLogProgress(AppServer, + "CastingPlayer-JNI::VerifyOrEstablishConnection() calling CastingPlayer::VerifyOrEstablishConnection() on " + "Casting Player with device ID: %s", + castingPlayer->GetId()); + castingPlayer->VerifyOrEstablishConnection(callback, static_cast(commissioningWindowTimeoutSec)); + } + else + { + // Convert the EndpointFilter Java class to a C++ EndpointFilter + jclass endpointFilterJavaClass = env->GetObjectClass(desiredEndpointFilterJavaObject); + jfieldID vendorIdFieldId = env->GetFieldID(endpointFilterJavaClass, "vendorId", "Ljava/lang/Integer;"); + jfieldID productIdFieldId = env->GetFieldID(endpointFilterJavaClass, "productId", "Ljava/lang/Integer;"); + jobject vendorIdIntegerObject = env->GetObjectField(desiredEndpointFilterJavaObject, vendorIdFieldId); + jobject productIdIntegerObject = env->GetObjectField(desiredEndpointFilterJavaObject, productIdFieldId); + // jfieldID requiredDeviceTypesFieldId = env->GetFieldID(endpointFilterJavaClass, "requiredDeviceTypes", + // "Ljava/util/List;"); + + matter::casting::core::EndpointFilter desiredEndpointFilter; + // Value of 0 means unspecified + desiredEndpointFilter.vendorId = vendorIdIntegerObject != nullptr + ? static_cast(env->CallIntMethod( + vendorIdIntegerObject, env->GetMethodID(env->GetObjectClass(vendorIdIntegerObject), "intValue", "()I"))) + : 0; + desiredEndpointFilter.productId = productIdIntegerObject != nullptr + ? static_cast(env->CallIntMethod( + productIdIntegerObject, env->GetMethodID(env->GetObjectClass(productIdIntegerObject), "intValue", "()I"))) + : 0; + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() desiredEndpointFilter.vendorId: %d", + desiredEndpointFilter.vendorId); + ChipLogProgress(AppServer, "CastingPlayer-JNI::VerifyOrEstablishConnection() desiredEndpointFilter.productId: %d", + desiredEndpointFilter.productId); + // TODO: In following PRs. Translate the Java requiredDeviceTypes list to a C++ requiredDeviceTypes vector. For now we're + // passing an empty list of DeviceTypeStruct. + + ChipLogProgress(AppServer, + "CastingPlayer-JNI::VerifyOrEstablishConnection() calling " + "CastingPlayer::VerifyOrEstablishConnection() on Casting Player with device ID: %s", + castingPlayer->GetId()); + castingPlayer->VerifyOrEstablishConnection(callback, static_cast(commissioningWindowTimeoutSec), + desiredEndpointFilter); + } + + return completableFutureObjGlobalRef; +} + +}; // namespace core +}; // namespace casting +}; // namespace matter diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.h b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.h new file mode 100644 index 00000000000000..2870866895c868 --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayer-JNI.h @@ -0,0 +1,41 @@ +/* + * + * Copyright (c) 2024 Project CHIP Authors + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +namespace matter { +namespace casting { +namespace core { + +class CastingPlayerJNI +{ +public: +private: + friend CastingPlayerJNI & CastingAppJNIMgr(); + static CastingPlayerJNI sInstance; +}; + +inline class CastingPlayerJNI & CastingAppJNIMgr() +{ + return CastingPlayerJNI::sInstance; +} +}; // namespace core +}; // namespace casting +}; // namespace matter diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp index 255ba570082e16..5d531e0164e4db 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/core/CastingPlayerDiscovery-JNI.cpp @@ -88,6 +88,7 @@ class DiscoveryDelegateImpl : public DiscoveryDelegate "CastingPlayer jobject")); JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + chip::DeviceLayer::StackUnlock unlock; env->CallVoidMethod(castingPlayerChangeListenerJavaObject, onAddedCallbackJavaMethodID, matterCastingPlayerJavaObject); } @@ -113,6 +114,7 @@ class DiscoveryDelegateImpl : public DiscoveryDelegate "create CastingPlayer jobject")); JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); + chip::DeviceLayer::StackUnlock unlock; env->CallVoidMethod(castingPlayerChangeListenerJavaObject, onChangedCallbackJavaMethodID, matterCastingPlayerJavaObject); } diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp index a993a501bd6aa0..72c3677f357707 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/support/CastingPlayerConverter-JNI.cpp @@ -83,7 +83,11 @@ jobject createJCastingPlayer(matter::casting::memory::StrongGetFieldID(matterCastingPlayerJavaClass, "_cppCastingPlayer", "J"); + env->SetLongField(jMatterCastingPlayer, longFieldId, reinterpret_cast(player.get())); return jMatterCastingPlayer; } diff --git a/examples/tv-casting-app/android/App/app/src/main/res/layout/fragment_matter_connection_example.xml b/examples/tv-casting-app/android/App/app/src/main/res/layout/fragment_matter_connection_example.xml new file mode 100644 index 00000000000000..8bdd1b4bb741aa --- /dev/null +++ b/examples/tv-casting-app/android/App/app/src/main/res/layout/fragment_matter_connection_example.xml @@ -0,0 +1,23 @@ + + + + + +