Start of python YAML test parsers and executer (#23533)

* Start of python YAML test parsers and executer

Tested inside chip-repl with the following commands (with all-cluster
app running on separate terminal already commissioned):
  import chip.yaml
  foo = chip.yaml.Yaml.YamlTestParser("src/app/tests/suites/TestCluster.yaml")
  foo.ExecuteTests(devCtrl)

Co-authored-by: Jerry Johns <johnsj@google.com>

* Address PR comments

* Reduce line length to 100

* Address PR comments

* Address PR comments

* Fix minor nit docstring issue

* Address more PR comments, rename module names to adhere to guidelines

* Fix style

* Apparently cluster is not always set in 'config'

* Fix up chip-repl CI failure

Co-authored-by: Jerry Johns <johnsj@google.com>
diff --git a/src/controller/python/BUILD.gn b/src/controller/python/BUILD.gn
index 7031bdf..81e387f 100644
--- a/src/controller/python/BUILD.gn
+++ b/src/controller/python/BUILD.gn
@@ -226,6 +226,11 @@
         "chip/storage/__init__.py",
         "chip/utils/CommissioningBuildingBlocks.py",
         "chip/utils/__init__.py",
+        "chip/yaml/__init__.py",
+        "chip/yaml/data_model_lookup.py",
+        "chip/yaml/errors.py",
+        "chip/yaml/format_converter.py",
+        "chip/yaml/parser.py",
       ]
 
       if (chip_controller) {
@@ -269,6 +274,7 @@
     "chip.internal",
     "chip.interaction_model",
     "chip.logging",
+    "chip.yaml",
     "chip.native",
     "chip.clusters",
     "chip.setup_payload",
diff --git a/src/controller/python/chip/clusters/Objects.py b/src/controller/python/chip/clusters/Objects.py
index 69e8231..476925f 100644
--- a/src/controller/python/chip/clusters/Objects.py
+++ b/src/controller/python/chip/clusters/Objects.py
@@ -85,6 +85,7 @@
             cluster_id: typing.ClassVar[int] = 0x0003
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -100,6 +101,7 @@
             cluster_id: typing.ClassVar[int] = 0x0003
             command_id: typing.ClassVar[int] = 0x0040
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -259,6 +261,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'AddGroupResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -276,6 +279,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -293,6 +297,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'ViewGroupResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -308,6 +313,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -327,6 +333,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetGroupMembershipResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -342,6 +349,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -359,6 +367,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'RemoveGroupResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -374,6 +383,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -391,6 +401,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -404,6 +415,7 @@
             cluster_id: typing.ClassVar[int] = 0x0004
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -585,6 +597,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'AddSceneResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -608,6 +621,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -627,6 +641,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'ViewSceneResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -644,6 +659,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -669,6 +685,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'RemoveSceneResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -686,6 +703,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -705,6 +723,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'RemoveAllScenesResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -720,6 +739,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -737,6 +757,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'StoreSceneResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -754,6 +775,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -773,6 +795,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -792,6 +815,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetSceneMembershipResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -807,6 +831,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -828,6 +853,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0040
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'EnhancedAddSceneResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -851,6 +877,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0040
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -870,6 +897,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0041
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'EnhancedViewSceneResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -887,6 +915,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0041
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -912,6 +941,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0042
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'CopySceneResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -935,6 +965,7 @@
             cluster_id: typing.ClassVar[int] = 0x0005
             command_id: typing.ClassVar[int] = 0x0042
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1186,6 +1217,7 @@
             cluster_id: typing.ClassVar[int] = 0x0006
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1199,6 +1231,7 @@
             cluster_id: typing.ClassVar[int] = 0x0006
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1212,6 +1245,7 @@
             cluster_id: typing.ClassVar[int] = 0x0006
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1225,6 +1259,7 @@
             cluster_id: typing.ClassVar[int] = 0x0006
             command_id: typing.ClassVar[int] = 0x0040
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1242,6 +1277,7 @@
             cluster_id: typing.ClassVar[int] = 0x0006
             command_id: typing.ClassVar[int] = 0x0041
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1255,6 +1291,7 @@
             cluster_id: typing.ClassVar[int] = 0x0006
             command_id: typing.ClassVar[int] = 0x0042
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1642,6 +1679,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1663,6 +1701,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1684,6 +1723,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1707,6 +1747,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1724,6 +1765,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1745,6 +1787,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1766,6 +1809,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1789,6 +1833,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -1806,6 +1851,7 @@
             cluster_id: typing.ClassVar[int] = 0x0008
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3259,6 +3305,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3276,6 +3323,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3295,6 +3343,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3312,6 +3361,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3331,6 +3381,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3348,6 +3399,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3365,6 +3417,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3384,6 +3437,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3401,6 +3455,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3418,6 +3473,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x0009
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3437,6 +3493,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x000A
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3454,6 +3511,7 @@
             cluster_id: typing.ClassVar[int] = 0x0025
             command_id: typing.ClassVar[int] = 0x000B
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -3733,6 +3791,7 @@
             cluster_id: typing.ClassVar[int] = 0x0028
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -4267,6 +4326,7 @@
             cluster_id: typing.ClassVar[int] = 0x0029
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'QueryImageResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -4296,6 +4356,7 @@
             cluster_id: typing.ClassVar[int] = 0x0029
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -4325,6 +4386,7 @@
             cluster_id: typing.ClassVar[int] = 0x0029
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'ApplyUpdateResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -4342,6 +4404,7 @@
             cluster_id: typing.ClassVar[int] = 0x0029
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -4359,6 +4422,7 @@
             cluster_id: typing.ClassVar[int] = 0x0029
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -4533,6 +4597,7 @@
             cluster_id: typing.ClassVar[int] = 0x002A
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6174,6 +6239,7 @@
             cluster_id: typing.ClassVar[int] = 0x0030
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'ArmFailSafeResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6191,6 +6257,7 @@
             cluster_id: typing.ClassVar[int] = 0x0030
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6208,6 +6275,7 @@
             cluster_id: typing.ClassVar[int] = 0x0030
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'SetRegulatoryConfigResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6227,6 +6295,7 @@
             cluster_id: typing.ClassVar[int] = 0x0030
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6244,6 +6313,7 @@
             cluster_id: typing.ClassVar[int] = 0x0030
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'CommissioningCompleteResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6257,6 +6327,7 @@
             cluster_id: typing.ClassVar[int] = 0x0030
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6562,6 +6633,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'ScanNetworksResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6579,6 +6651,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6600,6 +6673,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NetworkConfigResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6619,6 +6693,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NetworkConfigResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6636,6 +6711,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NetworkConfigResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6653,6 +6729,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6672,6 +6749,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'ConnectNetworkResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6689,6 +6767,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6708,6 +6787,7 @@
             cluster_id: typing.ClassVar[int] = 0x0031
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NetworkConfigResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6980,6 +7060,7 @@
             cluster_id: typing.ClassVar[int] = 0x0032
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'RetrieveLogsResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -6999,6 +7080,7 @@
             cluster_id: typing.ClassVar[int] = 0x0032
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -7218,6 +7300,7 @@
             cluster_id: typing.ClassVar[int] = 0x0033
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -7599,6 +7682,7 @@
             cluster_id: typing.ClassVar[int] = 0x0034
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -8068,6 +8152,7 @@
             cluster_id: typing.ClassVar[int] = 0x0035
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -9291,6 +9376,7 @@
             cluster_id: typing.ClassVar[int] = 0x0036
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -9711,6 +9797,7 @@
             cluster_id: typing.ClassVar[int] = 0x0037
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -10055,6 +10142,7 @@
             cluster_id: typing.ClassVar[int] = 0x0038
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11108,6 +11196,7 @@
             cluster_id: typing.ClassVar[int] = 0x003C
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11135,6 +11224,7 @@
             cluster_id: typing.ClassVar[int] = 0x003C
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11154,6 +11244,7 @@
             cluster_id: typing.ClassVar[int] = 0x003C
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11390,6 +11481,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'AttestationResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11405,6 +11497,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11422,6 +11515,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'CertificateChainResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11437,6 +11531,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11452,6 +11547,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'CSRResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11469,6 +11565,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11486,6 +11583,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NOCResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11509,6 +11607,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NOCResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11526,6 +11625,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11545,6 +11645,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x0009
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NOCResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11560,6 +11661,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x000A
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NOCResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11575,6 +11677,7 @@
             cluster_id: typing.ClassVar[int] = 0x003E
             command_id: typing.ClassVar[int] = 0x000B
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11866,6 +11969,7 @@
             cluster_id: typing.ClassVar[int] = 0x003F
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11881,6 +11985,7 @@
             cluster_id: typing.ClassVar[int] = 0x003F
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'KeySetReadResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11896,6 +12001,7 @@
             cluster_id: typing.ClassVar[int] = 0x003F
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11911,6 +12017,7 @@
             cluster_id: typing.ClassVar[int] = 0x003F
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11926,6 +12033,7 @@
             cluster_id: typing.ClassVar[int] = 0x003F
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'KeySetReadAllIndicesResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -11941,6 +12049,7 @@
             cluster_id: typing.ClassVar[int] = 0x003F
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -12916,6 +13025,7 @@
             cluster_id: typing.ClassVar[int] = 0x0050
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13392,6 +13502,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13411,6 +13522,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13430,6 +13542,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13451,6 +13564,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x000B
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13478,6 +13592,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x000C
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetWeekDayScheduleResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13495,6 +13610,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x000C
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13524,6 +13640,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x000D
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13541,6 +13658,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x000E
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13562,6 +13680,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x000F
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetYearDayScheduleResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13579,6 +13698,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x000F
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13602,6 +13722,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0010
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13619,6 +13740,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0011
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13640,6 +13762,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0012
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetHolidayScheduleResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13655,6 +13778,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0012
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13678,6 +13802,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0013
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13693,6 +13818,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x001A
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13724,6 +13850,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x001B
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetUserResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13739,6 +13866,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x001C
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13772,6 +13900,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x001D
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13791,6 +13920,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0022
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'SetCredentialResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13820,6 +13950,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0023
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13839,6 +13970,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0024
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetCredentialStatusResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13854,6 +13986,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0025
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -13877,6 +14010,7 @@
             cluster_id: typing.ClassVar[int] = 0x0101
             command_id: typing.ClassVar[int] = 0x0026
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -14795,6 +14929,7 @@
             cluster_id: typing.ClassVar[int] = 0x0102
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -14808,6 +14943,7 @@
             cluster_id: typing.ClassVar[int] = 0x0102
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -14821,6 +14957,7 @@
             cluster_id: typing.ClassVar[int] = 0x0102
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -14834,6 +14971,7 @@
             cluster_id: typing.ClassVar[int] = 0x0102
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -14849,6 +14987,7 @@
             cluster_id: typing.ClassVar[int] = 0x0102
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -14864,6 +15003,7 @@
             cluster_id: typing.ClassVar[int] = 0x0102
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -14879,6 +15019,7 @@
             cluster_id: typing.ClassVar[int] = 0x0102
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -15374,6 +15515,7 @@
             cluster_id: typing.ClassVar[int] = 0x0103
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -15389,6 +15531,7 @@
             cluster_id: typing.ClassVar[int] = 0x0103
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -16639,6 +16782,7 @@
             cluster_id: typing.ClassVar[int] = 0x0201
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -16656,6 +16800,7 @@
             cluster_id: typing.ClassVar[int] = 0x0201
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -16677,6 +16822,7 @@
             cluster_id: typing.ClassVar[int] = 0x0201
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -16698,6 +16844,7 @@
             cluster_id: typing.ClassVar[int] = 0x0201
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetWeeklyScheduleResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -16715,6 +16862,7 @@
             cluster_id: typing.ClassVar[int] = 0x0201
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18247,6 +18395,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18270,6 +18419,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18291,6 +18441,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18314,6 +18465,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18335,6 +18487,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18356,6 +18509,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18379,6 +18533,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18402,6 +18557,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18425,6 +18581,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18446,6 +18603,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0009
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18469,6 +18627,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x000A
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18490,6 +18649,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0040
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18513,6 +18673,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0041
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18534,6 +18695,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0042
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18557,6 +18719,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0043
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18580,6 +18743,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0044
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18607,6 +18771,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x0047
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18624,6 +18789,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x004B
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -18649,6 +18815,7 @@
             cluster_id: typing.ClassVar[int] = 0x0300
             command_id: typing.ClassVar[int] = 0x004C
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21484,6 +21651,7 @@
             cluster_id: typing.ClassVar[int] = 0x0504
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'ChangeChannelResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21499,6 +21667,7 @@
             cluster_id: typing.ClassVar[int] = 0x0504
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21516,6 +21685,7 @@
             cluster_id: typing.ClassVar[int] = 0x0504
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21533,6 +21703,7 @@
             cluster_id: typing.ClassVar[int] = 0x0504
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21729,6 +21900,7 @@
             cluster_id: typing.ClassVar[int] = 0x0505
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'NavigateTargetResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21746,6 +21918,7 @@
             cluster_id: typing.ClassVar[int] = 0x0505
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21947,6 +22120,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21960,6 +22134,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21973,6 +22148,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21986,6 +22162,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -21999,6 +22176,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22012,6 +22190,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22025,6 +22204,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22038,6 +22218,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22051,6 +22232,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22066,6 +22248,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x0009
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22081,6 +22264,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x000A
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22098,6 +22282,7 @@
             cluster_id: typing.ClassVar[int] = 0x0506
             command_id: typing.ClassVar[int] = 0x000B
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'PlaybackResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22371,6 +22556,7 @@
             cluster_id: typing.ClassVar[int] = 0x0507
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22386,6 +22572,7 @@
             cluster_id: typing.ClassVar[int] = 0x0507
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22399,6 +22586,7 @@
             cluster_id: typing.ClassVar[int] = 0x0507
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22412,6 +22600,7 @@
             cluster_id: typing.ClassVar[int] = 0x0507
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22569,6 +22758,7 @@
             cluster_id: typing.ClassVar[int] = 0x0508
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22784,6 +22974,7 @@
             cluster_id: typing.ClassVar[int] = 0x0509
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'SendKeyResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -22799,6 +22990,7 @@
             cluster_id: typing.ClassVar[int] = 0x0509
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23043,6 +23235,7 @@
             cluster_id: typing.ClassVar[int] = 0x050A
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'LaunchResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23062,6 +23255,7 @@
             cluster_id: typing.ClassVar[int] = 0x050A
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'LaunchResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23081,6 +23275,7 @@
             cluster_id: typing.ClassVar[int] = 0x050A
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23268,6 +23463,7 @@
             cluster_id: typing.ClassVar[int] = 0x050B
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23283,6 +23479,7 @@
             cluster_id: typing.ClassVar[int] = 0x050B
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23478,6 +23675,7 @@
             cluster_id: typing.ClassVar[int] = 0x050C
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'LauncherResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23495,6 +23693,7 @@
             cluster_id: typing.ClassVar[int] = 0x050C
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'LauncherResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23510,6 +23709,7 @@
             cluster_id: typing.ClassVar[int] = 0x050C
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'LauncherResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23525,6 +23725,7 @@
             cluster_id: typing.ClassVar[int] = 0x050C
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23955,6 +24156,7 @@
             cluster_id: typing.ClassVar[int] = 0x050E
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'GetSetupPINResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23974,6 +24176,7 @@
             cluster_id: typing.ClassVar[int] = 0x050E
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -23989,6 +24192,7 @@
             cluster_id: typing.ClassVar[int] = 0x050E
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -24010,6 +24214,7 @@
             cluster_id: typing.ClassVar[int] = 0x050E
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -24391,6 +24596,7 @@
             cluster_id: typing.ClassVar[int] = 0x0B04
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -24412,6 +24618,7 @@
             cluster_id: typing.ClassVar[int] = 0x0B04
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -24425,6 +24632,7 @@
             cluster_id: typing.ClassVar[int] = 0x0B04
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -24450,6 +24658,7 @@
             cluster_id: typing.ClassVar[int] = 0x0B04
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -26943,6 +27152,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -26956,6 +27166,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -26971,6 +27182,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -26984,6 +27196,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -26999,6 +27212,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestSpecificResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27012,6 +27226,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0002
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27027,6 +27242,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27040,6 +27256,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0003
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27065,6 +27282,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestAddArgumentsResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27082,6 +27300,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0004
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27097,6 +27316,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestSimpleArgumentResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27112,6 +27332,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0005
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27129,6 +27350,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestStructArrayArgumentResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27154,6 +27376,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0006
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27175,6 +27398,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'BooleanResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27190,6 +27414,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0007
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27259,6 +27484,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'BooleanResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27274,6 +27500,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0008
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27289,6 +27516,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0009
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'BooleanResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27304,6 +27532,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0009
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27319,6 +27548,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000A
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'BooleanResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27334,6 +27564,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000A
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27349,6 +27580,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000B
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'BooleanResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27364,6 +27596,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000B
             is_client: typing.ClassVar[bool] = False
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27379,6 +27612,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000C
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'BooleanResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27394,6 +27628,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000D
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestListInt8UReverseResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27409,6 +27644,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000E
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestEnumsResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27426,6 +27662,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x000F
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestNullableOptionalResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27441,6 +27678,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0010
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestComplexNullableOptionalResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27478,6 +27716,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0011
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'SimpleStructResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27493,6 +27732,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0012
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27510,6 +27750,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0013
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27525,6 +27766,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0014
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestEmitTestEventResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -27544,6 +27786,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC05
             command_id: typing.ClassVar[int] = 0x0015
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = 'TestEmitTestFabricScopedEventResponse'
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -29040,6 +29283,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC06
             command_id: typing.ClassVar[int] = 0x0000
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
@@ -29063,6 +29307,7 @@
             cluster_id: typing.ClassVar[int] = 0xFFF1FC06
             command_id: typing.ClassVar[int] = 0x0001
             is_client: typing.ClassVar[bool] = True
+            response_type: typing.ClassVar[str] = None
 
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
diff --git a/src/controller/python/chip/yaml/__init__.py b/src/controller/python/chip/yaml/__init__.py
new file mode 100644
index 0000000..055bec9
--- /dev/null
+++ b/src/controller/python/chip/yaml/__init__.py
@@ -0,0 +1,23 @@
+#
+#    Copyright (c) 2022 Project CHIP Authors
+#    All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+#
+#    @file
+#      Provides Python APIs for Matter.
+
+"""Provides yaml parser Python APIs for Matter."""
+from . import parser
diff --git a/src/controller/python/chip/yaml/data_model_lookup.py b/src/controller/python/chip/yaml/data_model_lookup.py
new file mode 100644
index 0000000..1e0c3ff
--- /dev/null
+++ b/src/controller/python/chip/yaml/data_model_lookup.py
@@ -0,0 +1,55 @@
+#
+#    Copyright (c) 2022 Project CHIP Authors
+#    All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+from abc import ABC, abstractmethod
+import chip.clusters as Clusters
+
+
+class DataModelLookup(ABC):
+    @abstractmethod
+    def get_cluster(self, cluster: str):
+        pass
+
+    @abstractmethod
+    def get_command(self, cluster: str, command: str):
+        pass
+
+    @abstractmethod
+    def get_attribute(self, cluster: str, attribute: str):
+        pass
+
+
+class PreDefinedDataModelLookup(DataModelLookup):
+    def get_cluster(self, cluster: str):
+        try:
+            return getattr(Clusters, cluster, None)
+        except AttributeError:
+            return None
+
+    def get_command(self, cluster: str, command: str):
+        try:
+            commands = getattr(Clusters, cluster, None).Commands
+            return getattr(commands, command, None)
+        except AttributeError:
+            return None
+
+    def get_attribute(self, cluster: str, attribute: str):
+        try:
+            attributes = getattr(Clusters, cluster, None).Attributes
+            return getattr(attributes, attribute, None)
+        except AttributeError:
+            return None
diff --git a/src/controller/python/chip/yaml/errors.py b/src/controller/python/chip/yaml/errors.py
new file mode 100644
index 0000000..e6c9012
--- /dev/null
+++ b/src/controller/python/chip/yaml/errors.py
@@ -0,0 +1,30 @@
+#
+#    Copyright (c) 2022 Project CHIP Authors
+#    All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+class ParsingError(ValueError):
+    def __init__(self, message):
+        super().__init__(message)
+
+
+class UnexpectedParsingError(ParsingError):
+    def __init__(self, message):
+        super().__init__(message)
+
+
+class ValidationError(Exception):
+    def __init__(self, message):
+        super().__init__(message)
diff --git a/src/controller/python/chip/yaml/format_converter.py b/src/controller/python/chip/yaml/format_converter.py
new file mode 100644
index 0000000..11e38f8
--- /dev/null
+++ b/src/controller/python/chip/yaml/format_converter.py
@@ -0,0 +1,126 @@
+#
+#    Copyright (c) 2022 Project CHIP Authors
+#    All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+import typing
+from chip.clusters.Types import Nullable, NullValue
+from chip.tlv import uint, float32
+import enum
+from chip.yaml.errors import ValidationError
+
+
+_HEX_PREFIX = 'hex:'
+
+
+def convert_name_value_pair_to_dict(arg_values):
+    ''' Fix yaml command arguments.
+
+    For some reason, instead of treating the entire data payload of a
+    command as a singular struct, the top-level args are specified as 'name'
+    and 'value' pairs, while the payload of each argument is itself
+    correctly encapsulated. This fixes up this oddity to create a new
+    key/value pair with the key being the value of the 'name' field, and
+    the value being 'value' field.
+    '''
+    ret_value = {}
+
+    for item in arg_values:
+        ret_value[item['name']] = item['value']
+
+    return ret_value
+
+
+def convert_yaml_type(field_value, field_type, use_from_dict=False):
+    ''' Converts yaml value to expected type.
+
+    The YAML representation when converted to a Python dictionary does not
+    quite line up in terms of type (see each of the specific if branches
+    below for the rationale for the necessary fix-ups). This function does
+    a fix-up given a field value (as present in the YAML) and its matching
+    cluster object type and returns it.
+    '''
+    origin = typing.get_origin(field_type)
+
+    if field_value is None:
+        field_value = NullValue
+
+    if (origin == typing.Union or origin == typing.Optional or origin == Nullable):
+        underlying_field_type = None
+
+        if field_value is NullValue:
+            for t in typing.get_args(field_type):
+                if t == Nullable:
+                    return field_value
+
+        for t in typing.get_args(field_type):
+            # Comparison below explicitly not using 'isinstance' as that doesn't do what we want.
+            if t != Nullable and t != type(None):
+                underlying_field_type = t
+                break
+
+        if (underlying_field_type is None):
+            raise ValueError(f"Can't find the underling type for {field_type}")
+
+        field_type = underlying_field_type
+
+    # Dictionary represents a data model struct.
+    if (type(field_value) is dict):
+        return_field_value = {}
+        field_descriptors = field_type.descriptor
+        for item in field_value:
+            try:
+                # We search for a matching item in the list of field descriptors
+                # for this struct and ensure we can find a field with a matching
+                # label.
+                field_descriptor = next(
+                    x for x in field_descriptors.Fields if x.Label.lower() ==
+                    item.lower())
+            except StopIteration as exc:
+                raise ValidationError(
+                    f'Did not find field "{item}" in {str(field_type)}') from None
+
+            return_field_value[field_descriptor.Label] = convert_yaml_type(
+                field_value[item], field_descriptor.Type, use_from_dict)
+        if use_from_dict:
+            return field_type.FromDict(return_field_value)
+        return return_field_value
+    elif(type(field_value) is float):
+        return float32(field_value)
+    # list represents a data model list
+    elif(type(field_value) is list):
+        list_element_type = typing.get_args(field_type)[0]
+
+        # The field type passed in is the type of the list element and not list[T].
+        for idx, item in enumerate(field_value):
+            field_value[idx] = convert_yaml_type(item, list_element_type, use_from_dict)
+        return field_value
+    # YAML conversion treats all numbers as ints. Convert to a uint type if the schema
+    # type indicates so.
+    elif (field_type == uint):
+        # Longer number are stored as strings. Need to make this conversion first.
+        value = int(field_value)
+        return field_type(value)
+    # YAML treats enums as ints. Convert to the typed enum class.
+    elif (issubclass(field_type, enum.Enum)):
+        return field_type(field_value)
+    # YAML treats bytes as strings. Convert to a byte string.
+    elif (field_type == bytes and type(field_value) != bytes):
+        if isinstance(field_value, str) and field_value.startswith(_HEX_PREFIX):
+            return bytes.fromhex(field_value[len(_HEX_PREFIX):])
+        return str.encode(field_value)
+    # By default, just return the field_value casted to field_type.
+    else:
+        return field_type(field_value)
diff --git a/src/controller/python/chip/yaml/parser.py b/src/controller/python/chip/yaml/parser.py
new file mode 100644
index 0000000..67fc363
--- /dev/null
+++ b/src/controller/python/chip/yaml/parser.py
@@ -0,0 +1,371 @@
+#
+#    Copyright (c) 2022 Project CHIP Authors
+#    All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+from abc import ABC, abstractmethod
+from dataclasses import field
+import typing
+from chip import ChipDeviceCtrl
+from chip.tlv import float32
+import yaml
+import stringcase
+import chip.interaction_model
+import asyncio as asyncio
+import logging
+import math
+from chip.yaml.errors import ParsingError, UnexpectedParsingError
+from .data_model_lookup import *
+import chip.yaml.format_converter as Converter
+
+_SUCCESS_STATUS_CODE = "SUCCESS"
+logger = logging.getLogger('YamlParser')
+
+
+class BaseAction(ABC):
+    '''Interface for a single yaml action that is to be executed.'''
+
+    def __init__(self, label):
+        self._label = label
+
+    @property
+    def label(self):
+        return self._label
+
+    @abstractmethod
+    def run_action(self, dev_ctrl: ChipDeviceCtrl, endpoint: int, node_id: int):
+        pass
+
+
+class InvokeAction(BaseAction):
+    '''Single invoke action to be executed including validation of response.'''
+
+    def __init__(self, item: dict, cluster: str, data_model_lookup: DataModelLookup):
+        '''Parse cluster invoke from yaml test configuration.
+
+        Args:
+          'item': Dictionary containing single invoke to be parsed.
+          'cluster': Name of cluster which to invoke action is targeting.
+          'data_model_lookup': Data model lookup to get attribute object.
+        Raises:
+          ParsingError: Raised if there is a benign error, and there is currently no
+            action to perform for this write attribute.
+          UnexpectedParsingError: Raised if there is an unexpected parsing error.
+        '''
+        super().__init__(item['label'])
+        self._command_name = stringcase.pascalcase(item['command'])
+        self._cluster = cluster
+        self._request_object = None
+        self._expected_raw_response: dict = field(default_factory=dict)
+        self._expected_response_object = None
+
+        command = data_model_lookup.get_command(self._cluster, self._command_name)
+
+        if command is None:
+            raise ParsingError(
+                f'Failed to find cluster:{self._cluster} Command:{self._command_name}')
+
+        command_object = command()
+        if (item.get('arguments')):
+            args = item['arguments']['values']
+
+            request_data_as_dict = Converter.convert_name_value_pair_to_dict(args)
+
+            try:
+                request_data = Converter.convert_yaml_type(
+                    request_data_as_dict, type(command_object))
+            except ValueError:
+                raise ParsingError('Could not covert yaml type')
+
+            # Create a cluster object for the request from the provided YAML data.
+            self._request_object = command_object.FromDict(request_data)
+        else:
+            self._request_object = command_object
+
+        self._expected_raw_response = item.get('response')
+
+        if (self._request_object.response_type is not None and
+                self._expected_raw_response is not None and
+                self._expected_raw_response.get('values')):
+            response_type = stringcase.pascalcase(self._request_object.response_type)
+            expected_command = data_model_lookup.get_command(self._cluster, response_type)
+            expected_response_args = self._expected_raw_response['values']
+            expected_response_data_as_dict = Converter.convert_name_value_pair_to_dict(
+                expected_response_args)
+            expected_response_data = Converter.convert_yaml_type(
+                expected_response_data_as_dict, expected_command)
+            self._expected_response_object = expected_command.FromDict(expected_response_data)
+
+    def run_action(self, dev_ctrl: ChipDeviceCtrl, endpoint: int, node_id: int):
+        try:
+            resp = asyncio.run(dev_ctrl.SendCommand(node_id, endpoint, self._request_object))
+        except chip.interaction_model.InteractionModelError:
+            if self._expected_raw_response is None:
+                raise
+
+            expected_status_code = self._expected_raw_response.get('error')
+            if expected_status_code is not None and expected_status_code != _SUCCESS_STATUS_CODE:
+                logger.debug('Got error response, but was expected')
+            else:
+                raise
+
+        if (self._expected_response_object is not None):
+            if (self._expected_response_object != resp):
+                logger.error(f'Expected response {self._expected_response_object} did not match '
+                             f'actual object {resp}')
+
+
+class ReadAttributeAction(BaseAction):
+    '''Single read attribute action to be executed including validation.'''
+
+    def __init__(self, item: dict, cluster: str, data_model_lookup: DataModelLookup):
+        '''Parse read attribute action from yaml test configuration.
+
+        Args:
+          'item': Dictionary contains single read attribute action to be parsed.
+          'cluster': Name of cluster read attribute action is targeting.
+          'data_model_lookup': Data model lookup to get attribute object.
+        Raises:
+          ParsingError: Raised if there is a benign error, and there is currently no
+            action to perform for this read attribute.
+          UnexpectedParsingError: Raised if there is an unexpected parsing error.
+        '''
+        super().__init__(item['label'])
+        self._attribute_name = stringcase.pascalcase(item['attribute'])
+        self._cluster = cluster
+        self._cluster_object = None
+        self._request_object = None
+        self._expected_raw_response: dict = field(default_factory=dict)
+        self._expected_response_object: None = None
+        self._possibly_unsupported = False
+
+        self._cluster_object = data_model_lookup.get_cluster(self._cluster)
+        if self._cluster_object is None:
+            raise UnexpectedParsingError(
+                f'ReadAttribute failed to find cluster object:{self._cluster}')
+
+        self._request_object = data_model_lookup.get_attribute(self._cluster, self._attribute_name)
+        if self._request_object is None:
+            raise ParsingError(
+                f'ReadAttribute failed to find cluster:{self._cluster} '
+                f'Attribute:{self._attribute_name}')
+
+        if (item.get('arguments')):
+            raise UnexpectedParsingError(
+                f'ReadAttribute should not contain arguments. {self.label}')
+
+        if self._request_object.attribute_type is None:
+            raise UnexpectedParsingError(
+                f'ReadAttribute doesnt have valid attribute_type. {self.label}')
+
+        self._expected_raw_response = item.get('response')
+        if (self._expected_raw_response is None):
+            raise UnexpectedParsingError(f'ReadAttribute missing expected response. {self.label}')
+
+        if 'optional' in item:
+            self._possibly_unsupported = True
+
+        if 'value' in self._expected_raw_response:
+            self._expected_response_object = self._request_object.attribute_type.Type
+            expected_response_value = self._expected_raw_response['value']
+            self._expected_response_data = Converter.convert_yaml_type(
+                expected_response_value, self._expected_response_object, use_from_dict=True)
+
+    def run_action(self, dev_ctrl: ChipDeviceCtrl, endpoint: int, node_id: int):
+        try:
+            resp = asyncio.run(dev_ctrl.ReadAttribute(node_id, [(self._request_object)]))
+        except chip.interaction_model.InteractionModelError:
+            if self._expected_raw_response is None:
+                raise
+
+            expected_status_code = self._expected_raw_response.get('error')
+            if expected_status_code is not None and expected_status_code != _SUCCESS_STATUS_CODE:
+                logger.debug('Got error response, but was expected')
+            else:
+                raise
+
+        if self._possibly_unsupported and not resp:
+            # We have found an unsupported attribute. Parsed test did specify that it might be
+            # unsupported, so nothing left to validate.
+            return
+
+        # TODO: There is likely an issue here with Optional fields since None
+        if (self._expected_response_object is not None):
+            parsed_resp = resp[endpoint][self._cluster_object][self._request_object]
+
+            if (self._expected_response_data != parsed_resp):
+                # TODO: It is debatable if this is the right thing to be doing here. This might
+                # need a follow up cleanup.
+                if (self._expected_response_object != float32 or
+                        not math.isclose(self._expected_response_data, parsed_resp, rel_tol=1e-6)):
+                    logger.error(f'Expected response {self._expected_response_data} didnt match '
+                                 f'actual object {parsed_resp}')
+
+
+class WriteAttributeAction(BaseAction):
+    '''Single write attribute action to be executed including validation.'''
+
+    def __init__(self, item: dict, cluster: str, data_model_lookup: DataModelLookup):
+        '''Parse write attribute action from yaml test configuration.
+
+        Args:
+          'item': Dictionary contains single write attribute action to be parsed.
+          'cluster': Name of cluster write attribute action is targeting.
+          'data_model_lookup': Data model lookup to get attribute object.
+        Raises:
+          ParsingError: Raised if there is a benign error, and there is currently no
+            action to perform for this write attribute.
+          UnexpectedParsingError: Raised if there is an unexpected parsing error.
+        '''
+        super().__init__(item['label'])
+        self._attribute_name = stringcase.pascalcase(item['attribute'])
+        self._cluster = cluster
+        self._request_object = None
+
+        attribute = data_model_lookup.get_attribute(self._cluster, self._attribute_name)
+        if attribute is None:
+            raise ParsingError(
+                f'WriteAttribute failed to find cluster:{self._cluster} '
+                f'Attribute:{self._attribute_name}')
+
+        if (item.get('arguments')):
+            args = item['arguments']['value']
+            try:
+                request_data = Converter.convert_yaml_type(
+                    args, attribute.attribute_type.Type)
+            except ValueError:
+                raise ParsingError('Could not covert yaml type')
+
+            # Create a cluster object for the request from the provided YAML data.
+            self._request_object = attribute(request_data)
+        else:
+            raise UnexpectedParsingError(f'WriteAttribute action does have arguments {self.label}')
+
+    def run_action(self, dev_ctrl: ChipDeviceCtrl, endpoint: int, node_id: int):
+        try:
+            resp = asyncio.run(
+                dev_ctrl.WriteAttribute(node_id, [(endpoint, self._request_object)]))
+        except chip.interaction_model.InteractionModelError:
+            if (self.expected_raw_response is not None and
+                    self.expected_raw_response.get('error')):
+                logger.debug('Got error, but was expected')
+            else:
+                raise
+
+        # TODO: confirm resp give a Success value, although not all write action are expected
+        # to succeed, hence why this is a todo and not simply just done. Below is example of
+        # what success check might look like.
+        # asserts.assert_equal(resp[0].Status, StatusEnum.Success, 'label write must succeed')
+
+
+class YamlTestParser:
+    '''Parses the test YAMLs and converts to a more natural Pythonic representation.
+
+    The parser also permits execution of those tests there-after.
+    '''
+
+    def __init__(self, yaml_path: str):
+        '''Constructor that parser the given a path to YAML test file.'''
+        with open(yaml_path, 'r') as stream:
+            try:
+                self._raw_data = yaml.safe_load(stream)
+            except yaml.YAMLError as exc:
+                raise exc
+
+        self._name = self._raw_data['name']
+        self._node_id = self._raw_data['config']['nodeId']
+        self._cluster = self._raw_data['config'].get('cluster')
+        if self._cluster:
+            self._cluster = self._cluster.replace(' ', '')
+        self._endpoint = self._raw_data['config']['endpoint']
+        self._base_action_test_list = []
+        self._data_model_lookup = PreDefinedDataModelLookup()
+
+        for item in self._raw_data['tests']:
+            # This currently behaves differently than the c++ version. We are evaluating if test
+            # is disabled before anything else, allowing for incorrectly named commands.
+            if item.get('disabled'):
+                logger.info(f"Test is disabled, skipping {item['label']}")
+                continue
+
+            action = None
+            cluster = self._cluster
+            # Some of the tests contain 'cluster over-rides' that refer to a different
+            # cluster than that specified in 'config'.
+            if (item.get('cluster')):
+                cluster = item.get('cluster').replace(' ', '').replace('/', '')
+            if item['command'] == 'writeAttribute':
+                action = self._attribute_write_action_factory(item, cluster)
+            elif item['command'] == 'readAttribute':
+                action = self._attribute_read_action_factory(item, cluster)
+            else:
+                action = self._invoke_action_factory(item, cluster)
+
+            if action is not None:
+                self._base_action_test_list.append(action)
+            else:
+                logger.warn(f"Failed to parse {item['label']}")
+
+    def _invoke_action_factory(self, item: dict, cluster: str):
+        '''Parse cluster command from yaml test configuration.
+
+        Args:
+          'item': Dictionary contains single cluster action test to be parsed
+          'cluster': Name of cluster action is targeting.
+        Returns:
+          InvokeAction if 'item' is a valid action to be executed.
+          None if 'item' was not parsed for a known reason that is not fatal.
+        '''
+        try:
+            return InvokeAction(item, cluster, self._data_model_lookup)
+        except ParsingError:
+            return None
+
+    def _attribute_read_action_factory(self, item: dict, cluster: str):
+        '''Parse read attribute action from yaml test configuration.
+
+        Args:
+          'item': Dictionary contains single read attribute action to be parsed.
+          'cluster': Name of cluster read attribute action is targeting.
+        Returns:
+          ReadAttributeAction if 'item' is a valid action to be executed.
+          None if 'item' was not parsed for a known reason that is not fatal.
+        '''
+        try:
+            return ReadAttributeAction(item, cluster, self._data_model_lookup)
+        except ParsingError:
+            return None
+
+    def _attribute_write_action_factory(self, item: dict, cluster: str):
+        '''Parse write attribute action from yaml test configuration.
+
+        Args:
+          'item': Dictionary contains single write attribute action to be parsed.
+          'cluster': Name of cluster write attribute action is targeting.
+        Returns:
+          WriteAttributeAction if 'item' is a valid action to be executed.
+          None if 'item' was not parsed for a known reason that is not fatal.
+        '''
+        try:
+            return WriteAttributeAction(item, cluster, self._data_model_lookup)
+        except ParsingError:
+            return None
+
+    def execute_tests(self, dev_ctrl: ChipDeviceCtrl):
+        '''Executes parsed YAML tests.'''
+        for idx, action in enumerate(self._base_action_test_list):
+            logger.info(f'test: {idx} -- Executing{action.label}')
+
+            action.run_action(dev_ctrl, self._endpoint, self._node_id)
diff --git a/src/controller/python/templates/python-cluster-Objects-py.zapt b/src/controller/python/templates/python-cluster-Objects-py.zapt
index 875a459..5695721 100644
--- a/src/controller/python/templates/python-cluster-Objects-py.zapt
+++ b/src/controller/python/templates/python-cluster-Objects-py.zapt
@@ -90,6 +90,12 @@
             is_client: typing.ClassVar[bool] = True
 {{/if}}       
 
+            {{~#if responseName}}
+            response_type: typing.ClassVar[str] = '{{asUpperCamelCase responseName}}'
+            {{else}}
+            response_type: typing.ClassVar[str] = None
+            {{/if}}
+
             @ChipUtility.classproperty
             def descriptor(cls) -> ClusterObjectDescriptor:
                 return ClusterObjectDescriptor(