/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

// THIS FILE IS GENERATED BY ZAP

package chip.devicecontroller;

import chip.clusterinfo.CommandParameterInfo;
import chip.clusterinfo.InteractionInfo;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class ClusterReadMapping {

  public Map<String, Map<String, InteractionInfo>> getReadAttributeMap() {
    Map<String, Map<String, InteractionInfo>> readAttributeMap = new HashMap<>();
    Map<String, InteractionInfo> readIdentifyInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readIdentifyIdentifyTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIdentifyIdentifyTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .readIdentifyTimeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIdentifyIdentifyTimeCommandParams);
    readIdentifyInteractionInfo.put(
        "readIdentifyTimeAttribute", readIdentifyIdentifyTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIdentifyIdentifyTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIdentifyIdentifyTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .readIdentifyTypeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIdentifyIdentifyTypeCommandParams);
    readIdentifyInteractionInfo.put(
        "readIdentifyTypeAttribute", readIdentifyIdentifyTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIdentifyGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIdentifyGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.IdentifyCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedIdentifyClusterGeneratedCommandListAttributeCallback(),
            readIdentifyGeneratedCommandListCommandParams);
    readIdentifyInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readIdentifyGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIdentifyAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIdentifyAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.IdentifyCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedIdentifyClusterAcceptedCommandListAttributeCallback(),
            readIdentifyAcceptedCommandListCommandParams);
    readIdentifyInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readIdentifyAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIdentifyAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIdentifyAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.IdentifyCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIdentifyClusterAttributeListAttributeCallback(),
            readIdentifyAttributeListCommandParams);
    readIdentifyInteractionInfo.put(
        "readAttributeListAttribute", readIdentifyAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIdentifyFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIdentifyFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readIdentifyFeatureMapCommandParams);
    readIdentifyInteractionInfo.put(
        "readFeatureMapAttribute", readIdentifyFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIdentifyClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIdentifyClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIdentifyClusterRevisionCommandParams);
    readIdentifyInteractionInfo.put(
        "readClusterRevisionAttribute", readIdentifyClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("identify", readIdentifyInteractionInfo);
    Map<String, InteractionInfo> readGroupsInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readGroupsNameSupportCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupsNameSupportAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupsCluster) cluster)
                  .readNameSupportAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGroupsNameSupportCommandParams);
    readGroupsInteractionInfo.put(
        "readNameSupportAttribute", readGroupsNameSupportAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupsGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.GroupsCluster.GeneratedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGroupsClusterGeneratedCommandListAttributeCallback(),
            readGroupsGeneratedCommandListCommandParams);
    readGroupsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readGroupsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.GroupsCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedGroupsClusterAcceptedCommandListAttributeCallback(),
            readGroupsAcceptedCommandListCommandParams);
    readGroupsInteractionInfo.put(
        "readAcceptedCommandListAttribute", readGroupsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.GroupsCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedGroupsClusterAttributeListAttributeCallback(),
            readGroupsAttributeListCommandParams);
    readGroupsInteractionInfo.put(
        "readAttributeListAttribute", readGroupsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readGroupsFeatureMapCommandParams);
    readGroupsInteractionInfo.put(
        "readFeatureMapAttribute", readGroupsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGroupsClusterRevisionCommandParams);
    readGroupsInteractionInfo.put(
        "readClusterRevisionAttribute", readGroupsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("groups", readGroupsInteractionInfo);
    Map<String, InteractionInfo> readScenesInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readScenesSceneCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesSceneCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readSceneCountAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readScenesSceneCountCommandParams);
    readScenesInteractionInfo.put(
        "readSceneCountAttribute", readScenesSceneCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesCurrentSceneCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesCurrentSceneAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readCurrentSceneAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readScenesCurrentSceneCommandParams);
    readScenesInteractionInfo.put(
        "readCurrentSceneAttribute", readScenesCurrentSceneAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesCurrentGroupCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesCurrentGroupAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readCurrentGroupAttribute(
                      (ChipClusters.ScenesCluster.CurrentGroupAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readScenesCurrentGroupCommandParams);
    readScenesInteractionInfo.put(
        "readCurrentGroupAttribute", readScenesCurrentGroupAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesSceneValidCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesSceneValidAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readSceneValidAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readScenesSceneValidCommandParams);
    readScenesInteractionInfo.put(
        "readSceneValidAttribute", readScenesSceneValidAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesNameSupportCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesNameSupportAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readNameSupportAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readScenesNameSupportCommandParams);
    readScenesInteractionInfo.put(
        "readNameSupportAttribute", readScenesNameSupportAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ScenesCluster.GeneratedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedScenesClusterGeneratedCommandListAttributeCallback(),
            readScenesGeneratedCommandListCommandParams);
    readScenesInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readScenesGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ScenesCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedScenesClusterAcceptedCommandListAttributeCallback(),
            readScenesAcceptedCommandListCommandParams);
    readScenesInteractionInfo.put(
        "readAcceptedCommandListAttribute", readScenesAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ScenesCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedScenesClusterAttributeListAttributeCallback(),
            readScenesAttributeListCommandParams);
    readScenesInteractionInfo.put(
        "readAttributeListAttribute", readScenesAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readScenesFeatureMapCommandParams);
    readScenesInteractionInfo.put(
        "readFeatureMapAttribute", readScenesFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readScenesClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readScenesClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ScenesCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readScenesClusterRevisionCommandParams);
    readScenesInteractionInfo.put(
        "readClusterRevisionAttribute", readScenesClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("scenes", readScenesInteractionInfo);
    Map<String, InteractionInfo> readOnOffInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readOnOffOnOffCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffOnOffAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readOnOffAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readOnOffOnOffCommandParams);
    readOnOffInteractionInfo.put("readOnOffAttribute", readOnOffOnOffAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffGlobalSceneControlCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffGlobalSceneControlAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readGlobalSceneControlAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readOnOffGlobalSceneControlCommandParams);
    readOnOffInteractionInfo.put(
        "readGlobalSceneControlAttribute", readOnOffGlobalSceneControlAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffOnTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffOnTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readOnTimeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOnOffOnTimeCommandParams);
    readOnOffInteractionInfo.put("readOnTimeAttribute", readOnOffOnTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffOffWaitTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffOffWaitTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readOffWaitTimeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOnOffOffWaitTimeCommandParams);
    readOnOffInteractionInfo.put(
        "readOffWaitTimeAttribute", readOnOffOffWaitTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffStartUpOnOffCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffStartUpOnOffAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readStartUpOnOffAttribute(
                      (ChipClusters.OnOffCluster.StartUpOnOffAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOnOffStartUpOnOffCommandParams);
    readOnOffInteractionInfo.put(
        "readStartUpOnOffAttribute", readOnOffStartUpOnOffAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.OnOffCluster.GeneratedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedOnOffClusterGeneratedCommandListAttributeCallback(),
            readOnOffGeneratedCommandListCommandParams);
    readOnOffInteractionInfo.put(
        "readGeneratedCommandListAttribute", readOnOffGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.OnOffCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedOnOffClusterAcceptedCommandListAttributeCallback(),
            readOnOffAcceptedCommandListCommandParams);
    readOnOffInteractionInfo.put(
        "readAcceptedCommandListAttribute", readOnOffAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.OnOffCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedOnOffClusterAttributeListAttributeCallback(),
            readOnOffAttributeListCommandParams);
    readOnOffInteractionInfo.put(
        "readAttributeListAttribute", readOnOffAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readOnOffFeatureMapCommandParams);
    readOnOffInteractionInfo.put(
        "readFeatureMapAttribute", readOnOffFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOnOffClusterRevisionCommandParams);
    readOnOffInteractionInfo.put(
        "readClusterRevisionAttribute", readOnOffClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("onOff", readOnOffInteractionInfo);
    Map<String, InteractionInfo> readOnOffSwitchConfigurationInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readOnOffSwitchConfigurationSwitchTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffSwitchConfigurationSwitchTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .readSwitchTypeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOnOffSwitchConfigurationSwitchTypeCommandParams);
    readOnOffSwitchConfigurationInteractionInfo.put(
        "readSwitchTypeAttribute", readOnOffSwitchConfigurationSwitchTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffSwitchConfigurationSwitchActionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffSwitchConfigurationSwitchActionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .readSwitchActionsAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOnOffSwitchConfigurationSwitchActionsCommandParams);
    readOnOffSwitchConfigurationInteractionInfo.put(
        "readSwitchActionsAttribute",
        readOnOffSwitchConfigurationSwitchActionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readOnOffSwitchConfigurationGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffSwitchConfigurationGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.OnOffSwitchConfigurationCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOnOffSwitchConfigurationClusterGeneratedCommandListAttributeCallback(),
            readOnOffSwitchConfigurationGeneratedCommandListCommandParams);
    readOnOffSwitchConfigurationInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readOnOffSwitchConfigurationGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffSwitchConfigurationAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffSwitchConfigurationAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.OnOffSwitchConfigurationCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOnOffSwitchConfigurationClusterAcceptedCommandListAttributeCallback(),
            readOnOffSwitchConfigurationAcceptedCommandListCommandParams);
    readOnOffSwitchConfigurationInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readOnOffSwitchConfigurationAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffSwitchConfigurationAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffSwitchConfigurationAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.OnOffSwitchConfigurationCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOnOffSwitchConfigurationClusterAttributeListAttributeCallback(),
            readOnOffSwitchConfigurationAttributeListCommandParams);
    readOnOffSwitchConfigurationInteractionInfo.put(
        "readAttributeListAttribute",
        readOnOffSwitchConfigurationAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffSwitchConfigurationFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffSwitchConfigurationFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readOnOffSwitchConfigurationFeatureMapCommandParams);
    readOnOffSwitchConfigurationInteractionInfo.put(
        "readFeatureMapAttribute", readOnOffSwitchConfigurationFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOnOffSwitchConfigurationClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOnOffSwitchConfigurationClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOnOffSwitchConfigurationClusterRevisionCommandParams);
    readOnOffSwitchConfigurationInteractionInfo.put(
        "readClusterRevisionAttribute",
        readOnOffSwitchConfigurationClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("onOffSwitchConfiguration", readOnOffSwitchConfigurationInteractionInfo);
    Map<String, InteractionInfo> readLevelControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readLevelControlCurrentLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlCurrentLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readCurrentLevelAttribute(
                      (ChipClusters.LevelControlCluster.CurrentLevelAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlCurrentLevelCommandParams);
    readLevelControlInteractionInfo.put(
        "readCurrentLevelAttribute", readLevelControlCurrentLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlRemainingTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlRemainingTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readRemainingTimeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlRemainingTimeCommandParams);
    readLevelControlInteractionInfo.put(
        "readRemainingTimeAttribute", readLevelControlRemainingTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlMinLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlMinLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readMinLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlMinLevelCommandParams);
    readLevelControlInteractionInfo.put(
        "readMinLevelAttribute", readLevelControlMinLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlMaxLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlMaxLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readMaxLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlMaxLevelCommandParams);
    readLevelControlInteractionInfo.put(
        "readMaxLevelAttribute", readLevelControlMaxLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlCurrentFrequencyCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlCurrentFrequencyAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readCurrentFrequencyAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlCurrentFrequencyCommandParams);
    readLevelControlInteractionInfo.put(
        "readCurrentFrequencyAttribute", readLevelControlCurrentFrequencyAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlMinFrequencyCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlMinFrequencyAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readMinFrequencyAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlMinFrequencyCommandParams);
    readLevelControlInteractionInfo.put(
        "readMinFrequencyAttribute", readLevelControlMinFrequencyAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlMaxFrequencyCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlMaxFrequencyAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readMaxFrequencyAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlMaxFrequencyCommandParams);
    readLevelControlInteractionInfo.put(
        "readMaxFrequencyAttribute", readLevelControlMaxFrequencyAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlOptionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlOptionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readOptionsAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlOptionsCommandParams);
    readLevelControlInteractionInfo.put(
        "readOptionsAttribute", readLevelControlOptionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlOnOffTransitionTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlOnOffTransitionTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readOnOffTransitionTimeAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlOnOffTransitionTimeCommandParams);
    readLevelControlInteractionInfo.put(
        "readOnOffTransitionTimeAttribute",
        readLevelControlOnOffTransitionTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlOnLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlOnLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readOnLevelAttribute(
                      (ChipClusters.LevelControlCluster.OnLevelAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlOnLevelCommandParams);
    readLevelControlInteractionInfo.put(
        "readOnLevelAttribute", readLevelControlOnLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlOnTransitionTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlOnTransitionTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readOnTransitionTimeAttribute(
                      (ChipClusters.LevelControlCluster.OnTransitionTimeAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlOnTransitionTimeCommandParams);
    readLevelControlInteractionInfo.put(
        "readOnTransitionTimeAttribute", readLevelControlOnTransitionTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlOffTransitionTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlOffTransitionTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readOffTransitionTimeAttribute(
                      (ChipClusters.LevelControlCluster.OffTransitionTimeAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlOffTransitionTimeCommandParams);
    readLevelControlInteractionInfo.put(
        "readOffTransitionTimeAttribute",
        readLevelControlOffTransitionTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlDefaultMoveRateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlDefaultMoveRateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readDefaultMoveRateAttribute(
                      (ChipClusters.LevelControlCluster.DefaultMoveRateAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlDefaultMoveRateCommandParams);
    readLevelControlInteractionInfo.put(
        "readDefaultMoveRateAttribute", readLevelControlDefaultMoveRateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlStartUpCurrentLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlStartUpCurrentLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readStartUpCurrentLevelAttribute(
                      (ChipClusters.LevelControlCluster.StartUpCurrentLevelAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlStartUpCurrentLevelCommandParams);
    readLevelControlInteractionInfo.put(
        "readStartUpCurrentLevelAttribute",
        readLevelControlStartUpCurrentLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.LevelControlCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedLevelControlClusterGeneratedCommandListAttributeCallback(),
            readLevelControlGeneratedCommandListCommandParams);
    readLevelControlInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readLevelControlGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.LevelControlCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedLevelControlClusterAcceptedCommandListAttributeCallback(),
            readLevelControlAcceptedCommandListCommandParams);
    readLevelControlInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readLevelControlAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.LevelControlCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedLevelControlClusterAttributeListAttributeCallback(),
            readLevelControlAttributeListCommandParams);
    readLevelControlInteractionInfo.put(
        "readAttributeListAttribute", readLevelControlAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readLevelControlFeatureMapCommandParams);
    readLevelControlInteractionInfo.put(
        "readFeatureMapAttribute", readLevelControlFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLevelControlClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLevelControlClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLevelControlClusterRevisionCommandParams);
    readLevelControlInteractionInfo.put(
        "readClusterRevisionAttribute", readLevelControlClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("levelControl", readLevelControlInteractionInfo);
    Map<String, InteractionInfo> readBinaryInputBasicInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBinaryInputBasicOutOfServiceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicOutOfServiceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readOutOfServiceAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readBinaryInputBasicOutOfServiceCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readOutOfServiceAttribute", readBinaryInputBasicOutOfServiceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBinaryInputBasicPresentValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicPresentValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readPresentValueAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readBinaryInputBasicPresentValueCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readPresentValueAttribute", readBinaryInputBasicPresentValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBinaryInputBasicStatusFlagsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicStatusFlagsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readStatusFlagsAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBinaryInputBasicStatusFlagsCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readStatusFlagsAttribute", readBinaryInputBasicStatusFlagsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBinaryInputBasicGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BinaryInputBasicCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBinaryInputBasicClusterGeneratedCommandListAttributeCallback(),
            readBinaryInputBasicGeneratedCommandListCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readBinaryInputBasicGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBinaryInputBasicAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BinaryInputBasicCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBinaryInputBasicClusterAcceptedCommandListAttributeCallback(),
            readBinaryInputBasicAcceptedCommandListCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readBinaryInputBasicAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBinaryInputBasicAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BinaryInputBasicCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBinaryInputBasicClusterAttributeListAttributeCallback(),
            readBinaryInputBasicAttributeListCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readAttributeListAttribute", readBinaryInputBasicAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBinaryInputBasicFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBinaryInputBasicFeatureMapCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readFeatureMapAttribute", readBinaryInputBasicFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBinaryInputBasicClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBinaryInputBasicClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBinaryInputBasicClusterRevisionCommandParams);
    readBinaryInputBasicInteractionInfo.put(
        "readClusterRevisionAttribute",
        readBinaryInputBasicClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("binaryInputBasic", readBinaryInputBasicInteractionInfo);
    Map<String, InteractionInfo> readDescriptorInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readDescriptorDeviceListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorDeviceListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readDeviceListAttribute(
                      (ChipClusters.DescriptorCluster.DeviceListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedDescriptorClusterDeviceListAttributeCallback(),
            readDescriptorDeviceListCommandParams);
    readDescriptorInteractionInfo.put(
        "readDeviceListAttribute", readDescriptorDeviceListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorServerListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorServerListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readServerListAttribute(
                      (ChipClusters.DescriptorCluster.ServerListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedDescriptorClusterServerListAttributeCallback(),
            readDescriptorServerListCommandParams);
    readDescriptorInteractionInfo.put(
        "readServerListAttribute", readDescriptorServerListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorClientListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorClientListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readClientListAttribute(
                      (ChipClusters.DescriptorCluster.ClientListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedDescriptorClusterClientListAttributeCallback(),
            readDescriptorClientListCommandParams);
    readDescriptorInteractionInfo.put(
        "readClientListAttribute", readDescriptorClientListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorPartsListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorPartsListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readPartsListAttribute(
                      (ChipClusters.DescriptorCluster.PartsListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedDescriptorClusterPartsListAttributeCallback(),
            readDescriptorPartsListCommandParams);
    readDescriptorInteractionInfo.put(
        "readPartsListAttribute", readDescriptorPartsListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.DescriptorCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedDescriptorClusterGeneratedCommandListAttributeCallback(),
            readDescriptorGeneratedCommandListCommandParams);
    readDescriptorInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readDescriptorGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.DescriptorCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedDescriptorClusterAcceptedCommandListAttributeCallback(),
            readDescriptorAcceptedCommandListCommandParams);
    readDescriptorInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readDescriptorAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.DescriptorCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedDescriptorClusterAttributeListAttributeCallback(),
            readDescriptorAttributeListCommandParams);
    readDescriptorInteractionInfo.put(
        "readAttributeListAttribute", readDescriptorAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readDescriptorFeatureMapCommandParams);
    readDescriptorInteractionInfo.put(
        "readFeatureMapAttribute", readDescriptorFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDescriptorClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDescriptorClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DescriptorCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDescriptorClusterRevisionCommandParams);
    readDescriptorInteractionInfo.put(
        "readClusterRevisionAttribute", readDescriptorClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("descriptor", readDescriptorInteractionInfo);
    Map<String, InteractionInfo> readBindingInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBindingBindingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBindingBindingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BindingCluster) cluster)
                  .readBindingAttribute(
                      (ChipClusters.BindingCluster.BindingAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBindingClusterBindingAttributeCallback(),
            readBindingBindingCommandParams);
    readBindingInteractionInfo.put(
        "readBindingAttribute", readBindingBindingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBindingGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBindingGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BindingCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BindingCluster.GeneratedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBindingClusterGeneratedCommandListAttributeCallback(),
            readBindingGeneratedCommandListCommandParams);
    readBindingInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readBindingGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBindingAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBindingAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BindingCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BindingCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBindingClusterAcceptedCommandListAttributeCallback(),
            readBindingAcceptedCommandListCommandParams);
    readBindingInteractionInfo.put(
        "readAcceptedCommandListAttribute", readBindingAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBindingAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBindingAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BindingCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BindingCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBindingClusterAttributeListAttributeCallback(),
            readBindingAttributeListCommandParams);
    readBindingInteractionInfo.put(
        "readAttributeListAttribute", readBindingAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBindingFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBindingFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BindingCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBindingFeatureMapCommandParams);
    readBindingInteractionInfo.put(
        "readFeatureMapAttribute", readBindingFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBindingClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBindingClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BindingCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBindingClusterRevisionCommandParams);
    readBindingInteractionInfo.put(
        "readClusterRevisionAttribute", readBindingClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("binding", readBindingInteractionInfo);
    Map<String, InteractionInfo> readAccessControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readAccessControlAclCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlAclAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readAclAttribute(
                      (ChipClusters.AccessControlCluster.AclAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedAccessControlClusterAclAttributeCallback(),
            readAccessControlAclCommandParams);
    readAccessControlInteractionInfo.put(
        "readAclAttribute", readAccessControlAclAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlExtensionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlExtensionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readExtensionAttribute(
                      (ChipClusters.AccessControlCluster.ExtensionAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedAccessControlClusterExtensionAttributeCallback(),
            readAccessControlExtensionCommandParams);
    readAccessControlInteractionInfo.put(
        "readExtensionAttribute", readAccessControlExtensionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlSubjectsPerAccessControlEntryCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlSubjectsPerAccessControlEntryAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readSubjectsPerAccessControlEntryAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAccessControlSubjectsPerAccessControlEntryCommandParams);
    readAccessControlInteractionInfo.put(
        "readSubjectsPerAccessControlEntryAttribute",
        readAccessControlSubjectsPerAccessControlEntryAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlTargetsPerAccessControlEntryCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlTargetsPerAccessControlEntryAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readTargetsPerAccessControlEntryAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAccessControlTargetsPerAccessControlEntryCommandParams);
    readAccessControlInteractionInfo.put(
        "readTargetsPerAccessControlEntryAttribute",
        readAccessControlTargetsPerAccessControlEntryAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlAccessControlEntriesPerFabricCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlAccessControlEntriesPerFabricAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readAccessControlEntriesPerFabricAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAccessControlAccessControlEntriesPerFabricCommandParams);
    readAccessControlInteractionInfo.put(
        "readAccessControlEntriesPerFabricAttribute",
        readAccessControlAccessControlEntriesPerFabricAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.AccessControlCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAccessControlClusterGeneratedCommandListAttributeCallback(),
            readAccessControlGeneratedCommandListCommandParams);
    readAccessControlInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readAccessControlGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.AccessControlCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAccessControlClusterAcceptedCommandListAttributeCallback(),
            readAccessControlAcceptedCommandListCommandParams);
    readAccessControlInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readAccessControlAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.AccessControlCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAccessControlClusterAttributeListAttributeCallback(),
            readAccessControlAttributeListCommandParams);
    readAccessControlInteractionInfo.put(
        "readAttributeListAttribute", readAccessControlAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readAccessControlFeatureMapCommandParams);
    readAccessControlInteractionInfo.put(
        "readFeatureMapAttribute", readAccessControlFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccessControlClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccessControlClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccessControlCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAccessControlClusterRevisionCommandParams);
    readAccessControlInteractionInfo.put(
        "readClusterRevisionAttribute", readAccessControlClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("accessControl", readAccessControlInteractionInfo);
    Map<String, InteractionInfo> readBridgedActionsInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBridgedActionsActionListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsActionListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readActionListAttribute(
                      (ChipClusters.BridgedActionsCluster.ActionListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedBridgedActionsClusterActionListAttributeCallback(),
            readBridgedActionsActionListCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readActionListAttribute", readBridgedActionsActionListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedActionsEndpointListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsEndpointListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readEndpointListAttribute(
                      (ChipClusters.BridgedActionsCluster.EndpointListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBridgedActionsClusterEndpointListAttributeCallback(),
            readBridgedActionsEndpointListCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readEndpointListAttribute", readBridgedActionsEndpointListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedActionsSetupUrlCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsSetupUrlAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readSetupUrlAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedActionsSetupUrlCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readSetupUrlAttribute", readBridgedActionsSetupUrlAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedActionsGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BridgedActionsCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBridgedActionsClusterGeneratedCommandListAttributeCallback(),
            readBridgedActionsGeneratedCommandListCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readBridgedActionsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedActionsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BridgedActionsCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBridgedActionsClusterAcceptedCommandListAttributeCallback(),
            readBridgedActionsAcceptedCommandListCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readBridgedActionsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedActionsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BridgedActionsCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBridgedActionsClusterAttributeListAttributeCallback(),
            readBridgedActionsAttributeListCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readAttributeListAttribute", readBridgedActionsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedActionsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBridgedActionsFeatureMapCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readFeatureMapAttribute", readBridgedActionsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedActionsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedActionsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedActionsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBridgedActionsClusterRevisionCommandParams);
    readBridgedActionsInteractionInfo.put(
        "readClusterRevisionAttribute", readBridgedActionsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("bridgedActions", readBridgedActionsInteractionInfo);
    Map<String, InteractionInfo> readBasicInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBasicDataModelRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicDataModelRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readDataModelRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBasicDataModelRevisionCommandParams);
    readBasicInteractionInfo.put(
        "readDataModelRevisionAttribute", readBasicDataModelRevisionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicVendorNameCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicVendorNameAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readVendorNameAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicVendorNameCommandParams);
    readBasicInteractionInfo.put(
        "readVendorNameAttribute", readBasicVendorNameAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicVendorIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicVendorIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readVendorIDAttribute(
                      (ChipClusters.BasicCluster.VendorIDAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBasicVendorIDCommandParams);
    readBasicInteractionInfo.put(
        "readVendorIDAttribute", readBasicVendorIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicProductNameCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicProductNameAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readProductNameAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicProductNameCommandParams);
    readBasicInteractionInfo.put(
        "readProductNameAttribute", readBasicProductNameAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicProductIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicProductIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readProductIDAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBasicProductIDCommandParams);
    readBasicInteractionInfo.put(
        "readProductIDAttribute", readBasicProductIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicNodeLabelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicNodeLabelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readNodeLabelAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicNodeLabelCommandParams);
    readBasicInteractionInfo.put(
        "readNodeLabelAttribute", readBasicNodeLabelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicLocationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicLocationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readLocationAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicLocationCommandParams);
    readBasicInteractionInfo.put(
        "readLocationAttribute", readBasicLocationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicHardwareVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicHardwareVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readHardwareVersionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBasicHardwareVersionCommandParams);
    readBasicInteractionInfo.put(
        "readHardwareVersionAttribute", readBasicHardwareVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicHardwareVersionStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicHardwareVersionStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readHardwareVersionStringAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicHardwareVersionStringCommandParams);
    readBasicInteractionInfo.put(
        "readHardwareVersionStringAttribute",
        readBasicHardwareVersionStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicSoftwareVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicSoftwareVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readSoftwareVersionAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBasicSoftwareVersionCommandParams);
    readBasicInteractionInfo.put(
        "readSoftwareVersionAttribute", readBasicSoftwareVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicSoftwareVersionStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicSoftwareVersionStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readSoftwareVersionStringAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicSoftwareVersionStringCommandParams);
    readBasicInteractionInfo.put(
        "readSoftwareVersionStringAttribute",
        readBasicSoftwareVersionStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicManufacturingDateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicManufacturingDateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readManufacturingDateAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicManufacturingDateCommandParams);
    readBasicInteractionInfo.put(
        "readManufacturingDateAttribute", readBasicManufacturingDateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicPartNumberCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicPartNumberAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readPartNumberAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicPartNumberCommandParams);
    readBasicInteractionInfo.put(
        "readPartNumberAttribute", readBasicPartNumberAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicProductURLCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicProductURLAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readProductURLAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicProductURLCommandParams);
    readBasicInteractionInfo.put(
        "readProductURLAttribute", readBasicProductURLAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicProductLabelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicProductLabelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readProductLabelAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicProductLabelCommandParams);
    readBasicInteractionInfo.put(
        "readProductLabelAttribute", readBasicProductLabelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicSerialNumberCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicSerialNumberAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readSerialNumberAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicSerialNumberCommandParams);
    readBasicInteractionInfo.put(
        "readSerialNumberAttribute", readBasicSerialNumberAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicLocalConfigDisabledCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicLocalConfigDisabledAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readLocalConfigDisabledAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readBasicLocalConfigDisabledCommandParams);
    readBasicInteractionInfo.put(
        "readLocalConfigDisabledAttribute", readBasicLocalConfigDisabledAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicReachableCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicReachableAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readReachableAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readBasicReachableCommandParams);
    readBasicInteractionInfo.put(
        "readReachableAttribute", readBasicReachableAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicUniqueIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicUniqueIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readUniqueIDAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBasicUniqueIDCommandParams);
    readBasicInteractionInfo.put(
        "readUniqueIDAttribute", readBasicUniqueIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BasicCluster.GeneratedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedBasicClusterGeneratedCommandListAttributeCallback(),
            readBasicGeneratedCommandListCommandParams);
    readBasicInteractionInfo.put(
        "readGeneratedCommandListAttribute", readBasicGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BasicCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedBasicClusterAcceptedCommandListAttributeCallback(),
            readBasicAcceptedCommandListCommandParams);
    readBasicInteractionInfo.put(
        "readAcceptedCommandListAttribute", readBasicAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BasicCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBasicClusterAttributeListAttributeCallback(),
            readBasicAttributeListCommandParams);
    readBasicInteractionInfo.put(
        "readAttributeListAttribute", readBasicAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBasicFeatureMapCommandParams);
    readBasicInteractionInfo.put(
        "readFeatureMapAttribute", readBasicFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBasicClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBasicClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBasicClusterRevisionCommandParams);
    readBasicInteractionInfo.put(
        "readClusterRevisionAttribute", readBasicClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("basic", readBasicInteractionInfo);
    Map<String, InteractionInfo> readOtaSoftwareUpdateProviderInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateProviderAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateProviderAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateProviderCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.OtaSoftwareUpdateProviderCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOtaSoftwareUpdateProviderClusterAttributeListAttributeCallback(),
            readOtaSoftwareUpdateProviderAttributeListCommandParams);
    readOtaSoftwareUpdateProviderInteractionInfo.put(
        "readAttributeListAttribute",
        readOtaSoftwareUpdateProviderAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateProviderFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateProviderFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateProviderCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readOtaSoftwareUpdateProviderFeatureMapCommandParams);
    readOtaSoftwareUpdateProviderInteractionInfo.put(
        "readFeatureMapAttribute", readOtaSoftwareUpdateProviderFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateProviderClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateProviderClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateProviderCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOtaSoftwareUpdateProviderClusterRevisionCommandParams);
    readOtaSoftwareUpdateProviderInteractionInfo.put(
        "readClusterRevisionAttribute",
        readOtaSoftwareUpdateProviderClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("otaSoftwareUpdateProvider", readOtaSoftwareUpdateProviderInteractionInfo);
    Map<String, InteractionInfo> readOtaSoftwareUpdateRequestorInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo>
        readOtaSoftwareUpdateRequestorDefaultOtaProvidersCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateRequestorDefaultOtaProvidersAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateRequestorCluster) cluster)
                  .readDefaultOtaProvidersAttribute(
                      (ChipClusters.OtaSoftwareUpdateRequestorCluster
                              .DefaultOtaProvidersAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOtaSoftwareUpdateRequestorClusterDefaultOtaProvidersAttributeCallback(),
            readOtaSoftwareUpdateRequestorDefaultOtaProvidersCommandParams);
    readOtaSoftwareUpdateRequestorInteractionInfo.put(
        "readDefaultOtaProvidersAttribute",
        readOtaSoftwareUpdateRequestorDefaultOtaProvidersAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateRequestorUpdatePossibleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateRequestorUpdatePossibleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateRequestorCluster) cluster)
                  .readUpdatePossibleAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readOtaSoftwareUpdateRequestorUpdatePossibleCommandParams);
    readOtaSoftwareUpdateRequestorInteractionInfo.put(
        "readUpdatePossibleAttribute",
        readOtaSoftwareUpdateRequestorUpdatePossibleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateRequestorUpdateStateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateRequestorUpdateStateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateRequestorCluster) cluster)
                  .readUpdateStateAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOtaSoftwareUpdateRequestorUpdateStateCommandParams);
    readOtaSoftwareUpdateRequestorInteractionInfo.put(
        "readUpdateStateAttribute",
        readOtaSoftwareUpdateRequestorUpdateStateAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readOtaSoftwareUpdateRequestorUpdateStateProgressCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateRequestorUpdateStateProgressAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateRequestorCluster) cluster)
                  .readUpdateStateProgressAttribute(
                      (ChipClusters.OtaSoftwareUpdateRequestorCluster
                              .UpdateStateProgressAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOtaSoftwareUpdateRequestorUpdateStateProgressCommandParams);
    readOtaSoftwareUpdateRequestorInteractionInfo.put(
        "readUpdateStateProgressAttribute",
        readOtaSoftwareUpdateRequestorUpdateStateProgressAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateRequestorAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateRequestorAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateRequestorCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.OtaSoftwareUpdateRequestorCluster
                              .AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOtaSoftwareUpdateRequestorClusterAttributeListAttributeCallback(),
            readOtaSoftwareUpdateRequestorAttributeListCommandParams);
    readOtaSoftwareUpdateRequestorInteractionInfo.put(
        "readAttributeListAttribute",
        readOtaSoftwareUpdateRequestorAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateRequestorFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateRequestorFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateRequestorCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readOtaSoftwareUpdateRequestorFeatureMapCommandParams);
    readOtaSoftwareUpdateRequestorInteractionInfo.put(
        "readFeatureMapAttribute",
        readOtaSoftwareUpdateRequestorFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOtaSoftwareUpdateRequestorClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOtaSoftwareUpdateRequestorClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OtaSoftwareUpdateRequestorCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOtaSoftwareUpdateRequestorClusterRevisionCommandParams);
    readOtaSoftwareUpdateRequestorInteractionInfo.put(
        "readClusterRevisionAttribute",
        readOtaSoftwareUpdateRequestorClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put(
        "otaSoftwareUpdateRequestor", readOtaSoftwareUpdateRequestorInteractionInfo);
    Map<String, InteractionInfo> readLocalizationConfigurationInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readLocalizationConfigurationActiveLocaleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLocalizationConfigurationActiveLocaleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LocalizationConfigurationCluster) cluster)
                  .readActiveLocaleAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readLocalizationConfigurationActiveLocaleCommandParams);
    readLocalizationConfigurationInteractionInfo.put(
        "readActiveLocaleAttribute",
        readLocalizationConfigurationActiveLocaleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLocalizationConfigurationSupportedLocalesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLocalizationConfigurationSupportedLocalesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LocalizationConfigurationCluster) cluster)
                  .readSupportedLocalesAttribute(
                      (ChipClusters.LocalizationConfigurationCluster
                              .SupportedLocalesAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedLocalizationConfigurationClusterSupportedLocalesAttributeCallback(),
            readLocalizationConfigurationSupportedLocalesCommandParams);
    readLocalizationConfigurationInteractionInfo.put(
        "readSupportedLocalesAttribute",
        readLocalizationConfigurationSupportedLocalesAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readLocalizationConfigurationGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLocalizationConfigurationGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LocalizationConfigurationCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.LocalizationConfigurationCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedLocalizationConfigurationClusterGeneratedCommandListAttributeCallback(),
            readLocalizationConfigurationGeneratedCommandListCommandParams);
    readLocalizationConfigurationInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readLocalizationConfigurationGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readLocalizationConfigurationAcceptedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLocalizationConfigurationAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LocalizationConfigurationCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.LocalizationConfigurationCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedLocalizationConfigurationClusterAcceptedCommandListAttributeCallback(),
            readLocalizationConfigurationAcceptedCommandListCommandParams);
    readLocalizationConfigurationInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readLocalizationConfigurationAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLocalizationConfigurationFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLocalizationConfigurationFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LocalizationConfigurationCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readLocalizationConfigurationFeatureMapCommandParams);
    readLocalizationConfigurationInteractionInfo.put(
        "readFeatureMapAttribute", readLocalizationConfigurationFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLocalizationConfigurationClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLocalizationConfigurationClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LocalizationConfigurationCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLocalizationConfigurationClusterRevisionCommandParams);
    readLocalizationConfigurationInteractionInfo.put(
        "readClusterRevisionAttribute",
        readLocalizationConfigurationClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("localizationConfiguration", readLocalizationConfigurationInteractionInfo);
    Map<String, InteractionInfo> readTimeFormatLocalizationInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readTimeFormatLocalizationHourFormatCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTimeFormatLocalizationHourFormatAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .readHourFormatAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTimeFormatLocalizationHourFormatCommandParams);
    readTimeFormatLocalizationInteractionInfo.put(
        "readHourFormatAttribute", readTimeFormatLocalizationHourFormatAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTimeFormatLocalizationActiveCalendarTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTimeFormatLocalizationActiveCalendarTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .readActiveCalendarTypeAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTimeFormatLocalizationActiveCalendarTypeCommandParams);
    readTimeFormatLocalizationInteractionInfo.put(
        "readActiveCalendarTypeAttribute",
        readTimeFormatLocalizationActiveCalendarTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readTimeFormatLocalizationSupportedCalendarTypesCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTimeFormatLocalizationSupportedCalendarTypesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .readSupportedCalendarTypesAttribute(
                      (ChipClusters.TimeFormatLocalizationCluster
                              .SupportedCalendarTypesAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTimeFormatLocalizationClusterSupportedCalendarTypesAttributeCallback(),
            readTimeFormatLocalizationSupportedCalendarTypesCommandParams);
    readTimeFormatLocalizationInteractionInfo.put(
        "readSupportedCalendarTypesAttribute",
        readTimeFormatLocalizationSupportedCalendarTypesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTimeFormatLocalizationGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTimeFormatLocalizationGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.TimeFormatLocalizationCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTimeFormatLocalizationClusterGeneratedCommandListAttributeCallback(),
            readTimeFormatLocalizationGeneratedCommandListCommandParams);
    readTimeFormatLocalizationInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readTimeFormatLocalizationGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTimeFormatLocalizationAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTimeFormatLocalizationAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.TimeFormatLocalizationCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTimeFormatLocalizationClusterAcceptedCommandListAttributeCallback(),
            readTimeFormatLocalizationAcceptedCommandListCommandParams);
    readTimeFormatLocalizationInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readTimeFormatLocalizationAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTimeFormatLocalizationFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTimeFormatLocalizationFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTimeFormatLocalizationFeatureMapCommandParams);
    readTimeFormatLocalizationInteractionInfo.put(
        "readFeatureMapAttribute", readTimeFormatLocalizationFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTimeFormatLocalizationClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTimeFormatLocalizationClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTimeFormatLocalizationClusterRevisionCommandParams);
    readTimeFormatLocalizationInteractionInfo.put(
        "readClusterRevisionAttribute",
        readTimeFormatLocalizationClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("timeFormatLocalization", readTimeFormatLocalizationInteractionInfo);
    Map<String, InteractionInfo> readUnitLocalizationInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readUnitLocalizationTemperatureUnitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUnitLocalizationTemperatureUnitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UnitLocalizationCluster) cluster)
                  .readTemperatureUnitAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readUnitLocalizationTemperatureUnitCommandParams);
    readUnitLocalizationInteractionInfo.put(
        "readTemperatureUnitAttribute",
        readUnitLocalizationTemperatureUnitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readUnitLocalizationAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUnitLocalizationAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UnitLocalizationCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.UnitLocalizationCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedUnitLocalizationClusterAttributeListAttributeCallback(),
            readUnitLocalizationAttributeListCommandParams);
    readUnitLocalizationInteractionInfo.put(
        "readAttributeListAttribute", readUnitLocalizationAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readUnitLocalizationFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUnitLocalizationFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UnitLocalizationCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readUnitLocalizationFeatureMapCommandParams);
    readUnitLocalizationInteractionInfo.put(
        "readFeatureMapAttribute", readUnitLocalizationFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readUnitLocalizationClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUnitLocalizationClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UnitLocalizationCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readUnitLocalizationClusterRevisionCommandParams);
    readUnitLocalizationInteractionInfo.put(
        "readClusterRevisionAttribute",
        readUnitLocalizationClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("unitLocalization", readUnitLocalizationInteractionInfo);
    Map<String, InteractionInfo> readPowerSourceConfigurationInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readPowerSourceConfigurationSourcesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceConfigurationSourcesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceConfigurationCluster) cluster)
                  .readSourcesAttribute(
                      (ChipClusters.PowerSourceConfigurationCluster.SourcesAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceConfigurationClusterSourcesAttributeCallback(),
            readPowerSourceConfigurationSourcesCommandParams);
    readPowerSourceConfigurationInteractionInfo.put(
        "readSourcesAttribute", readPowerSourceConfigurationSourcesAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readPowerSourceConfigurationGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceConfigurationGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceConfigurationCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.PowerSourceConfigurationCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceConfigurationClusterGeneratedCommandListAttributeCallback(),
            readPowerSourceConfigurationGeneratedCommandListCommandParams);
    readPowerSourceConfigurationInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readPowerSourceConfigurationGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceConfigurationAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceConfigurationAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceConfigurationCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.PowerSourceConfigurationCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceConfigurationClusterAcceptedCommandListAttributeCallback(),
            readPowerSourceConfigurationAcceptedCommandListCommandParams);
    readPowerSourceConfigurationInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readPowerSourceConfigurationAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceConfigurationAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceConfigurationAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceConfigurationCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.PowerSourceConfigurationCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceConfigurationClusterAttributeListAttributeCallback(),
            readPowerSourceConfigurationAttributeListCommandParams);
    readPowerSourceConfigurationInteractionInfo.put(
        "readAttributeListAttribute",
        readPowerSourceConfigurationAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceConfigurationFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceConfigurationFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceConfigurationCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceConfigurationFeatureMapCommandParams);
    readPowerSourceConfigurationInteractionInfo.put(
        "readFeatureMapAttribute", readPowerSourceConfigurationFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceConfigurationClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceConfigurationClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceConfigurationCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceConfigurationClusterRevisionCommandParams);
    readPowerSourceConfigurationInteractionInfo.put(
        "readClusterRevisionAttribute",
        readPowerSourceConfigurationClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("powerSourceConfiguration", readPowerSourceConfigurationInteractionInfo);
    Map<String, InteractionInfo> readPowerSourceInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readPowerSourceStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceStatusCommandParams);
    readPowerSourceInteractionInfo.put(
        "readStatusAttribute", readPowerSourceStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceOrderCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceOrderAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readOrderAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceOrderCommandParams);
    readPowerSourceInteractionInfo.put(
        "readOrderAttribute", readPowerSourceOrderAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceDescriptionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceDescriptionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readDescriptionAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readPowerSourceDescriptionCommandParams);
    readPowerSourceInteractionInfo.put(
        "readDescriptionAttribute", readPowerSourceDescriptionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceWiredAssessedInputVoltageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceWiredAssessedInputVoltageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readWiredAssessedInputVoltageAttribute(
                      (ChipClusters.PowerSourceCluster.WiredAssessedInputVoltageAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceWiredAssessedInputVoltageCommandParams);
    readPowerSourceInteractionInfo.put(
        "readWiredAssessedInputVoltageAttribute",
        readPowerSourceWiredAssessedInputVoltageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceWiredAssessedInputFrequencyCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceWiredAssessedInputFrequencyAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readWiredAssessedInputFrequencyAttribute(
                      (ChipClusters.PowerSourceCluster.WiredAssessedInputFrequencyAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceWiredAssessedInputFrequencyCommandParams);
    readPowerSourceInteractionInfo.put(
        "readWiredAssessedInputFrequencyAttribute",
        readPowerSourceWiredAssessedInputFrequencyAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceWiredCurrentTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceWiredCurrentTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readWiredCurrentTypeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceWiredCurrentTypeCommandParams);
    readPowerSourceInteractionInfo.put(
        "readWiredCurrentTypeAttribute", readPowerSourceWiredCurrentTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceWiredAssessedCurrentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceWiredAssessedCurrentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readWiredAssessedCurrentAttribute(
                      (ChipClusters.PowerSourceCluster.WiredAssessedCurrentAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceWiredAssessedCurrentCommandParams);
    readPowerSourceInteractionInfo.put(
        "readWiredAssessedCurrentAttribute",
        readPowerSourceWiredAssessedCurrentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceWiredNominalVoltageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceWiredNominalVoltageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readWiredNominalVoltageAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceWiredNominalVoltageCommandParams);
    readPowerSourceInteractionInfo.put(
        "readWiredNominalVoltageAttribute",
        readPowerSourceWiredNominalVoltageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceWiredMaximumCurrentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceWiredMaximumCurrentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readWiredMaximumCurrentAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceWiredMaximumCurrentCommandParams);
    readPowerSourceInteractionInfo.put(
        "readWiredMaximumCurrentAttribute",
        readPowerSourceWiredMaximumCurrentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceWiredPresentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceWiredPresentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readWiredPresentAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readPowerSourceWiredPresentCommandParams);
    readPowerSourceInteractionInfo.put(
        "readWiredPresentAttribute", readPowerSourceWiredPresentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceActiveWiredFaultsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceActiveWiredFaultsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readActiveWiredFaultsAttribute(
                      (ChipClusters.PowerSourceCluster.ActiveWiredFaultsAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceClusterActiveWiredFaultsAttributeCallback(),
            readPowerSourceActiveWiredFaultsCommandParams);
    readPowerSourceInteractionInfo.put(
        "readActiveWiredFaultsAttribute", readPowerSourceActiveWiredFaultsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatVoltageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatVoltageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatVoltageAttribute(
                      (ChipClusters.PowerSourceCluster.BatVoltageAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceBatVoltageCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatVoltageAttribute", readPowerSourceBatVoltageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatPercentRemainingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatPercentRemainingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatPercentRemainingAttribute(
                      (ChipClusters.PowerSourceCluster.BatPercentRemainingAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceBatPercentRemainingCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatPercentRemainingAttribute",
        readPowerSourceBatPercentRemainingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatTimeRemainingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatTimeRemainingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatTimeRemainingAttribute(
                      (ChipClusters.PowerSourceCluster.BatTimeRemainingAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceBatTimeRemainingCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatTimeRemainingAttribute", readPowerSourceBatTimeRemainingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatChargeLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatChargeLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatChargeLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceBatChargeLevelCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatChargeLevelAttribute", readPowerSourceBatChargeLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatReplacementNeededCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatReplacementNeededAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatReplacementNeededAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readPowerSourceBatReplacementNeededCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatReplacementNeededAttribute",
        readPowerSourceBatReplacementNeededAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatReplaceabilityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatReplaceabilityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatReplaceabilityAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceBatReplaceabilityCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatReplaceabilityAttribute", readPowerSourceBatReplaceabilityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatPresentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatPresentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatPresentAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readPowerSourceBatPresentCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatPresentAttribute", readPowerSourceBatPresentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceActiveBatFaultsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceActiveBatFaultsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readActiveBatFaultsAttribute(
                      (ChipClusters.PowerSourceCluster.ActiveBatFaultsAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceClusterActiveBatFaultsAttributeCallback(),
            readPowerSourceActiveBatFaultsCommandParams);
    readPowerSourceInteractionInfo.put(
        "readActiveBatFaultsAttribute", readPowerSourceActiveBatFaultsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatReplacementDescriptionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatReplacementDescriptionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatReplacementDescriptionAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readPowerSourceBatReplacementDescriptionCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatReplacementDescriptionAttribute",
        readPowerSourceBatReplacementDescriptionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatCommonDesignationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatCommonDesignationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatCommonDesignationAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceBatCommonDesignationCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatCommonDesignationAttribute",
        readPowerSourceBatCommonDesignationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatANSIDesignationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatANSIDesignationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatANSIDesignationAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readPowerSourceBatANSIDesignationCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatANSIDesignationAttribute",
        readPowerSourceBatANSIDesignationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatIECDesignationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatIECDesignationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatIECDesignationAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readPowerSourceBatIECDesignationCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatIECDesignationAttribute", readPowerSourceBatIECDesignationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatApprovedChemistryCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatApprovedChemistryAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatApprovedChemistryAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceBatApprovedChemistryCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatApprovedChemistryAttribute",
        readPowerSourceBatApprovedChemistryAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatCapacityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatCapacityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatCapacityAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceBatCapacityCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatCapacityAttribute", readPowerSourceBatCapacityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatQuantityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatQuantityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatQuantityAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceBatQuantityCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatQuantityAttribute", readPowerSourceBatQuantityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatChargeStateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatChargeStateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatChargeStateAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceBatChargeStateCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatChargeStateAttribute", readPowerSourceBatChargeStateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatTimeToFullChargeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatTimeToFullChargeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatTimeToFullChargeAttribute(
                      (ChipClusters.PowerSourceCluster.BatTimeToFullChargeAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceBatTimeToFullChargeCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatTimeToFullChargeAttribute",
        readPowerSourceBatTimeToFullChargeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatFunctionalWhileChargingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatFunctionalWhileChargingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatFunctionalWhileChargingAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readPowerSourceBatFunctionalWhileChargingCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatFunctionalWhileChargingAttribute",
        readPowerSourceBatFunctionalWhileChargingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceBatChargingCurrentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceBatChargingCurrentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readBatChargingCurrentAttribute(
                      (ChipClusters.PowerSourceCluster.BatChargingCurrentAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceBatChargingCurrentCommandParams);
    readPowerSourceInteractionInfo.put(
        "readBatChargingCurrentAttribute",
        readPowerSourceBatChargingCurrentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceActiveBatChargeFaultsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceActiveBatChargeFaultsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readActiveBatChargeFaultsAttribute(
                      (ChipClusters.PowerSourceCluster.ActiveBatChargeFaultsAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceClusterActiveBatChargeFaultsAttributeCallback(),
            readPowerSourceActiveBatChargeFaultsCommandParams);
    readPowerSourceInteractionInfo.put(
        "readActiveBatChargeFaultsAttribute",
        readPowerSourceActiveBatChargeFaultsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.PowerSourceCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceClusterGeneratedCommandListAttributeCallback(),
            readPowerSourceGeneratedCommandListCommandParams);
    readPowerSourceInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readPowerSourceGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.PowerSourceCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPowerSourceClusterAcceptedCommandListAttributeCallback(),
            readPowerSourceAcceptedCommandListCommandParams);
    readPowerSourceInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readPowerSourceAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.PowerSourceCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedPowerSourceClusterAttributeListAttributeCallback(),
            readPowerSourceAttributeListCommandParams);
    readPowerSourceInteractionInfo.put(
        "readAttributeListAttribute", readPowerSourceAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPowerSourceFeatureMapCommandParams);
    readPowerSourceInteractionInfo.put(
        "readFeatureMapAttribute", readPowerSourceFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPowerSourceClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPowerSourceClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PowerSourceCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPowerSourceClusterRevisionCommandParams);
    readPowerSourceInteractionInfo.put(
        "readClusterRevisionAttribute", readPowerSourceClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("powerSource", readPowerSourceInteractionInfo);
    Map<String, InteractionInfo> readGeneralCommissioningInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readGeneralCommissioningBreadcrumbCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningBreadcrumbAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readBreadcrumbAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readGeneralCommissioningBreadcrumbCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readBreadcrumbAttribute", readGeneralCommissioningBreadcrumbAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralCommissioningRegulatoryConfigCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningRegulatoryConfigAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readRegulatoryConfigAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGeneralCommissioningRegulatoryConfigCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readRegulatoryConfigAttribute",
        readGeneralCommissioningRegulatoryConfigAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralCommissioningLocationCapabilityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningLocationCapabilityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readLocationCapabilityAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGeneralCommissioningLocationCapabilityCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readLocationCapabilityAttribute",
        readGeneralCommissioningLocationCapabilityAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readGeneralCommissioningSupportsConcurrentConnectionCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningSupportsConcurrentConnectionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readSupportsConcurrentConnectionAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readGeneralCommissioningSupportsConcurrentConnectionCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readSupportsConcurrentConnectionAttribute",
        readGeneralCommissioningSupportsConcurrentConnectionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralCommissioningGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.GeneralCommissioningCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralCommissioningClusterGeneratedCommandListAttributeCallback(),
            readGeneralCommissioningGeneratedCommandListCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readGeneralCommissioningGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralCommissioningAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.GeneralCommissioningCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralCommissioningClusterAcceptedCommandListAttributeCallback(),
            readGeneralCommissioningAcceptedCommandListCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readGeneralCommissioningAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralCommissioningAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.GeneralCommissioningCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralCommissioningClusterAttributeListAttributeCallback(),
            readGeneralCommissioningAttributeListCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readAttributeListAttribute",
        readGeneralCommissioningAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralCommissioningFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readGeneralCommissioningFeatureMapCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readFeatureMapAttribute", readGeneralCommissioningFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralCommissioningClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralCommissioningClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGeneralCommissioningClusterRevisionCommandParams);
    readGeneralCommissioningInteractionInfo.put(
        "readClusterRevisionAttribute",
        readGeneralCommissioningClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("generalCommissioning", readGeneralCommissioningInteractionInfo);
    Map<String, InteractionInfo> readNetworkCommissioningInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readNetworkCommissioningMaxNetworksCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningMaxNetworksAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readMaxNetworksAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readNetworkCommissioningMaxNetworksCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readMaxNetworksAttribute", readNetworkCommissioningMaxNetworksAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningNetworksCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningNetworksAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readNetworksAttribute(
                      (ChipClusters.NetworkCommissioningCluster.NetworksAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedNetworkCommissioningClusterNetworksAttributeCallback(),
            readNetworkCommissioningNetworksCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readNetworksAttribute", readNetworkCommissioningNetworksAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningScanMaxTimeSecondsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningScanMaxTimeSecondsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readScanMaxTimeSecondsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readNetworkCommissioningScanMaxTimeSecondsCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readScanMaxTimeSecondsAttribute",
        readNetworkCommissioningScanMaxTimeSecondsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningConnectMaxTimeSecondsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningConnectMaxTimeSecondsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readConnectMaxTimeSecondsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readNetworkCommissioningConnectMaxTimeSecondsCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readConnectMaxTimeSecondsAttribute",
        readNetworkCommissioningConnectMaxTimeSecondsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningInterfaceEnabledCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningInterfaceEnabledAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readInterfaceEnabledAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readNetworkCommissioningInterfaceEnabledCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readInterfaceEnabledAttribute",
        readNetworkCommissioningInterfaceEnabledAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningLastNetworkingStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningLastNetworkingStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readLastNetworkingStatusAttribute(
                      (ChipClusters.NetworkCommissioningCluster
                              .LastNetworkingStatusAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readNetworkCommissioningLastNetworkingStatusCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readLastNetworkingStatusAttribute",
        readNetworkCommissioningLastNetworkingStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningLastNetworkIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningLastNetworkIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readLastNetworkIDAttribute(
                      (ChipClusters.NetworkCommissioningCluster.LastNetworkIDAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedOctetStringAttributeCallback(),
            readNetworkCommissioningLastNetworkIDCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readLastNetworkIDAttribute",
        readNetworkCommissioningLastNetworkIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningLastConnectErrorValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningLastConnectErrorValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readLastConnectErrorValueAttribute(
                      (ChipClusters.NetworkCommissioningCluster
                              .LastConnectErrorValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readNetworkCommissioningLastConnectErrorValueCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readLastConnectErrorValueAttribute",
        readNetworkCommissioningLastConnectErrorValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.NetworkCommissioningCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedNetworkCommissioningClusterGeneratedCommandListAttributeCallback(),
            readNetworkCommissioningGeneratedCommandListCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readNetworkCommissioningGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.NetworkCommissioningCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedNetworkCommissioningClusterAcceptedCommandListAttributeCallback(),
            readNetworkCommissioningAcceptedCommandListCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readNetworkCommissioningAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readNetworkCommissioningFeatureMapCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readFeatureMapAttribute", readNetworkCommissioningFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readNetworkCommissioningClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readNetworkCommissioningClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readNetworkCommissioningClusterRevisionCommandParams);
    readNetworkCommissioningInteractionInfo.put(
        "readClusterRevisionAttribute",
        readNetworkCommissioningClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("networkCommissioning", readNetworkCommissioningInteractionInfo);
    Map<String, InteractionInfo> readDiagnosticLogsInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readDiagnosticLogsGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDiagnosticLogsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DiagnosticLogsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.DiagnosticLogsCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedDiagnosticLogsClusterGeneratedCommandListAttributeCallback(),
            readDiagnosticLogsGeneratedCommandListCommandParams);
    readDiagnosticLogsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readDiagnosticLogsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDiagnosticLogsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDiagnosticLogsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DiagnosticLogsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.DiagnosticLogsCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedDiagnosticLogsClusterAcceptedCommandListAttributeCallback(),
            readDiagnosticLogsAcceptedCommandListCommandParams);
    readDiagnosticLogsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readDiagnosticLogsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDiagnosticLogsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDiagnosticLogsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DiagnosticLogsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.DiagnosticLogsCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedDiagnosticLogsClusterAttributeListAttributeCallback(),
            readDiagnosticLogsAttributeListCommandParams);
    readDiagnosticLogsInteractionInfo.put(
        "readAttributeListAttribute", readDiagnosticLogsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDiagnosticLogsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDiagnosticLogsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DiagnosticLogsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readDiagnosticLogsFeatureMapCommandParams);
    readDiagnosticLogsInteractionInfo.put(
        "readFeatureMapAttribute", readDiagnosticLogsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDiagnosticLogsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDiagnosticLogsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DiagnosticLogsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDiagnosticLogsClusterRevisionCommandParams);
    readDiagnosticLogsInteractionInfo.put(
        "readClusterRevisionAttribute", readDiagnosticLogsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("diagnosticLogs", readDiagnosticLogsInteractionInfo);
    Map<String, InteractionInfo> readGeneralDiagnosticsInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readGeneralDiagnosticsNetworkInterfacesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsNetworkInterfacesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readNetworkInterfacesAttribute(
                      (ChipClusters.GeneralDiagnosticsCluster.NetworkInterfacesAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralDiagnosticsClusterNetworkInterfacesAttributeCallback(),
            readGeneralDiagnosticsNetworkInterfacesCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readNetworkInterfacesAttribute",
        readGeneralDiagnosticsNetworkInterfacesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsRebootCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsRebootCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readRebootCountAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGeneralDiagnosticsRebootCountCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readRebootCountAttribute", readGeneralDiagnosticsRebootCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsUpTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsUpTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readUpTimeAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readGeneralDiagnosticsUpTimeCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readUpTimeAttribute", readGeneralDiagnosticsUpTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsTotalOperationalHoursCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsTotalOperationalHoursAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readTotalOperationalHoursAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readGeneralDiagnosticsTotalOperationalHoursCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readTotalOperationalHoursAttribute",
        readGeneralDiagnosticsTotalOperationalHoursAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsBootReasonsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsBootReasonsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readBootReasonsAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGeneralDiagnosticsBootReasonsCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readBootReasonsAttribute", readGeneralDiagnosticsBootReasonsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsActiveHardwareFaultsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsActiveHardwareFaultsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readActiveHardwareFaultsAttribute(
                      (ChipClusters.GeneralDiagnosticsCluster.ActiveHardwareFaultsAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralDiagnosticsClusterActiveHardwareFaultsAttributeCallback(),
            readGeneralDiagnosticsActiveHardwareFaultsCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readActiveHardwareFaultsAttribute",
        readGeneralDiagnosticsActiveHardwareFaultsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsActiveRadioFaultsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsActiveRadioFaultsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readActiveRadioFaultsAttribute(
                      (ChipClusters.GeneralDiagnosticsCluster.ActiveRadioFaultsAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralDiagnosticsClusterActiveRadioFaultsAttributeCallback(),
            readGeneralDiagnosticsActiveRadioFaultsCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readActiveRadioFaultsAttribute",
        readGeneralDiagnosticsActiveRadioFaultsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsActiveNetworkFaultsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsActiveNetworkFaultsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readActiveNetworkFaultsAttribute(
                      (ChipClusters.GeneralDiagnosticsCluster.ActiveNetworkFaultsAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralDiagnosticsClusterActiveNetworkFaultsAttributeCallback(),
            readGeneralDiagnosticsActiveNetworkFaultsCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readActiveNetworkFaultsAttribute",
        readGeneralDiagnosticsActiveNetworkFaultsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsTestEventTriggersEnabledCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsTestEventTriggersEnabledAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readTestEventTriggersEnabledAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readGeneralDiagnosticsTestEventTriggersEnabledCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readTestEventTriggersEnabledAttribute",
        readGeneralDiagnosticsTestEventTriggersEnabledAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.GeneralDiagnosticsCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralDiagnosticsClusterGeneratedCommandListAttributeCallback(),
            readGeneralDiagnosticsGeneratedCommandListCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readGeneralDiagnosticsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.GeneralDiagnosticsCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralDiagnosticsClusterAcceptedCommandListAttributeCallback(),
            readGeneralDiagnosticsAcceptedCommandListCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readGeneralDiagnosticsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.GeneralDiagnosticsCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGeneralDiagnosticsClusterAttributeListAttributeCallback(),
            readGeneralDiagnosticsAttributeListCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readAttributeListAttribute", readGeneralDiagnosticsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readGeneralDiagnosticsFeatureMapCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readFeatureMapAttribute", readGeneralDiagnosticsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGeneralDiagnosticsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGeneralDiagnosticsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralDiagnosticsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGeneralDiagnosticsClusterRevisionCommandParams);
    readGeneralDiagnosticsInteractionInfo.put(
        "readClusterRevisionAttribute",
        readGeneralDiagnosticsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("generalDiagnostics", readGeneralDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> readSoftwareDiagnosticsInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsThreadMetricsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsThreadMetricsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readThreadMetricsAttribute(
                      (ChipClusters.SoftwareDiagnosticsCluster.ThreadMetricsAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedSoftwareDiagnosticsClusterThreadMetricsAttributeCallback(),
            readSoftwareDiagnosticsThreadMetricsCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readThreadMetricsAttribute", readSoftwareDiagnosticsThreadMetricsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsCurrentHeapFreeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsCurrentHeapFreeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readCurrentHeapFreeAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readSoftwareDiagnosticsCurrentHeapFreeCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readCurrentHeapFreeAttribute",
        readSoftwareDiagnosticsCurrentHeapFreeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsCurrentHeapUsedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsCurrentHeapUsedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readCurrentHeapUsedAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readSoftwareDiagnosticsCurrentHeapUsedCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readCurrentHeapUsedAttribute",
        readSoftwareDiagnosticsCurrentHeapUsedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsCurrentHeapHighWatermarkCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsCurrentHeapHighWatermarkAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readCurrentHeapHighWatermarkAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readSoftwareDiagnosticsCurrentHeapHighWatermarkCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readCurrentHeapHighWatermarkAttribute",
        readSoftwareDiagnosticsCurrentHeapHighWatermarkAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.SoftwareDiagnosticsCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedSoftwareDiagnosticsClusterGeneratedCommandListAttributeCallback(),
            readSoftwareDiagnosticsGeneratedCommandListCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readSoftwareDiagnosticsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.SoftwareDiagnosticsCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedSoftwareDiagnosticsClusterAcceptedCommandListAttributeCallback(),
            readSoftwareDiagnosticsAcceptedCommandListCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readSoftwareDiagnosticsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.SoftwareDiagnosticsCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedSoftwareDiagnosticsClusterAttributeListAttributeCallback(),
            readSoftwareDiagnosticsAttributeListCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readAttributeListAttribute", readSoftwareDiagnosticsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readSoftwareDiagnosticsFeatureMapCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readFeatureMapAttribute", readSoftwareDiagnosticsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSoftwareDiagnosticsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSoftwareDiagnosticsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SoftwareDiagnosticsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readSoftwareDiagnosticsClusterRevisionCommandParams);
    readSoftwareDiagnosticsInteractionInfo.put(
        "readClusterRevisionAttribute",
        readSoftwareDiagnosticsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("softwareDiagnostics", readSoftwareDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> readThreadNetworkDiagnosticsInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsChannelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsChannelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readChannelAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.ChannelAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsChannelCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readChannelAttribute", readThreadNetworkDiagnosticsChannelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRoutingRoleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRoutingRoleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRoutingRoleAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.RoutingRoleAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsRoutingRoleCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRoutingRoleAttribute",
        readThreadNetworkDiagnosticsRoutingRoleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsNetworkNameCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsNetworkNameAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readNetworkNameAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.NetworkNameAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readThreadNetworkDiagnosticsNetworkNameCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readNetworkNameAttribute",
        readThreadNetworkDiagnosticsNetworkNameAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsPanIdCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsPanIdAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readPanIdAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.PanIdAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsPanIdCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readPanIdAttribute", readThreadNetworkDiagnosticsPanIdAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsExtendedPanIdCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsExtendedPanIdAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readExtendedPanIdAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.ExtendedPanIdAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsExtendedPanIdCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readExtendedPanIdAttribute",
        readThreadNetworkDiagnosticsExtendedPanIdAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsMeshLocalPrefixCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsMeshLocalPrefixAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readMeshLocalPrefixAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .MeshLocalPrefixAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedOctetStringAttributeCallback(),
            readThreadNetworkDiagnosticsMeshLocalPrefixCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readMeshLocalPrefixAttribute",
        readThreadNetworkDiagnosticsMeshLocalPrefixAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsOverrunCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsOverrunCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readOverrunCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsOverrunCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readOverrunCountAttribute",
        readThreadNetworkDiagnosticsOverrunCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsNeighborTableListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsNeighborTableListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readNeighborTableListAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .NeighborTableListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedThreadNetworkDiagnosticsClusterNeighborTableListAttributeCallback(),
            readThreadNetworkDiagnosticsNeighborTableListCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readNeighborTableListAttribute",
        readThreadNetworkDiagnosticsNeighborTableListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRouteTableListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRouteTableListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRouteTableListAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.RouteTableListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedThreadNetworkDiagnosticsClusterRouteTableListAttributeCallback(),
            readThreadNetworkDiagnosticsRouteTableListCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRouteTableListAttribute",
        readThreadNetworkDiagnosticsRouteTableListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsPartitionIdCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsPartitionIdAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readPartitionIdAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.PartitionIdAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsPartitionIdCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readPartitionIdAttribute",
        readThreadNetworkDiagnosticsPartitionIdAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsWeightingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsWeightingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readWeightingAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.WeightingAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsWeightingCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readWeightingAttribute", readThreadNetworkDiagnosticsWeightingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsDataVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsDataVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readDataVersionAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.DataVersionAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsDataVersionCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readDataVersionAttribute",
        readThreadNetworkDiagnosticsDataVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsStableDataVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsStableDataVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readStableDataVersionAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .StableDataVersionAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsStableDataVersionCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readStableDataVersionAttribute",
        readThreadNetworkDiagnosticsStableDataVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsLeaderRouterIdCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsLeaderRouterIdAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readLeaderRouterIdAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.LeaderRouterIdAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsLeaderRouterIdCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readLeaderRouterIdAttribute",
        readThreadNetworkDiagnosticsLeaderRouterIdAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsDetachedRoleCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsDetachedRoleCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readDetachedRoleCountAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsDetachedRoleCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readDetachedRoleCountAttribute",
        readThreadNetworkDiagnosticsDetachedRoleCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsChildRoleCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsChildRoleCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readChildRoleCountAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsChildRoleCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readChildRoleCountAttribute",
        readThreadNetworkDiagnosticsChildRoleCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRouterRoleCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRouterRoleCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRouterRoleCountAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsRouterRoleCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRouterRoleCountAttribute",
        readThreadNetworkDiagnosticsRouterRoleCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsLeaderRoleCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsLeaderRoleCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readLeaderRoleCountAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsLeaderRoleCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readLeaderRoleCountAttribute",
        readThreadNetworkDiagnosticsLeaderRoleCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsAttachAttemptCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsAttachAttemptCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readAttachAttemptCountAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsAttachAttemptCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readAttachAttemptCountAttribute",
        readThreadNetworkDiagnosticsAttachAttemptCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsPartitionIdChangeCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsPartitionIdChangeCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readPartitionIdChangeCountAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsPartitionIdChangeCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readPartitionIdChangeCountAttribute",
        readThreadNetworkDiagnosticsPartitionIdChangeCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsBetterPartitionAttachAttemptCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThreadNetworkDiagnosticsBetterPartitionAttachAttemptCountAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                      .readBetterPartitionAttachAttemptCountAttribute(
                          (ChipClusters.IntegerAttributeCallback) callback);
                },
                () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
                readThreadNetworkDiagnosticsBetterPartitionAttachAttemptCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readBetterPartitionAttachAttemptCountAttribute",
        readThreadNetworkDiagnosticsBetterPartitionAttachAttemptCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsParentChangeCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsParentChangeCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readParentChangeCountAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsParentChangeCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readParentChangeCountAttribute",
        readThreadNetworkDiagnosticsParentChangeCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxTotalCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxTotalCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxTotalCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxTotalCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxTotalCountAttribute",
        readThreadNetworkDiagnosticsTxTotalCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxUnicastCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxUnicastCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxUnicastCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxUnicastCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxUnicastCountAttribute",
        readThreadNetworkDiagnosticsTxUnicastCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxBroadcastCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxBroadcastCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxBroadcastCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxBroadcastCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxBroadcastCountAttribute",
        readThreadNetworkDiagnosticsTxBroadcastCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxAckRequestedCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxAckRequestedCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxAckRequestedCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxAckRequestedCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxAckRequestedCountAttribute",
        readThreadNetworkDiagnosticsTxAckRequestedCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxAckedCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxAckedCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxAckedCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxAckedCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxAckedCountAttribute",
        readThreadNetworkDiagnosticsTxAckedCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsTxNoAckRequestedCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxNoAckRequestedCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxNoAckRequestedCountAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxNoAckRequestedCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxNoAckRequestedCountAttribute",
        readThreadNetworkDiagnosticsTxNoAckRequestedCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxDataCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxDataCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxDataCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxDataCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxDataCountAttribute",
        readThreadNetworkDiagnosticsTxDataCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxDataPollCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxDataPollCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxDataPollCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxDataPollCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxDataPollCountAttribute",
        readThreadNetworkDiagnosticsTxDataPollCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxBeaconCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxBeaconCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxBeaconCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxBeaconCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxBeaconCountAttribute",
        readThreadNetworkDiagnosticsTxBeaconCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsTxBeaconRequestCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxBeaconRequestCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxBeaconRequestCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxBeaconRequestCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxBeaconRequestCountAttribute",
        readThreadNetworkDiagnosticsTxBeaconRequestCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxOtherCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxOtherCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxOtherCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxOtherCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxOtherCountAttribute",
        readThreadNetworkDiagnosticsTxOtherCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxRetryCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxRetryCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxRetryCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxRetryCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxRetryCountAttribute",
        readThreadNetworkDiagnosticsTxRetryCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsTxDirectMaxRetryExpiryCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThreadNetworkDiagnosticsTxDirectMaxRetryExpiryCountAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                      .readTxDirectMaxRetryExpiryCountAttribute(
                          (ChipClusters.LongAttributeCallback) callback);
                },
                () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
                readThreadNetworkDiagnosticsTxDirectMaxRetryExpiryCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxDirectMaxRetryExpiryCountAttribute",
        readThreadNetworkDiagnosticsTxDirectMaxRetryExpiryCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsTxIndirectMaxRetryExpiryCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThreadNetworkDiagnosticsTxIndirectMaxRetryExpiryCountAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                      .readTxIndirectMaxRetryExpiryCountAttribute(
                          (ChipClusters.LongAttributeCallback) callback);
                },
                () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
                readThreadNetworkDiagnosticsTxIndirectMaxRetryExpiryCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxIndirectMaxRetryExpiryCountAttribute",
        readThreadNetworkDiagnosticsTxIndirectMaxRetryExpiryCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxErrCcaCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxErrCcaCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxErrCcaCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxErrCcaCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxErrCcaCountAttribute",
        readThreadNetworkDiagnosticsTxErrCcaCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsTxErrAbortCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxErrAbortCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxErrAbortCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxErrAbortCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxErrAbortCountAttribute",
        readThreadNetworkDiagnosticsTxErrAbortCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsTxErrBusyChannelCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsTxErrBusyChannelCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readTxErrBusyChannelCountAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsTxErrBusyChannelCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readTxErrBusyChannelCountAttribute",
        readThreadNetworkDiagnosticsTxErrBusyChannelCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxTotalCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxTotalCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxTotalCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxTotalCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxTotalCountAttribute",
        readThreadNetworkDiagnosticsRxTotalCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxUnicastCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxUnicastCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxUnicastCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxUnicastCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxUnicastCountAttribute",
        readThreadNetworkDiagnosticsRxUnicastCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxBroadcastCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxBroadcastCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxBroadcastCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxBroadcastCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxBroadcastCountAttribute",
        readThreadNetworkDiagnosticsRxBroadcastCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxDataCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxDataCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxDataCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxDataCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxDataCountAttribute",
        readThreadNetworkDiagnosticsRxDataCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxDataPollCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxDataPollCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxDataPollCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxDataPollCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxDataPollCountAttribute",
        readThreadNetworkDiagnosticsRxDataPollCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxBeaconCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxBeaconCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxBeaconCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxBeaconCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxBeaconCountAttribute",
        readThreadNetworkDiagnosticsRxBeaconCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsRxBeaconRequestCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxBeaconRequestCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxBeaconRequestCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxBeaconRequestCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxBeaconRequestCountAttribute",
        readThreadNetworkDiagnosticsRxBeaconRequestCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxOtherCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxOtherCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxOtherCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxOtherCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxOtherCountAttribute",
        readThreadNetworkDiagnosticsRxOtherCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsRxAddressFilteredCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxAddressFilteredCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxAddressFilteredCountAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxAddressFilteredCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxAddressFilteredCountAttribute",
        readThreadNetworkDiagnosticsRxAddressFilteredCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsRxDestAddrFilteredCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxDestAddrFilteredCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxDestAddrFilteredCountAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxDestAddrFilteredCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxDestAddrFilteredCountAttribute",
        readThreadNetworkDiagnosticsRxDestAddrFilteredCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxDuplicatedCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxDuplicatedCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxDuplicatedCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxDuplicatedCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxDuplicatedCountAttribute",
        readThreadNetworkDiagnosticsRxDuplicatedCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxErrNoFrameCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxErrNoFrameCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxErrNoFrameCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxErrNoFrameCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxErrNoFrameCountAttribute",
        readThreadNetworkDiagnosticsRxErrNoFrameCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsRxErrUnknownNeighborCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxErrUnknownNeighborCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxErrUnknownNeighborCountAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxErrUnknownNeighborCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxErrUnknownNeighborCountAttribute",
        readThreadNetworkDiagnosticsRxErrUnknownNeighborCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsRxErrInvalidSrcAddrCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxErrInvalidSrcAddrCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxErrInvalidSrcAddrCountAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxErrInvalidSrcAddrCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxErrInvalidSrcAddrCountAttribute",
        readThreadNetworkDiagnosticsRxErrInvalidSrcAddrCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxErrSecCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxErrSecCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxErrSecCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxErrSecCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxErrSecCountAttribute",
        readThreadNetworkDiagnosticsRxErrSecCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxErrFcsCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxErrFcsCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxErrFcsCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxErrFcsCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxErrFcsCountAttribute",
        readThreadNetworkDiagnosticsRxErrFcsCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsRxErrOtherCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsRxErrOtherCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readRxErrOtherCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsRxErrOtherCountCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readRxErrOtherCountAttribute",
        readThreadNetworkDiagnosticsRxErrOtherCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsActiveTimestampCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsActiveTimestampAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readActiveTimestampAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .ActiveTimestampAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsActiveTimestampCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readActiveTimestampAttribute",
        readThreadNetworkDiagnosticsActiveTimestampAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsPendingTimestampCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsPendingTimestampAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readPendingTimestampAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .PendingTimestampAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsPendingTimestampCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readPendingTimestampAttribute",
        readThreadNetworkDiagnosticsPendingTimestampAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsDelayCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsDelayAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readDelayAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.DelayAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsDelayCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readDelayAttribute", readThreadNetworkDiagnosticsDelayAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsChannelPage0MaskCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsChannelPage0MaskAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readChannelPage0MaskAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .ChannelPage0MaskAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedOctetStringAttributeCallback(),
            readThreadNetworkDiagnosticsChannelPage0MaskCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readChannelPage0MaskAttribute",
        readThreadNetworkDiagnosticsChannelPage0MaskAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsActiveNetworkFaultsListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsActiveNetworkFaultsListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readActiveNetworkFaultsListAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .ActiveNetworkFaultsListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedThreadNetworkDiagnosticsClusterActiveNetworkFaultsListAttributeCallback(),
            readThreadNetworkDiagnosticsActiveNetworkFaultsListCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readActiveNetworkFaultsListAttribute",
        readThreadNetworkDiagnosticsActiveNetworkFaultsListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThreadNetworkDiagnosticsGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedThreadNetworkDiagnosticsClusterGeneratedCommandListAttributeCallback(),
            readThreadNetworkDiagnosticsGeneratedCommandListCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readThreadNetworkDiagnosticsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedThreadNetworkDiagnosticsClusterAcceptedCommandListAttributeCallback(),
            readThreadNetworkDiagnosticsAcceptedCommandListCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readThreadNetworkDiagnosticsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ThreadNetworkDiagnosticsCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedThreadNetworkDiagnosticsClusterAttributeListAttributeCallback(),
            readThreadNetworkDiagnosticsAttributeListCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readAttributeListAttribute",
        readThreadNetworkDiagnosticsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThreadNetworkDiagnosticsFeatureMapCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readFeatureMapAttribute", readThreadNetworkDiagnosticsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThreadNetworkDiagnosticsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThreadNetworkDiagnosticsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThreadNetworkDiagnosticsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThreadNetworkDiagnosticsClusterRevisionCommandParams);
    readThreadNetworkDiagnosticsInteractionInfo.put(
        "readClusterRevisionAttribute",
        readThreadNetworkDiagnosticsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("threadNetworkDiagnostics", readThreadNetworkDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> readWiFiNetworkDiagnosticsInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsBssidCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsBssidAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readBssidAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.BssidAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedOctetStringAttributeCallback(),
            readWiFiNetworkDiagnosticsBssidCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readBssidAttribute", readWiFiNetworkDiagnosticsBssidAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsSecurityTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsSecurityTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readSecurityTypeAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.SecurityTypeAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWiFiNetworkDiagnosticsSecurityTypeCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readSecurityTypeAttribute",
        readWiFiNetworkDiagnosticsSecurityTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsWiFiVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsWiFiVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readWiFiVersionAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.WiFiVersionAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWiFiNetworkDiagnosticsWiFiVersionCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readWiFiVersionAttribute", readWiFiNetworkDiagnosticsWiFiVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsChannelNumberCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsChannelNumberAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readChannelNumberAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.ChannelNumberAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWiFiNetworkDiagnosticsChannelNumberCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readChannelNumberAttribute",
        readWiFiNetworkDiagnosticsChannelNumberAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsRssiCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsRssiAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readRssiAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.RssiAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWiFiNetworkDiagnosticsRssiCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readRssiAttribute", readWiFiNetworkDiagnosticsRssiAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsBeaconLostCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsBeaconLostCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readBeaconLostCountAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.BeaconLostCountAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsBeaconLostCountCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readBeaconLostCountAttribute",
        readWiFiNetworkDiagnosticsBeaconLostCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsBeaconRxCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsBeaconRxCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readBeaconRxCountAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.BeaconRxCountAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsBeaconRxCountCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readBeaconRxCountAttribute",
        readWiFiNetworkDiagnosticsBeaconRxCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readWiFiNetworkDiagnosticsPacketMulticastRxCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsPacketMulticastRxCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readPacketMulticastRxCountAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster
                              .PacketMulticastRxCountAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsPacketMulticastRxCountCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readPacketMulticastRxCountAttribute",
        readWiFiNetworkDiagnosticsPacketMulticastRxCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readWiFiNetworkDiagnosticsPacketMulticastTxCountCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsPacketMulticastTxCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readPacketMulticastTxCountAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster
                              .PacketMulticastTxCountAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsPacketMulticastTxCountCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readPacketMulticastTxCountAttribute",
        readWiFiNetworkDiagnosticsPacketMulticastTxCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsPacketUnicastRxCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsPacketUnicastRxCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readPacketUnicastRxCountAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster
                              .PacketUnicastRxCountAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsPacketUnicastRxCountCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readPacketUnicastRxCountAttribute",
        readWiFiNetworkDiagnosticsPacketUnicastRxCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsPacketUnicastTxCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsPacketUnicastTxCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readPacketUnicastTxCountAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster
                              .PacketUnicastTxCountAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsPacketUnicastTxCountCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readPacketUnicastTxCountAttribute",
        readWiFiNetworkDiagnosticsPacketUnicastTxCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsCurrentMaxRateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsCurrentMaxRateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readCurrentMaxRateAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.CurrentMaxRateAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsCurrentMaxRateCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readCurrentMaxRateAttribute",
        readWiFiNetworkDiagnosticsCurrentMaxRateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsOverrunCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsOverrunCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readOverrunCountAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.OverrunCountAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsOverrunCountCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readOverrunCountAttribute",
        readWiFiNetworkDiagnosticsOverrunCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWiFiNetworkDiagnosticsClusterGeneratedCommandListAttributeCallback(),
            readWiFiNetworkDiagnosticsGeneratedCommandListCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readWiFiNetworkDiagnosticsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWiFiNetworkDiagnosticsClusterAcceptedCommandListAttributeCallback(),
            readWiFiNetworkDiagnosticsAcceptedCommandListCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readWiFiNetworkDiagnosticsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.WiFiNetworkDiagnosticsCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWiFiNetworkDiagnosticsClusterAttributeListAttributeCallback(),
            readWiFiNetworkDiagnosticsAttributeListCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readAttributeListAttribute",
        readWiFiNetworkDiagnosticsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWiFiNetworkDiagnosticsFeatureMapCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readFeatureMapAttribute", readWiFiNetworkDiagnosticsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWiFiNetworkDiagnosticsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWiFiNetworkDiagnosticsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WiFiNetworkDiagnosticsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWiFiNetworkDiagnosticsClusterRevisionCommandParams);
    readWiFiNetworkDiagnosticsInteractionInfo.put(
        "readClusterRevisionAttribute",
        readWiFiNetworkDiagnosticsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("wiFiNetworkDiagnostics", readWiFiNetworkDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> readEthernetNetworkDiagnosticsInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsPHYRateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsPHYRateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readPHYRateAttribute(
                      (ChipClusters.EthernetNetworkDiagnosticsCluster.PHYRateAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readEthernetNetworkDiagnosticsPHYRateCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readPHYRateAttribute", readEthernetNetworkDiagnosticsPHYRateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsFullDuplexCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsFullDuplexAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readFullDuplexAttribute(
                      (ChipClusters.EthernetNetworkDiagnosticsCluster.FullDuplexAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readEthernetNetworkDiagnosticsFullDuplexCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readFullDuplexAttribute",
        readEthernetNetworkDiagnosticsFullDuplexAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsPacketRxCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsPacketRxCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readPacketRxCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readEthernetNetworkDiagnosticsPacketRxCountCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readPacketRxCountAttribute",
        readEthernetNetworkDiagnosticsPacketRxCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsPacketTxCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsPacketTxCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readPacketTxCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readEthernetNetworkDiagnosticsPacketTxCountCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readPacketTxCountAttribute",
        readEthernetNetworkDiagnosticsPacketTxCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsTxErrCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsTxErrCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readTxErrCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readEthernetNetworkDiagnosticsTxErrCountCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readTxErrCountAttribute",
        readEthernetNetworkDiagnosticsTxErrCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsCollisionCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsCollisionCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readCollisionCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readEthernetNetworkDiagnosticsCollisionCountCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readCollisionCountAttribute",
        readEthernetNetworkDiagnosticsCollisionCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsOverrunCountCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsOverrunCountAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readOverrunCountAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readEthernetNetworkDiagnosticsOverrunCountCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readOverrunCountAttribute",
        readEthernetNetworkDiagnosticsOverrunCountAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsCarrierDetectCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsCarrierDetectAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readCarrierDetectAttribute(
                      (ChipClusters.EthernetNetworkDiagnosticsCluster
                              .CarrierDetectAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readEthernetNetworkDiagnosticsCarrierDetectCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readCarrierDetectAttribute",
        readEthernetNetworkDiagnosticsCarrierDetectAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsTimeSinceResetCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsTimeSinceResetAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readTimeSinceResetAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readEthernetNetworkDiagnosticsTimeSinceResetCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readTimeSinceResetAttribute",
        readEthernetNetworkDiagnosticsTimeSinceResetAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readEthernetNetworkDiagnosticsGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.EthernetNetworkDiagnosticsCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedEthernetNetworkDiagnosticsClusterGeneratedCommandListAttributeCallback(),
            readEthernetNetworkDiagnosticsGeneratedCommandListCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readEthernetNetworkDiagnosticsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readEthernetNetworkDiagnosticsAcceptedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.EthernetNetworkDiagnosticsCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedEthernetNetworkDiagnosticsClusterAcceptedCommandListAttributeCallback(),
            readEthernetNetworkDiagnosticsAcceptedCommandListCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readEthernetNetworkDiagnosticsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.EthernetNetworkDiagnosticsCluster
                              .AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedEthernetNetworkDiagnosticsClusterAttributeListAttributeCallback(),
            readEthernetNetworkDiagnosticsAttributeListCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readAttributeListAttribute",
        readEthernetNetworkDiagnosticsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readEthernetNetworkDiagnosticsFeatureMapCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readFeatureMapAttribute",
        readEthernetNetworkDiagnosticsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readEthernetNetworkDiagnosticsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readEthernetNetworkDiagnosticsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.EthernetNetworkDiagnosticsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readEthernetNetworkDiagnosticsClusterRevisionCommandParams);
    readEthernetNetworkDiagnosticsInteractionInfo.put(
        "readClusterRevisionAttribute",
        readEthernetNetworkDiagnosticsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put(
        "ethernetNetworkDiagnostics", readEthernetNetworkDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> readBridgedDeviceBasicInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBridgedDeviceBasicVendorNameCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicVendorNameAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readVendorNameAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicVendorNameCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readVendorNameAttribute", readBridgedDeviceBasicVendorNameAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicVendorIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicVendorIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readVendorIDAttribute(
                      (ChipClusters.BridgedDeviceBasicCluster.VendorIDAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBridgedDeviceBasicVendorIDCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readVendorIDAttribute", readBridgedDeviceBasicVendorIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicProductNameCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicProductNameAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readProductNameAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicProductNameCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readProductNameAttribute", readBridgedDeviceBasicProductNameAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicNodeLabelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicNodeLabelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readNodeLabelAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicNodeLabelCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readNodeLabelAttribute", readBridgedDeviceBasicNodeLabelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicHardwareVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicHardwareVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readHardwareVersionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBridgedDeviceBasicHardwareVersionCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readHardwareVersionAttribute",
        readBridgedDeviceBasicHardwareVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicHardwareVersionStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicHardwareVersionStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readHardwareVersionStringAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicHardwareVersionStringCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readHardwareVersionStringAttribute",
        readBridgedDeviceBasicHardwareVersionStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicSoftwareVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicSoftwareVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readSoftwareVersionAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBridgedDeviceBasicSoftwareVersionCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readSoftwareVersionAttribute",
        readBridgedDeviceBasicSoftwareVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicSoftwareVersionStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicSoftwareVersionStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readSoftwareVersionStringAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicSoftwareVersionStringCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readSoftwareVersionStringAttribute",
        readBridgedDeviceBasicSoftwareVersionStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicManufacturingDateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicManufacturingDateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readManufacturingDateAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicManufacturingDateCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readManufacturingDateAttribute",
        readBridgedDeviceBasicManufacturingDateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicPartNumberCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicPartNumberAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readPartNumberAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicPartNumberCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readPartNumberAttribute", readBridgedDeviceBasicPartNumberAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicProductURLCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicProductURLAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readProductURLAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicProductURLCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readProductURLAttribute", readBridgedDeviceBasicProductURLAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicProductLabelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicProductLabelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readProductLabelAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicProductLabelCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readProductLabelAttribute", readBridgedDeviceBasicProductLabelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicSerialNumberCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicSerialNumberAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readSerialNumberAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicSerialNumberCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readSerialNumberAttribute", readBridgedDeviceBasicSerialNumberAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicReachableCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicReachableAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readReachableAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readBridgedDeviceBasicReachableCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readReachableAttribute", readBridgedDeviceBasicReachableAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicUniqueIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicUniqueIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readUniqueIDAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBridgedDeviceBasicUniqueIDCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readUniqueIDAttribute", readBridgedDeviceBasicUniqueIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BridgedDeviceBasicCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBridgedDeviceBasicClusterGeneratedCommandListAttributeCallback(),
            readBridgedDeviceBasicGeneratedCommandListCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readBridgedDeviceBasicGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BridgedDeviceBasicCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBridgedDeviceBasicClusterAcceptedCommandListAttributeCallback(),
            readBridgedDeviceBasicAcceptedCommandListCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readBridgedDeviceBasicAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BridgedDeviceBasicCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBridgedDeviceBasicClusterAttributeListAttributeCallback(),
            readBridgedDeviceBasicAttributeListCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readAttributeListAttribute", readBridgedDeviceBasicAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBridgedDeviceBasicFeatureMapCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readFeatureMapAttribute", readBridgedDeviceBasicFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBridgedDeviceBasicClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBridgedDeviceBasicClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBridgedDeviceBasicClusterRevisionCommandParams);
    readBridgedDeviceBasicInteractionInfo.put(
        "readClusterRevisionAttribute",
        readBridgedDeviceBasicClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("bridgedDeviceBasic", readBridgedDeviceBasicInteractionInfo);
    Map<String, InteractionInfo> readSwitchInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readSwitchNumberOfPositionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchNumberOfPositionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readNumberOfPositionsAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readSwitchNumberOfPositionsCommandParams);
    readSwitchInteractionInfo.put(
        "readNumberOfPositionsAttribute", readSwitchNumberOfPositionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSwitchCurrentPositionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchCurrentPositionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readCurrentPositionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readSwitchCurrentPositionCommandParams);
    readSwitchInteractionInfo.put(
        "readCurrentPositionAttribute", readSwitchCurrentPositionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSwitchMultiPressMaxCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchMultiPressMaxAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readMultiPressMaxAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readSwitchMultiPressMaxCommandParams);
    readSwitchInteractionInfo.put(
        "readMultiPressMaxAttribute", readSwitchMultiPressMaxAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSwitchGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.SwitchCluster.GeneratedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedSwitchClusterGeneratedCommandListAttributeCallback(),
            readSwitchGeneratedCommandListCommandParams);
    readSwitchInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readSwitchGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSwitchAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.SwitchCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedSwitchClusterAcceptedCommandListAttributeCallback(),
            readSwitchAcceptedCommandListCommandParams);
    readSwitchInteractionInfo.put(
        "readAcceptedCommandListAttribute", readSwitchAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSwitchAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.SwitchCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedSwitchClusterAttributeListAttributeCallback(),
            readSwitchAttributeListCommandParams);
    readSwitchInteractionInfo.put(
        "readAttributeListAttribute", readSwitchAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSwitchFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readSwitchFeatureMapCommandParams);
    readSwitchInteractionInfo.put(
        "readFeatureMapAttribute", readSwitchFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readSwitchClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readSwitchClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.SwitchCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readSwitchClusterRevisionCommandParams);
    readSwitchInteractionInfo.put(
        "readClusterRevisionAttribute", readSwitchClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("switch", readSwitchInteractionInfo);
    Map<String, InteractionInfo> readAdministratorCommissioningInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readAdministratorCommissioningWindowStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningWindowStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readWindowStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAdministratorCommissioningWindowStatusCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readWindowStatusAttribute",
        readAdministratorCommissioningWindowStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAdministratorCommissioningAdminFabricIndexCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningAdminFabricIndexAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readAdminFabricIndexAttribute(
                      (ChipClusters.AdministratorCommissioningCluster
                              .AdminFabricIndexAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAdministratorCommissioningAdminFabricIndexCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readAdminFabricIndexAttribute",
        readAdministratorCommissioningAdminFabricIndexAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAdministratorCommissioningAdminVendorIdCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningAdminVendorIdAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readAdminVendorIdAttribute(
                      (ChipClusters.AdministratorCommissioningCluster
                              .AdminVendorIdAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAdministratorCommissioningAdminVendorIdCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readAdminVendorIdAttribute",
        readAdministratorCommissioningAdminVendorIdAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readAdministratorCommissioningGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.AdministratorCommissioningCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAdministratorCommissioningClusterGeneratedCommandListAttributeCallback(),
            readAdministratorCommissioningGeneratedCommandListCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readAdministratorCommissioningGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readAdministratorCommissioningAcceptedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.AdministratorCommissioningCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAdministratorCommissioningClusterAcceptedCommandListAttributeCallback(),
            readAdministratorCommissioningAcceptedCommandListCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readAdministratorCommissioningAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAdministratorCommissioningAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.AdministratorCommissioningCluster
                              .AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAdministratorCommissioningClusterAttributeListAttributeCallback(),
            readAdministratorCommissioningAttributeListCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readAttributeListAttribute",
        readAdministratorCommissioningAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAdministratorCommissioningFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readAdministratorCommissioningFeatureMapCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readFeatureMapAttribute",
        readAdministratorCommissioningFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAdministratorCommissioningClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAdministratorCommissioningClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AdministratorCommissioningCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAdministratorCommissioningClusterRevisionCommandParams);
    readAdministratorCommissioningInteractionInfo.put(
        "readClusterRevisionAttribute",
        readAdministratorCommissioningClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put(
        "administratorCommissioning", readAdministratorCommissioningInteractionInfo);
    Map<String, InteractionInfo> readOperationalCredentialsInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readOperationalCredentialsNOCsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsNOCsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readNOCsAttribute(
                      (ChipClusters.OperationalCredentialsCluster.NOCsAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOperationalCredentialsClusterNOCsAttributeCallback(),
            readOperationalCredentialsNOCsCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readNOCsAttribute", readOperationalCredentialsNOCsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsFabricsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsFabricsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readFabricsAttribute(
                      (ChipClusters.OperationalCredentialsCluster.FabricsAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOperationalCredentialsClusterFabricsAttributeCallback(),
            readOperationalCredentialsFabricsCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readFabricsAttribute", readOperationalCredentialsFabricsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsSupportedFabricsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsSupportedFabricsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readSupportedFabricsAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOperationalCredentialsSupportedFabricsCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readSupportedFabricsAttribute",
        readOperationalCredentialsSupportedFabricsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsCommissionedFabricsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsCommissionedFabricsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readCommissionedFabricsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOperationalCredentialsCommissionedFabricsCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readCommissionedFabricsAttribute",
        readOperationalCredentialsCommissionedFabricsAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readOperationalCredentialsTrustedRootCertificatesCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsTrustedRootCertificatesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readTrustedRootCertificatesAttribute(
                      (ChipClusters.OperationalCredentialsCluster
                              .TrustedRootCertificatesAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOperationalCredentialsClusterTrustedRootCertificatesAttributeCallback(),
            readOperationalCredentialsTrustedRootCertificatesCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readTrustedRootCertificatesAttribute",
        readOperationalCredentialsTrustedRootCertificatesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsCurrentFabricIndexCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsCurrentFabricIndexAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readCurrentFabricIndexAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOperationalCredentialsCurrentFabricIndexCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readCurrentFabricIndexAttribute",
        readOperationalCredentialsCurrentFabricIndexAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.OperationalCredentialsCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOperationalCredentialsClusterGeneratedCommandListAttributeCallback(),
            readOperationalCredentialsGeneratedCommandListCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readOperationalCredentialsGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.OperationalCredentialsCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOperationalCredentialsClusterAcceptedCommandListAttributeCallback(),
            readOperationalCredentialsAcceptedCommandListCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readOperationalCredentialsAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.OperationalCredentialsCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOperationalCredentialsClusterAttributeListAttributeCallback(),
            readOperationalCredentialsAttributeListCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readAttributeListAttribute",
        readOperationalCredentialsAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readOperationalCredentialsFeatureMapCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readFeatureMapAttribute", readOperationalCredentialsFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOperationalCredentialsClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOperationalCredentialsClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OperationalCredentialsCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOperationalCredentialsClusterRevisionCommandParams);
    readOperationalCredentialsInteractionInfo.put(
        "readClusterRevisionAttribute",
        readOperationalCredentialsClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("operationalCredentials", readOperationalCredentialsInteractionInfo);
    Map<String, InteractionInfo> readGroupKeyManagementInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readGroupKeyManagementGroupKeyMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementGroupKeyMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readGroupKeyMapAttribute(
                      (ChipClusters.GroupKeyManagementCluster.GroupKeyMapAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGroupKeyManagementClusterGroupKeyMapAttributeCallback(),
            readGroupKeyManagementGroupKeyMapCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readGroupKeyMapAttribute", readGroupKeyManagementGroupKeyMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementGroupTableCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementGroupTableAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readGroupTableAttribute(
                      (ChipClusters.GroupKeyManagementCluster.GroupTableAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGroupKeyManagementClusterGroupTableAttributeCallback(),
            readGroupKeyManagementGroupTableCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readGroupTableAttribute", readGroupKeyManagementGroupTableAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementMaxGroupsPerFabricCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementMaxGroupsPerFabricAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readMaxGroupsPerFabricAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGroupKeyManagementMaxGroupsPerFabricCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readMaxGroupsPerFabricAttribute",
        readGroupKeyManagementMaxGroupsPerFabricAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementMaxGroupKeysPerFabricCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementMaxGroupKeysPerFabricAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readMaxGroupKeysPerFabricAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGroupKeyManagementMaxGroupKeysPerFabricCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readMaxGroupKeysPerFabricAttribute",
        readGroupKeyManagementMaxGroupKeysPerFabricAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.GroupKeyManagementCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGroupKeyManagementClusterGeneratedCommandListAttributeCallback(),
            readGroupKeyManagementGeneratedCommandListCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readGroupKeyManagementGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.GroupKeyManagementCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGroupKeyManagementClusterAcceptedCommandListAttributeCallback(),
            readGroupKeyManagementAcceptedCommandListCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readGroupKeyManagementAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.GroupKeyManagementCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedGroupKeyManagementClusterAttributeListAttributeCallback(),
            readGroupKeyManagementAttributeListCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readAttributeListAttribute", readGroupKeyManagementAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readGroupKeyManagementFeatureMapCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readFeatureMapAttribute", readGroupKeyManagementFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readGroupKeyManagementClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readGroupKeyManagementClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GroupKeyManagementCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readGroupKeyManagementClusterRevisionCommandParams);
    readGroupKeyManagementInteractionInfo.put(
        "readClusterRevisionAttribute",
        readGroupKeyManagementClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("groupKeyManagement", readGroupKeyManagementInteractionInfo);
    Map<String, InteractionInfo> readFixedLabelInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readFixedLabelLabelListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFixedLabelLabelListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FixedLabelCluster) cluster)
                  .readLabelListAttribute(
                      (ChipClusters.FixedLabelCluster.LabelListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedFixedLabelClusterLabelListAttributeCallback(),
            readFixedLabelLabelListCommandParams);
    readFixedLabelInteractionInfo.put(
        "readLabelListAttribute", readFixedLabelLabelListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFixedLabelGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFixedLabelGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FixedLabelCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.FixedLabelCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedFixedLabelClusterGeneratedCommandListAttributeCallback(),
            readFixedLabelGeneratedCommandListCommandParams);
    readFixedLabelInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readFixedLabelGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFixedLabelAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFixedLabelAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FixedLabelCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.FixedLabelCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedFixedLabelClusterAcceptedCommandListAttributeCallback(),
            readFixedLabelAcceptedCommandListCommandParams);
    readFixedLabelInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readFixedLabelAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFixedLabelAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFixedLabelAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FixedLabelCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.FixedLabelCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedFixedLabelClusterAttributeListAttributeCallback(),
            readFixedLabelAttributeListCommandParams);
    readFixedLabelInteractionInfo.put(
        "readAttributeListAttribute", readFixedLabelAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFixedLabelFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFixedLabelFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FixedLabelCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readFixedLabelFeatureMapCommandParams);
    readFixedLabelInteractionInfo.put(
        "readFeatureMapAttribute", readFixedLabelFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFixedLabelClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFixedLabelClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FixedLabelCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFixedLabelClusterRevisionCommandParams);
    readFixedLabelInteractionInfo.put(
        "readClusterRevisionAttribute", readFixedLabelClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("fixedLabel", readFixedLabelInteractionInfo);
    Map<String, InteractionInfo> readUserLabelInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readUserLabelLabelListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUserLabelLabelListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UserLabelCluster) cluster)
                  .readLabelListAttribute(
                      (ChipClusters.UserLabelCluster.LabelListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedUserLabelClusterLabelListAttributeCallback(),
            readUserLabelLabelListCommandParams);
    readUserLabelInteractionInfo.put(
        "readLabelListAttribute", readUserLabelLabelListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readUserLabelGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUserLabelGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UserLabelCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.UserLabelCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedUserLabelClusterGeneratedCommandListAttributeCallback(),
            readUserLabelGeneratedCommandListCommandParams);
    readUserLabelInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readUserLabelGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readUserLabelAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUserLabelAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UserLabelCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.UserLabelCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedUserLabelClusterAcceptedCommandListAttributeCallback(),
            readUserLabelAcceptedCommandListCommandParams);
    readUserLabelInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readUserLabelAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readUserLabelFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUserLabelFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UserLabelCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readUserLabelFeatureMapCommandParams);
    readUserLabelInteractionInfo.put(
        "readFeatureMapAttribute", readUserLabelFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readUserLabelClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readUserLabelClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UserLabelCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readUserLabelClusterRevisionCommandParams);
    readUserLabelInteractionInfo.put(
        "readClusterRevisionAttribute", readUserLabelClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("userLabel", readUserLabelInteractionInfo);
    Map<String, InteractionInfo> readBooleanStateInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBooleanStateStateValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBooleanStateStateValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BooleanStateCluster) cluster)
                  .readStateValueAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readBooleanStateStateValueCommandParams);
    readBooleanStateInteractionInfo.put(
        "readStateValueAttribute", readBooleanStateStateValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBooleanStateGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBooleanStateGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BooleanStateCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BooleanStateCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBooleanStateClusterGeneratedCommandListAttributeCallback(),
            readBooleanStateGeneratedCommandListCommandParams);
    readBooleanStateInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readBooleanStateGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBooleanStateAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBooleanStateAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BooleanStateCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BooleanStateCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBooleanStateClusterAcceptedCommandListAttributeCallback(),
            readBooleanStateAcceptedCommandListCommandParams);
    readBooleanStateInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readBooleanStateAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBooleanStateAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBooleanStateAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BooleanStateCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BooleanStateCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedBooleanStateClusterAttributeListAttributeCallback(),
            readBooleanStateAttributeListCommandParams);
    readBooleanStateInteractionInfo.put(
        "readAttributeListAttribute", readBooleanStateAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBooleanStateFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBooleanStateFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BooleanStateCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBooleanStateFeatureMapCommandParams);
    readBooleanStateInteractionInfo.put(
        "readFeatureMapAttribute", readBooleanStateFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBooleanStateClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBooleanStateClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BooleanStateCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBooleanStateClusterRevisionCommandParams);
    readBooleanStateInteractionInfo.put(
        "readClusterRevisionAttribute", readBooleanStateClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("booleanState", readBooleanStateInteractionInfo);
    Map<String, InteractionInfo> readModeSelectInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readModeSelectDescriptionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectDescriptionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readDescriptionAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readModeSelectDescriptionCommandParams);
    readModeSelectInteractionInfo.put(
        "readDescriptionAttribute", readModeSelectDescriptionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectStandardNamespaceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectStandardNamespaceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readStandardNamespaceAttribute(
                      (ChipClusters.ModeSelectCluster.StandardNamespaceAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readModeSelectStandardNamespaceCommandParams);
    readModeSelectInteractionInfo.put(
        "readStandardNamespaceAttribute", readModeSelectStandardNamespaceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectSupportedModesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectSupportedModesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readSupportedModesAttribute(
                      (ChipClusters.ModeSelectCluster.SupportedModesAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedModeSelectClusterSupportedModesAttributeCallback(),
            readModeSelectSupportedModesCommandParams);
    readModeSelectInteractionInfo.put(
        "readSupportedModesAttribute", readModeSelectSupportedModesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectCurrentModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectCurrentModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readCurrentModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readModeSelectCurrentModeCommandParams);
    readModeSelectInteractionInfo.put(
        "readCurrentModeAttribute", readModeSelectCurrentModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectStartUpModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectStartUpModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readStartUpModeAttribute(
                      (ChipClusters.ModeSelectCluster.StartUpModeAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readModeSelectStartUpModeCommandParams);
    readModeSelectInteractionInfo.put(
        "readStartUpModeAttribute", readModeSelectStartUpModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectOnModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectOnModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readOnModeAttribute(
                      (ChipClusters.ModeSelectCluster.OnModeAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readModeSelectOnModeCommandParams);
    readModeSelectInteractionInfo.put(
        "readOnModeAttribute", readModeSelectOnModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ModeSelectCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedModeSelectClusterGeneratedCommandListAttributeCallback(),
            readModeSelectGeneratedCommandListCommandParams);
    readModeSelectInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readModeSelectGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ModeSelectCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedModeSelectClusterAcceptedCommandListAttributeCallback(),
            readModeSelectAcceptedCommandListCommandParams);
    readModeSelectInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readModeSelectAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ModeSelectCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedModeSelectClusterAttributeListAttributeCallback(),
            readModeSelectAttributeListCommandParams);
    readModeSelectInteractionInfo.put(
        "readAttributeListAttribute", readModeSelectAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readModeSelectFeatureMapCommandParams);
    readModeSelectInteractionInfo.put(
        "readFeatureMapAttribute", readModeSelectFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readModeSelectClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readModeSelectClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readModeSelectClusterRevisionCommandParams);
    readModeSelectInteractionInfo.put(
        "readClusterRevisionAttribute", readModeSelectClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("modeSelect", readModeSelectInteractionInfo);
    Map<String, InteractionInfo> readDoorLockInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readDoorLockLockStateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockLockStateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readLockStateAttribute(
                      (ChipClusters.DoorLockCluster.LockStateAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockLockStateCommandParams);
    readDoorLockInteractionInfo.put(
        "readLockStateAttribute", readDoorLockLockStateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockLockTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockLockTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readLockTypeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockLockTypeCommandParams);
    readDoorLockInteractionInfo.put(
        "readLockTypeAttribute", readDoorLockLockTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockActuatorEnabledCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockActuatorEnabledAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readActuatorEnabledAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readDoorLockActuatorEnabledCommandParams);
    readDoorLockInteractionInfo.put(
        "readActuatorEnabledAttribute", readDoorLockActuatorEnabledAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockDoorStateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockDoorStateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readDoorStateAttribute(
                      (ChipClusters.DoorLockCluster.DoorStateAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockDoorStateCommandParams);
    readDoorLockInteractionInfo.put(
        "readDoorStateAttribute", readDoorLockDoorStateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockNumberOfTotalUsersSupportedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockNumberOfTotalUsersSupportedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readNumberOfTotalUsersSupportedAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockNumberOfTotalUsersSupportedCommandParams);
    readDoorLockInteractionInfo.put(
        "readNumberOfTotalUsersSupportedAttribute",
        readDoorLockNumberOfTotalUsersSupportedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockNumberOfPINUsersSupportedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockNumberOfPINUsersSupportedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readNumberOfPINUsersSupportedAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockNumberOfPINUsersSupportedCommandParams);
    readDoorLockInteractionInfo.put(
        "readNumberOfPINUsersSupportedAttribute",
        readDoorLockNumberOfPINUsersSupportedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockNumberOfRFIDUsersSupportedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockNumberOfRFIDUsersSupportedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readNumberOfRFIDUsersSupportedAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockNumberOfRFIDUsersSupportedCommandParams);
    readDoorLockInteractionInfo.put(
        "readNumberOfRFIDUsersSupportedAttribute",
        readDoorLockNumberOfRFIDUsersSupportedAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readDoorLockNumberOfWeekDaySchedulesSupportedPerUserCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockNumberOfWeekDaySchedulesSupportedPerUserAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readNumberOfWeekDaySchedulesSupportedPerUserAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockNumberOfWeekDaySchedulesSupportedPerUserCommandParams);
    readDoorLockInteractionInfo.put(
        "readNumberOfWeekDaySchedulesSupportedPerUserAttribute",
        readDoorLockNumberOfWeekDaySchedulesSupportedPerUserAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readDoorLockNumberOfYearDaySchedulesSupportedPerUserCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockNumberOfYearDaySchedulesSupportedPerUserAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readNumberOfYearDaySchedulesSupportedPerUserAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockNumberOfYearDaySchedulesSupportedPerUserCommandParams);
    readDoorLockInteractionInfo.put(
        "readNumberOfYearDaySchedulesSupportedPerUserAttribute",
        readDoorLockNumberOfYearDaySchedulesSupportedPerUserAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockNumberOfHolidaySchedulesSupportedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockNumberOfHolidaySchedulesSupportedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readNumberOfHolidaySchedulesSupportedAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockNumberOfHolidaySchedulesSupportedCommandParams);
    readDoorLockInteractionInfo.put(
        "readNumberOfHolidaySchedulesSupportedAttribute",
        readDoorLockNumberOfHolidaySchedulesSupportedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockMaxPINCodeLengthCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockMaxPINCodeLengthAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readMaxPINCodeLengthAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockMaxPINCodeLengthCommandParams);
    readDoorLockInteractionInfo.put(
        "readMaxPINCodeLengthAttribute", readDoorLockMaxPINCodeLengthAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockMinPINCodeLengthCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockMinPINCodeLengthAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readMinPINCodeLengthAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockMinPINCodeLengthCommandParams);
    readDoorLockInteractionInfo.put(
        "readMinPINCodeLengthAttribute", readDoorLockMinPINCodeLengthAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockMaxRFIDCodeLengthCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockMaxRFIDCodeLengthAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readMaxRFIDCodeLengthAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockMaxRFIDCodeLengthCommandParams);
    readDoorLockInteractionInfo.put(
        "readMaxRFIDCodeLengthAttribute", readDoorLockMaxRFIDCodeLengthAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockMinRFIDCodeLengthCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockMinRFIDCodeLengthAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readMinRFIDCodeLengthAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockMinRFIDCodeLengthCommandParams);
    readDoorLockInteractionInfo.put(
        "readMinRFIDCodeLengthAttribute", readDoorLockMinRFIDCodeLengthAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockNumberOfCredentialsSupportedPerUserCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockNumberOfCredentialsSupportedPerUserAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readNumberOfCredentialsSupportedPerUserAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockNumberOfCredentialsSupportedPerUserCommandParams);
    readDoorLockInteractionInfo.put(
        "readNumberOfCredentialsSupportedPerUserAttribute",
        readDoorLockNumberOfCredentialsSupportedPerUserAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockLanguageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockLanguageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readLanguageAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readDoorLockLanguageCommandParams);
    readDoorLockInteractionInfo.put(
        "readLanguageAttribute", readDoorLockLanguageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockAutoRelockTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockAutoRelockTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readAutoRelockTimeAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readDoorLockAutoRelockTimeCommandParams);
    readDoorLockInteractionInfo.put(
        "readAutoRelockTimeAttribute", readDoorLockAutoRelockTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockSoundVolumeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockSoundVolumeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readSoundVolumeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockSoundVolumeCommandParams);
    readDoorLockInteractionInfo.put(
        "readSoundVolumeAttribute", readDoorLockSoundVolumeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockOperatingModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockOperatingModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readOperatingModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockOperatingModeCommandParams);
    readDoorLockInteractionInfo.put(
        "readOperatingModeAttribute", readDoorLockOperatingModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockSupportedOperatingModesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockSupportedOperatingModesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readSupportedOperatingModesAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockSupportedOperatingModesCommandParams);
    readDoorLockInteractionInfo.put(
        "readSupportedOperatingModesAttribute",
        readDoorLockSupportedOperatingModesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockEnableOneTouchLockingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockEnableOneTouchLockingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readEnableOneTouchLockingAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readDoorLockEnableOneTouchLockingCommandParams);
    readDoorLockInteractionInfo.put(
        "readEnableOneTouchLockingAttribute",
        readDoorLockEnableOneTouchLockingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockEnablePrivacyModeButtonCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockEnablePrivacyModeButtonAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readEnablePrivacyModeButtonAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readDoorLockEnablePrivacyModeButtonCommandParams);
    readDoorLockInteractionInfo.put(
        "readEnablePrivacyModeButtonAttribute",
        readDoorLockEnablePrivacyModeButtonAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockWrongCodeEntryLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockWrongCodeEntryLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readWrongCodeEntryLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockWrongCodeEntryLimitCommandParams);
    readDoorLockInteractionInfo.put(
        "readWrongCodeEntryLimitAttribute",
        readDoorLockWrongCodeEntryLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockUserCodeTemporaryDisableTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockUserCodeTemporaryDisableTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readUserCodeTemporaryDisableTimeAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockUserCodeTemporaryDisableTimeCommandParams);
    readDoorLockInteractionInfo.put(
        "readUserCodeTemporaryDisableTimeAttribute",
        readDoorLockUserCodeTemporaryDisableTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockRequirePINforRemoteOperationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockRequirePINforRemoteOperationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readRequirePINforRemoteOperationAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readDoorLockRequirePINforRemoteOperationCommandParams);
    readDoorLockInteractionInfo.put(
        "readRequirePINforRemoteOperationAttribute",
        readDoorLockRequirePINforRemoteOperationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.DoorLockCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedDoorLockClusterGeneratedCommandListAttributeCallback(),
            readDoorLockGeneratedCommandListCommandParams);
    readDoorLockInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readDoorLockGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.DoorLockCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedDoorLockClusterAcceptedCommandListAttributeCallback(),
            readDoorLockAcceptedCommandListCommandParams);
    readDoorLockInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readDoorLockAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.DoorLockCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedDoorLockClusterAttributeListAttributeCallback(),
            readDoorLockAttributeListCommandParams);
    readDoorLockInteractionInfo.put(
        "readAttributeListAttribute", readDoorLockAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readDoorLockFeatureMapCommandParams);
    readDoorLockInteractionInfo.put(
        "readFeatureMapAttribute", readDoorLockFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readDoorLockClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readDoorLockClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readDoorLockClusterRevisionCommandParams);
    readDoorLockInteractionInfo.put(
        "readClusterRevisionAttribute", readDoorLockClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("doorLock", readDoorLockInteractionInfo);
    Map<String, InteractionInfo> readWindowCoveringInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readWindowCoveringTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readTypeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringTypeCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readTypeAttribute", readWindowCoveringTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringPhysicalClosedLimitLiftCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringPhysicalClosedLimitLiftAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readPhysicalClosedLimitLiftAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringPhysicalClosedLimitLiftCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readPhysicalClosedLimitLiftAttribute",
        readWindowCoveringPhysicalClosedLimitLiftAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringPhysicalClosedLimitTiltCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringPhysicalClosedLimitTiltAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readPhysicalClosedLimitTiltAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringPhysicalClosedLimitTiltCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readPhysicalClosedLimitTiltAttribute",
        readWindowCoveringPhysicalClosedLimitTiltAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringCurrentPositionLiftCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringCurrentPositionLiftAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readCurrentPositionLiftAttribute(
                      (ChipClusters.WindowCoveringCluster.CurrentPositionLiftAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringCurrentPositionLiftCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readCurrentPositionLiftAttribute",
        readWindowCoveringCurrentPositionLiftAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringCurrentPositionTiltCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringCurrentPositionTiltAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readCurrentPositionTiltAttribute(
                      (ChipClusters.WindowCoveringCluster.CurrentPositionTiltAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringCurrentPositionTiltCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readCurrentPositionTiltAttribute",
        readWindowCoveringCurrentPositionTiltAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringNumberOfActuationsLiftCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringNumberOfActuationsLiftAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readNumberOfActuationsLiftAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringNumberOfActuationsLiftCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readNumberOfActuationsLiftAttribute",
        readWindowCoveringNumberOfActuationsLiftAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringNumberOfActuationsTiltCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringNumberOfActuationsTiltAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readNumberOfActuationsTiltAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringNumberOfActuationsTiltCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readNumberOfActuationsTiltAttribute",
        readWindowCoveringNumberOfActuationsTiltAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringConfigStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringConfigStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readConfigStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringConfigStatusCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readConfigStatusAttribute", readWindowCoveringConfigStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringCurrentPositionLiftPercentageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringCurrentPositionLiftPercentageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readCurrentPositionLiftPercentageAttribute(
                      (ChipClusters.WindowCoveringCluster
                              .CurrentPositionLiftPercentageAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringCurrentPositionLiftPercentageCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readCurrentPositionLiftPercentageAttribute",
        readWindowCoveringCurrentPositionLiftPercentageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringCurrentPositionTiltPercentageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringCurrentPositionTiltPercentageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readCurrentPositionTiltPercentageAttribute(
                      (ChipClusters.WindowCoveringCluster
                              .CurrentPositionTiltPercentageAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringCurrentPositionTiltPercentageCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readCurrentPositionTiltPercentageAttribute",
        readWindowCoveringCurrentPositionTiltPercentageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringOperationalStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringOperationalStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readOperationalStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringOperationalStatusCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readOperationalStatusAttribute",
        readWindowCoveringOperationalStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readWindowCoveringTargetPositionLiftPercent100thsCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringTargetPositionLiftPercent100thsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readTargetPositionLiftPercent100thsAttribute(
                      (ChipClusters.WindowCoveringCluster
                              .TargetPositionLiftPercent100thsAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringTargetPositionLiftPercent100thsCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readTargetPositionLiftPercent100thsAttribute",
        readWindowCoveringTargetPositionLiftPercent100thsAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readWindowCoveringTargetPositionTiltPercent100thsCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringTargetPositionTiltPercent100thsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readTargetPositionTiltPercent100thsAttribute(
                      (ChipClusters.WindowCoveringCluster
                              .TargetPositionTiltPercent100thsAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringTargetPositionTiltPercent100thsCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readTargetPositionTiltPercent100thsAttribute",
        readWindowCoveringTargetPositionTiltPercent100thsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringEndProductTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringEndProductTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readEndProductTypeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringEndProductTypeCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readEndProductTypeAttribute", readWindowCoveringEndProductTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readWindowCoveringCurrentPositionLiftPercent100thsCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringCurrentPositionLiftPercent100thsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readCurrentPositionLiftPercent100thsAttribute(
                      (ChipClusters.WindowCoveringCluster
                              .CurrentPositionLiftPercent100thsAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringCurrentPositionLiftPercent100thsCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readCurrentPositionLiftPercent100thsAttribute",
        readWindowCoveringCurrentPositionLiftPercent100thsAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readWindowCoveringCurrentPositionTiltPercent100thsCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringCurrentPositionTiltPercent100thsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readCurrentPositionTiltPercent100thsAttribute(
                      (ChipClusters.WindowCoveringCluster
                              .CurrentPositionTiltPercent100thsAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringCurrentPositionTiltPercent100thsCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readCurrentPositionTiltPercent100thsAttribute",
        readWindowCoveringCurrentPositionTiltPercent100thsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringInstalledOpenLimitLiftCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringInstalledOpenLimitLiftAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readInstalledOpenLimitLiftAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringInstalledOpenLimitLiftCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readInstalledOpenLimitLiftAttribute",
        readWindowCoveringInstalledOpenLimitLiftAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringInstalledClosedLimitLiftCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringInstalledClosedLimitLiftAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readInstalledClosedLimitLiftAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringInstalledClosedLimitLiftCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readInstalledClosedLimitLiftAttribute",
        readWindowCoveringInstalledClosedLimitLiftAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringInstalledOpenLimitTiltCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringInstalledOpenLimitTiltAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readInstalledOpenLimitTiltAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringInstalledOpenLimitTiltCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readInstalledOpenLimitTiltAttribute",
        readWindowCoveringInstalledOpenLimitTiltAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringInstalledClosedLimitTiltCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringInstalledClosedLimitTiltAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readInstalledClosedLimitTiltAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringInstalledClosedLimitTiltCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readInstalledClosedLimitTiltAttribute",
        readWindowCoveringInstalledClosedLimitTiltAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringModeCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readModeAttribute", readWindowCoveringModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringSafetyStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringSafetyStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readSafetyStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringSafetyStatusCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readSafetyStatusAttribute", readWindowCoveringSafetyStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.WindowCoveringCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWindowCoveringClusterGeneratedCommandListAttributeCallback(),
            readWindowCoveringGeneratedCommandListCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readWindowCoveringGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.WindowCoveringCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWindowCoveringClusterAcceptedCommandListAttributeCallback(),
            readWindowCoveringAcceptedCommandListCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readWindowCoveringAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.WindowCoveringCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWindowCoveringClusterAttributeListAttributeCallback(),
            readWindowCoveringAttributeListCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readAttributeListAttribute", readWindowCoveringAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWindowCoveringFeatureMapCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readFeatureMapAttribute", readWindowCoveringFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWindowCoveringClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWindowCoveringClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWindowCoveringClusterRevisionCommandParams);
    readWindowCoveringInteractionInfo.put(
        "readClusterRevisionAttribute", readWindowCoveringClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("windowCovering", readWindowCoveringInteractionInfo);
    Map<String, InteractionInfo> readBarrierControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBarrierControlBarrierMovingStateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlBarrierMovingStateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readBarrierMovingStateAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBarrierControlBarrierMovingStateCommandParams);
    readBarrierControlInteractionInfo.put(
        "readBarrierMovingStateAttribute",
        readBarrierControlBarrierMovingStateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlBarrierSafetyStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlBarrierSafetyStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readBarrierSafetyStatusAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBarrierControlBarrierSafetyStatusCommandParams);
    readBarrierControlInteractionInfo.put(
        "readBarrierSafetyStatusAttribute",
        readBarrierControlBarrierSafetyStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlBarrierCapabilitiesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlBarrierCapabilitiesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readBarrierCapabilitiesAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBarrierControlBarrierCapabilitiesCommandParams);
    readBarrierControlInteractionInfo.put(
        "readBarrierCapabilitiesAttribute",
        readBarrierControlBarrierCapabilitiesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlBarrierPositionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlBarrierPositionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readBarrierPositionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBarrierControlBarrierPositionCommandParams);
    readBarrierControlInteractionInfo.put(
        "readBarrierPositionAttribute", readBarrierControlBarrierPositionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BarrierControlCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBarrierControlClusterGeneratedCommandListAttributeCallback(),
            readBarrierControlGeneratedCommandListCommandParams);
    readBarrierControlInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readBarrierControlGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BarrierControlCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBarrierControlClusterAcceptedCommandListAttributeCallback(),
            readBarrierControlAcceptedCommandListCommandParams);
    readBarrierControlInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readBarrierControlAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BarrierControlCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBarrierControlClusterAttributeListAttributeCallback(),
            readBarrierControlAttributeListCommandParams);
    readBarrierControlInteractionInfo.put(
        "readAttributeListAttribute", readBarrierControlAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBarrierControlFeatureMapCommandParams);
    readBarrierControlInteractionInfo.put(
        "readFeatureMapAttribute", readBarrierControlFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBarrierControlClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBarrierControlClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BarrierControlCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBarrierControlClusterRevisionCommandParams);
    readBarrierControlInteractionInfo.put(
        "readClusterRevisionAttribute", readBarrierControlClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("barrierControl", readBarrierControlInteractionInfo);
    Map<String, InteractionInfo> readPumpConfigurationAndControlInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxPressureCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxPressureAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxPressureAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster.MaxPressureAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxPressureCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxPressureAttribute",
        readPumpConfigurationAndControlMaxPressureAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxSpeedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxSpeedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxSpeedAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster.MaxSpeedAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxSpeedCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxSpeedAttribute", readPumpConfigurationAndControlMaxSpeedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxFlowCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxFlowAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxFlowAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster.MaxFlowAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxFlowCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxFlowAttribute", readPumpConfigurationAndControlMaxFlowAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMinConstPressureCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMinConstPressureAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMinConstPressureAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MinConstPressureAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMinConstPressureCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMinConstPressureAttribute",
        readPumpConfigurationAndControlMinConstPressureAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxConstPressureCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxConstPressureAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxConstPressureAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MaxConstPressureAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxConstPressureCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxConstPressureAttribute",
        readPumpConfigurationAndControlMaxConstPressureAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMinCompPressureCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMinCompPressureAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMinCompPressureAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MinCompPressureAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMinCompPressureCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMinCompPressureAttribute",
        readPumpConfigurationAndControlMinCompPressureAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxCompPressureCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxCompPressureAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxCompPressureAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MaxCompPressureAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxCompPressureCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxCompPressureAttribute",
        readPumpConfigurationAndControlMaxCompPressureAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMinConstSpeedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMinConstSpeedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMinConstSpeedAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MinConstSpeedAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMinConstSpeedCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMinConstSpeedAttribute",
        readPumpConfigurationAndControlMinConstSpeedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxConstSpeedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxConstSpeedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxConstSpeedAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MaxConstSpeedAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxConstSpeedCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxConstSpeedAttribute",
        readPumpConfigurationAndControlMaxConstSpeedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMinConstFlowCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMinConstFlowAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMinConstFlowAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MinConstFlowAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMinConstFlowCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMinConstFlowAttribute",
        readPumpConfigurationAndControlMinConstFlowAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxConstFlowCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxConstFlowAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxConstFlowAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MaxConstFlowAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxConstFlowCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxConstFlowAttribute",
        readPumpConfigurationAndControlMaxConstFlowAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMinConstTempCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMinConstTempAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMinConstTempAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MinConstTempAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMinConstTempCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMinConstTempAttribute",
        readPumpConfigurationAndControlMinConstTempAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlMaxConstTempCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlMaxConstTempAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readMaxConstTempAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .MaxConstTempAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlMaxConstTempCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readMaxConstTempAttribute",
        readPumpConfigurationAndControlMaxConstTempAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlPumpStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlPumpStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readPumpStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlPumpStatusCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readPumpStatusAttribute",
        readPumpConfigurationAndControlPumpStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readPumpConfigurationAndControlEffectiveOperationModeCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlEffectiveOperationModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readEffectiveOperationModeAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlEffectiveOperationModeCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readEffectiveOperationModeAttribute",
        readPumpConfigurationAndControlEffectiveOperationModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readPumpConfigurationAndControlEffectiveControlModeCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlEffectiveControlModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readEffectiveControlModeAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlEffectiveControlModeCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readEffectiveControlModeAttribute",
        readPumpConfigurationAndControlEffectiveControlModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlCapacityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlCapacityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readCapacityAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster.CapacityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlCapacityCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readCapacityAttribute", readPumpConfigurationAndControlCapacityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlSpeedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlSpeedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readSpeedAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster.SpeedAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlSpeedCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readSpeedAttribute", readPumpConfigurationAndControlSpeedAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readPumpConfigurationAndControlLifetimeRunningHoursCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlLifetimeRunningHoursAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readLifetimeRunningHoursAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .LifetimeRunningHoursAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPumpConfigurationAndControlLifetimeRunningHoursCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readLifetimeRunningHoursAttribute",
        readPumpConfigurationAndControlLifetimeRunningHoursAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlPowerCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlPowerAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readPowerAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster.PowerAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPumpConfigurationAndControlPowerCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readPowerAttribute", readPumpConfigurationAndControlPowerAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readPumpConfigurationAndControlLifetimeEnergyConsumedCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlLifetimeEnergyConsumedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readLifetimeEnergyConsumedAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .LifetimeEnergyConsumedAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPumpConfigurationAndControlLifetimeEnergyConsumedCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readLifetimeEnergyConsumedAttribute",
        readPumpConfigurationAndControlLifetimeEnergyConsumedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlOperationModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlOperationModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readOperationModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlOperationModeCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readOperationModeAttribute",
        readPumpConfigurationAndControlOperationModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlControlModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlControlModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readControlModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlControlModeCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readControlModeAttribute",
        readPumpConfigurationAndControlControlModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readPumpConfigurationAndControlGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPumpConfigurationAndControlClusterGeneratedCommandListAttributeCallback(),
            readPumpConfigurationAndControlGeneratedCommandListCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readPumpConfigurationAndControlGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readPumpConfigurationAndControlAcceptedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPumpConfigurationAndControlClusterAcceptedCommandListAttributeCallback(),
            readPumpConfigurationAndControlAcceptedCommandListCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readPumpConfigurationAndControlAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.PumpConfigurationAndControlCluster
                              .AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPumpConfigurationAndControlClusterAttributeListAttributeCallback(),
            readPumpConfigurationAndControlAttributeListCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readAttributeListAttribute",
        readPumpConfigurationAndControlAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPumpConfigurationAndControlFeatureMapCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readFeatureMapAttribute",
        readPumpConfigurationAndControlFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPumpConfigurationAndControlClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPumpConfigurationAndControlClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPumpConfigurationAndControlClusterRevisionCommandParams);
    readPumpConfigurationAndControlInteractionInfo.put(
        "readClusterRevisionAttribute",
        readPumpConfigurationAndControlClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put(
        "pumpConfigurationAndControl", readPumpConfigurationAndControlInteractionInfo);
    Map<String, InteractionInfo> readThermostatInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readThermostatLocalTemperatureCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatLocalTemperatureAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readLocalTemperatureAttribute(
                      (ChipClusters.ThermostatCluster.LocalTemperatureAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatLocalTemperatureCommandParams);
    readThermostatInteractionInfo.put(
        "readLocalTemperatureAttribute", readThermostatLocalTemperatureAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatAbsMinHeatSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatAbsMinHeatSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readAbsMinHeatSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatAbsMinHeatSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readAbsMinHeatSetpointLimitAttribute",
        readThermostatAbsMinHeatSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatAbsMaxHeatSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatAbsMaxHeatSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readAbsMaxHeatSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatAbsMaxHeatSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readAbsMaxHeatSetpointLimitAttribute",
        readThermostatAbsMaxHeatSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatAbsMinCoolSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatAbsMinCoolSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readAbsMinCoolSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatAbsMinCoolSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readAbsMinCoolSetpointLimitAttribute",
        readThermostatAbsMinCoolSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatAbsMaxCoolSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatAbsMaxCoolSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readAbsMaxCoolSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatAbsMaxCoolSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readAbsMaxCoolSetpointLimitAttribute",
        readThermostatAbsMaxCoolSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatOccupiedCoolingSetpointCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatOccupiedCoolingSetpointAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readOccupiedCoolingSetpointAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatOccupiedCoolingSetpointCommandParams);
    readThermostatInteractionInfo.put(
        "readOccupiedCoolingSetpointAttribute",
        readThermostatOccupiedCoolingSetpointAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatOccupiedHeatingSetpointCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatOccupiedHeatingSetpointAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readOccupiedHeatingSetpointAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatOccupiedHeatingSetpointCommandParams);
    readThermostatInteractionInfo.put(
        "readOccupiedHeatingSetpointAttribute",
        readThermostatOccupiedHeatingSetpointAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatMinHeatSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatMinHeatSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readMinHeatSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatMinHeatSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readMinHeatSetpointLimitAttribute",
        readThermostatMinHeatSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatMaxHeatSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatMaxHeatSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readMaxHeatSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatMaxHeatSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readMaxHeatSetpointLimitAttribute",
        readThermostatMaxHeatSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatMinCoolSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatMinCoolSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readMinCoolSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatMinCoolSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readMinCoolSetpointLimitAttribute",
        readThermostatMinCoolSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatMaxCoolSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatMaxCoolSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readMaxCoolSetpointLimitAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatMaxCoolSetpointLimitCommandParams);
    readThermostatInteractionInfo.put(
        "readMaxCoolSetpointLimitAttribute",
        readThermostatMaxCoolSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatMinSetpointDeadBandCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatMinSetpointDeadBandAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readMinSetpointDeadBandAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatMinSetpointDeadBandCommandParams);
    readThermostatInteractionInfo.put(
        "readMinSetpointDeadBandAttribute",
        readThermostatMinSetpointDeadBandAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatControlSequenceOfOperationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatControlSequenceOfOperationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readControlSequenceOfOperationAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatControlSequenceOfOperationCommandParams);
    readThermostatInteractionInfo.put(
        "readControlSequenceOfOperationAttribute",
        readThermostatControlSequenceOfOperationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatSystemModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatSystemModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readSystemModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatSystemModeCommandParams);
    readThermostatInteractionInfo.put(
        "readSystemModeAttribute", readThermostatSystemModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatStartOfWeekCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatStartOfWeekAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readStartOfWeekAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatStartOfWeekCommandParams);
    readThermostatInteractionInfo.put(
        "readStartOfWeekAttribute", readThermostatStartOfWeekAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatNumberOfWeeklyTransitionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatNumberOfWeeklyTransitionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readNumberOfWeeklyTransitionsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatNumberOfWeeklyTransitionsCommandParams);
    readThermostatInteractionInfo.put(
        "readNumberOfWeeklyTransitionsAttribute",
        readThermostatNumberOfWeeklyTransitionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatNumberOfDailyTransitionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatNumberOfDailyTransitionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readNumberOfDailyTransitionsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatNumberOfDailyTransitionsCommandParams);
    readThermostatInteractionInfo.put(
        "readNumberOfDailyTransitionsAttribute",
        readThermostatNumberOfDailyTransitionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ThermostatCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedThermostatClusterAttributeListAttributeCallback(),
            readThermostatAttributeListCommandParams);
    readThermostatInteractionInfo.put(
        "readAttributeListAttribute", readThermostatAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThermostatFeatureMapCommandParams);
    readThermostatInteractionInfo.put(
        "readFeatureMapAttribute", readThermostatFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readThermostatClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatClusterRevisionCommandParams);
    readThermostatInteractionInfo.put(
        "readClusterRevisionAttribute", readThermostatClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("thermostat", readThermostatInteractionInfo);
    Map<String, InteractionInfo> readFanControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readFanControlFanModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlFanModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readFanModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlFanModeCommandParams);
    readFanControlInteractionInfo.put(
        "readFanModeAttribute", readFanControlFanModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlFanModeSequenceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlFanModeSequenceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readFanModeSequenceAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlFanModeSequenceCommandParams);
    readFanControlInteractionInfo.put(
        "readFanModeSequenceAttribute", readFanControlFanModeSequenceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlPercentSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlPercentSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readPercentSettingAttribute(
                      (ChipClusters.FanControlCluster.PercentSettingAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlPercentSettingCommandParams);
    readFanControlInteractionInfo.put(
        "readPercentSettingAttribute", readFanControlPercentSettingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlPercentCurrentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlPercentCurrentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readPercentCurrentAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlPercentCurrentCommandParams);
    readFanControlInteractionInfo.put(
        "readPercentCurrentAttribute", readFanControlPercentCurrentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlSpeedMaxCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlSpeedMaxAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readSpeedMaxAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlSpeedMaxCommandParams);
    readFanControlInteractionInfo.put(
        "readSpeedMaxAttribute", readFanControlSpeedMaxAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlSpeedSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlSpeedSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readSpeedSettingAttribute(
                      (ChipClusters.FanControlCluster.SpeedSettingAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlSpeedSettingCommandParams);
    readFanControlInteractionInfo.put(
        "readSpeedSettingAttribute", readFanControlSpeedSettingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlSpeedCurrentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlSpeedCurrentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readSpeedCurrentAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlSpeedCurrentCommandParams);
    readFanControlInteractionInfo.put(
        "readSpeedCurrentAttribute", readFanControlSpeedCurrentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlRockSupportCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlRockSupportAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readRockSupportAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlRockSupportCommandParams);
    readFanControlInteractionInfo.put(
        "readRockSupportAttribute", readFanControlRockSupportAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlRockSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlRockSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readRockSettingAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlRockSettingCommandParams);
    readFanControlInteractionInfo.put(
        "readRockSettingAttribute", readFanControlRockSettingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlWindSupportCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlWindSupportAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readWindSupportAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlWindSupportCommandParams);
    readFanControlInteractionInfo.put(
        "readWindSupportAttribute", readFanControlWindSupportAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlWindSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlWindSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readWindSettingAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlWindSettingCommandParams);
    readFanControlInteractionInfo.put(
        "readWindSettingAttribute", readFanControlWindSettingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.FanControlCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedFanControlClusterGeneratedCommandListAttributeCallback(),
            readFanControlGeneratedCommandListCommandParams);
    readFanControlInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readFanControlGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.FanControlCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedFanControlClusterAcceptedCommandListAttributeCallback(),
            readFanControlAcceptedCommandListCommandParams);
    readFanControlInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readFanControlAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.FanControlCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedFanControlClusterAttributeListAttributeCallback(),
            readFanControlAttributeListCommandParams);
    readFanControlInteractionInfo.put(
        "readAttributeListAttribute", readFanControlAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readFanControlFeatureMapCommandParams);
    readFanControlInteractionInfo.put(
        "readFeatureMapAttribute", readFanControlFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFanControlClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFanControlClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFanControlClusterRevisionCommandParams);
    readFanControlInteractionInfo.put(
        "readClusterRevisionAttribute", readFanControlClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("fanControl", readFanControlInteractionInfo);
    Map<String, InteractionInfo> readThermostatUserInterfaceConfigurationInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationTemperatureDisplayModeCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThermostatUserInterfaceConfigurationTemperatureDisplayModeAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                      .readTemperatureDisplayModeAttribute(
                          (ChipClusters.IntegerAttributeCallback) callback);
                },
                () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
                readThermostatUserInterfaceConfigurationTemperatureDisplayModeCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readTemperatureDisplayModeAttribute",
        readThermostatUserInterfaceConfigurationTemperatureDisplayModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationKeypadLockoutCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatUserInterfaceConfigurationKeypadLockoutAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                  .readKeypadLockoutAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readThermostatUserInterfaceConfigurationKeypadLockoutCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readKeypadLockoutAttribute",
        readThermostatUserInterfaceConfigurationKeypadLockoutAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                      .readScheduleProgrammingVisibilityAttribute(
                          (ChipClusters.IntegerAttributeCallback) callback);
                },
                () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
                readThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readScheduleProgrammingVisibilityAttribute",
        readThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThermostatUserInterfaceConfigurationGeneratedCommandListAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                      .readGeneratedCommandListAttribute(
                          (ChipClusters.ThermostatUserInterfaceConfigurationCluster
                                  .GeneratedCommandListAttributeCallback)
                              callback);
                },
                () ->
                    new ClusterInfoMapping
                        .DelegatedThermostatUserInterfaceConfigurationClusterGeneratedCommandListAttributeCallback(),
                readThermostatUserInterfaceConfigurationGeneratedCommandListCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readThermostatUserInterfaceConfigurationGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationAcceptedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThermostatUserInterfaceConfigurationAcceptedCommandListAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                      .readAcceptedCommandListAttribute(
                          (ChipClusters.ThermostatUserInterfaceConfigurationCluster
                                  .AcceptedCommandListAttributeCallback)
                              callback);
                },
                () ->
                    new ClusterInfoMapping
                        .DelegatedThermostatUserInterfaceConfigurationClusterAcceptedCommandListAttributeCallback(),
                readThermostatUserInterfaceConfigurationAcceptedCommandListCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readThermostatUserInterfaceConfigurationAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationAttributeListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatUserInterfaceConfigurationAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ThermostatUserInterfaceConfigurationCluster
                              .AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedThermostatUserInterfaceConfigurationClusterAttributeListAttributeCallback(),
            readThermostatUserInterfaceConfigurationAttributeListCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readAttributeListAttribute",
        readThermostatUserInterfaceConfigurationAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationFeatureMapCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readThermostatUserInterfaceConfigurationFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readThermostatUserInterfaceConfigurationFeatureMapCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readFeatureMapAttribute",
        readThermostatUserInterfaceConfigurationFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readThermostatUserInterfaceConfigurationClusterRevisionCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo
        readThermostatUserInterfaceConfigurationClusterRevisionAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                      .readClusterRevisionAttribute(
                          (ChipClusters.IntegerAttributeCallback) callback);
                },
                () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
                readThermostatUserInterfaceConfigurationClusterRevisionCommandParams);
    readThermostatUserInterfaceConfigurationInteractionInfo.put(
        "readClusterRevisionAttribute",
        readThermostatUserInterfaceConfigurationClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put(
        "thermostatUserInterfaceConfiguration",
        readThermostatUserInterfaceConfigurationInteractionInfo);
    Map<String, InteractionInfo> readColorControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readColorControlCurrentHueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlCurrentHueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readCurrentHueAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlCurrentHueCommandParams);
    readColorControlInteractionInfo.put(
        "readCurrentHueAttribute", readColorControlCurrentHueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlCurrentSaturationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlCurrentSaturationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readCurrentSaturationAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlCurrentSaturationCommandParams);
    readColorControlInteractionInfo.put(
        "readCurrentSaturationAttribute",
        readColorControlCurrentSaturationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlRemainingTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlRemainingTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readRemainingTimeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlRemainingTimeCommandParams);
    readColorControlInteractionInfo.put(
        "readRemainingTimeAttribute", readColorControlRemainingTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlCurrentXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlCurrentXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readCurrentXAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlCurrentXCommandParams);
    readColorControlInteractionInfo.put(
        "readCurrentXAttribute", readColorControlCurrentXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlCurrentYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlCurrentYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readCurrentYAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlCurrentYCommandParams);
    readColorControlInteractionInfo.put(
        "readCurrentYAttribute", readColorControlCurrentYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlDriftCompensationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlDriftCompensationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readDriftCompensationAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlDriftCompensationCommandParams);
    readColorControlInteractionInfo.put(
        "readDriftCompensationAttribute",
        readColorControlDriftCompensationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlCompensationTextCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlCompensationTextAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readCompensationTextAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readColorControlCompensationTextCommandParams);
    readColorControlInteractionInfo.put(
        "readCompensationTextAttribute", readColorControlCompensationTextAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorTemperatureCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorTemperatureAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorTemperatureAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorTemperatureCommandParams);
    readColorControlInteractionInfo.put(
        "readColorTemperatureAttribute", readColorControlColorTemperatureAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorModeCommandParams);
    readColorControlInteractionInfo.put(
        "readColorModeAttribute", readColorControlColorModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlOptionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlOptionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readOptionsAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlOptionsCommandParams);
    readColorControlInteractionInfo.put(
        "readOptionsAttribute", readColorControlOptionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlNumberOfPrimariesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlNumberOfPrimariesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readNumberOfPrimariesAttribute(
                      (ChipClusters.ColorControlCluster.NumberOfPrimariesAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlNumberOfPrimariesCommandParams);
    readColorControlInteractionInfo.put(
        "readNumberOfPrimariesAttribute",
        readColorControlNumberOfPrimariesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary1XCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary1XAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary1XAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary1XCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary1XAttribute", readColorControlPrimary1XAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary1YCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary1YAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary1YAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary1YCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary1YAttribute", readColorControlPrimary1YAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary1IntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary1IntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary1IntensityAttribute(
                      (ChipClusters.ColorControlCluster.Primary1IntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary1IntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary1IntensityAttribute",
        readColorControlPrimary1IntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary2XCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary2XAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary2XAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary2XCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary2XAttribute", readColorControlPrimary2XAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary2YCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary2YAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary2YAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary2YCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary2YAttribute", readColorControlPrimary2YAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary2IntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary2IntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary2IntensityAttribute(
                      (ChipClusters.ColorControlCluster.Primary2IntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary2IntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary2IntensityAttribute",
        readColorControlPrimary2IntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary3XCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary3XAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary3XAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary3XCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary3XAttribute", readColorControlPrimary3XAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary3YCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary3YAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary3YAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary3YCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary3YAttribute", readColorControlPrimary3YAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary3IntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary3IntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary3IntensityAttribute(
                      (ChipClusters.ColorControlCluster.Primary3IntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary3IntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary3IntensityAttribute",
        readColorControlPrimary3IntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary4XCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary4XAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary4XAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary4XCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary4XAttribute", readColorControlPrimary4XAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary4YCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary4YAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary4YAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary4YCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary4YAttribute", readColorControlPrimary4YAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary4IntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary4IntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary4IntensityAttribute(
                      (ChipClusters.ColorControlCluster.Primary4IntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary4IntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary4IntensityAttribute",
        readColorControlPrimary4IntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary5XCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary5XAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary5XAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary5XCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary5XAttribute", readColorControlPrimary5XAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary5YCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary5YAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary5YAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary5YCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary5YAttribute", readColorControlPrimary5YAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary5IntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary5IntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary5IntensityAttribute(
                      (ChipClusters.ColorControlCluster.Primary5IntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary5IntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary5IntensityAttribute",
        readColorControlPrimary5IntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary6XCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary6XAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary6XAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary6XCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary6XAttribute", readColorControlPrimary6XAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary6YCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary6YAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary6YAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary6YCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary6YAttribute", readColorControlPrimary6YAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlPrimary6IntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlPrimary6IntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readPrimary6IntensityAttribute(
                      (ChipClusters.ColorControlCluster.Primary6IntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlPrimary6IntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readPrimary6IntensityAttribute",
        readColorControlPrimary6IntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlWhitePointXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlWhitePointXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readWhitePointXAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlWhitePointXCommandParams);
    readColorControlInteractionInfo.put(
        "readWhitePointXAttribute", readColorControlWhitePointXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlWhitePointYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlWhitePointYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readWhitePointYAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlWhitePointYCommandParams);
    readColorControlInteractionInfo.put(
        "readWhitePointYAttribute", readColorControlWhitePointYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointRXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointRXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointRXAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointRXCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointRXAttribute", readColorControlColorPointRXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointRYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointRYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointRYAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointRYCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointRYAttribute", readColorControlColorPointRYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointRIntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointRIntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointRIntensityAttribute(
                      (ChipClusters.ColorControlCluster.ColorPointRIntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointRIntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointRIntensityAttribute",
        readColorControlColorPointRIntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointGXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointGXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointGXAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointGXCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointGXAttribute", readColorControlColorPointGXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointGYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointGYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointGYAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointGYCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointGYAttribute", readColorControlColorPointGYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointGIntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointGIntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointGIntensityAttribute(
                      (ChipClusters.ColorControlCluster.ColorPointGIntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointGIntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointGIntensityAttribute",
        readColorControlColorPointGIntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointBXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointBXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointBXAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointBXCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointBXAttribute", readColorControlColorPointBXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointBYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointBYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointBYAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointBYCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointBYAttribute", readColorControlColorPointBYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorPointBIntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorPointBIntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorPointBIntensityAttribute(
                      (ChipClusters.ColorControlCluster.ColorPointBIntensityAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorPointBIntensityCommandParams);
    readColorControlInteractionInfo.put(
        "readColorPointBIntensityAttribute",
        readColorControlColorPointBIntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlEnhancedCurrentHueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlEnhancedCurrentHueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readEnhancedCurrentHueAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlEnhancedCurrentHueCommandParams);
    readColorControlInteractionInfo.put(
        "readEnhancedCurrentHueAttribute",
        readColorControlEnhancedCurrentHueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlEnhancedColorModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlEnhancedColorModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readEnhancedColorModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlEnhancedColorModeCommandParams);
    readColorControlInteractionInfo.put(
        "readEnhancedColorModeAttribute",
        readColorControlEnhancedColorModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorLoopActiveCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorLoopActiveAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorLoopActiveAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorLoopActiveCommandParams);
    readColorControlInteractionInfo.put(
        "readColorLoopActiveAttribute", readColorControlColorLoopActiveAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorLoopDirectionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorLoopDirectionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorLoopDirectionAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorLoopDirectionCommandParams);
    readColorControlInteractionInfo.put(
        "readColorLoopDirectionAttribute",
        readColorControlColorLoopDirectionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorLoopTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorLoopTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorLoopTimeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorLoopTimeCommandParams);
    readColorControlInteractionInfo.put(
        "readColorLoopTimeAttribute", readColorControlColorLoopTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorLoopStartEnhancedHueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorLoopStartEnhancedHueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorLoopStartEnhancedHueAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorLoopStartEnhancedHueCommandParams);
    readColorControlInteractionInfo.put(
        "readColorLoopStartEnhancedHueAttribute",
        readColorControlColorLoopStartEnhancedHueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorLoopStoredEnhancedHueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorLoopStoredEnhancedHueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorLoopStoredEnhancedHueAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorLoopStoredEnhancedHueCommandParams);
    readColorControlInteractionInfo.put(
        "readColorLoopStoredEnhancedHueAttribute",
        readColorControlColorLoopStoredEnhancedHueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorCapabilitiesCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorCapabilitiesAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorCapabilitiesAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorCapabilitiesCommandParams);
    readColorControlInteractionInfo.put(
        "readColorCapabilitiesAttribute",
        readColorControlColorCapabilitiesAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorTempPhysicalMinMiredsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorTempPhysicalMinMiredsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorTempPhysicalMinMiredsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorTempPhysicalMinMiredsCommandParams);
    readColorControlInteractionInfo.put(
        "readColorTempPhysicalMinMiredsAttribute",
        readColorControlColorTempPhysicalMinMiredsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlColorTempPhysicalMaxMiredsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlColorTempPhysicalMaxMiredsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readColorTempPhysicalMaxMiredsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlColorTempPhysicalMaxMiredsCommandParams);
    readColorControlInteractionInfo.put(
        "readColorTempPhysicalMaxMiredsAttribute",
        readColorControlColorTempPhysicalMaxMiredsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlCoupleColorTempToLevelMinMiredsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlCoupleColorTempToLevelMinMiredsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readCoupleColorTempToLevelMinMiredsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlCoupleColorTempToLevelMinMiredsCommandParams);
    readColorControlInteractionInfo.put(
        "readCoupleColorTempToLevelMinMiredsAttribute",
        readColorControlCoupleColorTempToLevelMinMiredsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlStartUpColorTemperatureMiredsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlStartUpColorTemperatureMiredsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readStartUpColorTemperatureMiredsAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlStartUpColorTemperatureMiredsCommandParams);
    readColorControlInteractionInfo.put(
        "readStartUpColorTemperatureMiredsAttribute",
        readColorControlStartUpColorTemperatureMiredsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ColorControlCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedColorControlClusterGeneratedCommandListAttributeCallback(),
            readColorControlGeneratedCommandListCommandParams);
    readColorControlInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readColorControlGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ColorControlCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedColorControlClusterAcceptedCommandListAttributeCallback(),
            readColorControlAcceptedCommandListCommandParams);
    readColorControlInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readColorControlAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ColorControlCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedColorControlClusterAttributeListAttributeCallback(),
            readColorControlAttributeListCommandParams);
    readColorControlInteractionInfo.put(
        "readAttributeListAttribute", readColorControlAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readColorControlFeatureMapCommandParams);
    readColorControlInteractionInfo.put(
        "readFeatureMapAttribute", readColorControlFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readColorControlClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readColorControlClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readColorControlClusterRevisionCommandParams);
    readColorControlInteractionInfo.put(
        "readClusterRevisionAttribute", readColorControlClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("colorControl", readColorControlInteractionInfo);
    Map<String, InteractionInfo> readBallastConfigurationInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readBallastConfigurationPhysicalMinLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationPhysicalMinLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readPhysicalMinLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationPhysicalMinLevelCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readPhysicalMinLevelAttribute",
        readBallastConfigurationPhysicalMinLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationPhysicalMaxLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationPhysicalMaxLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readPhysicalMaxLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationPhysicalMaxLevelCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readPhysicalMaxLevelAttribute",
        readBallastConfigurationPhysicalMaxLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationBallastStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationBallastStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readBallastStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationBallastStatusCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readBallastStatusAttribute",
        readBallastConfigurationBallastStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationMinLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationMinLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readMinLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationMinLevelCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readMinLevelAttribute", readBallastConfigurationMinLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationMaxLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationMaxLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readMaxLevelAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationMaxLevelCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readMaxLevelAttribute", readBallastConfigurationMaxLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationIntrinsicBalanceFactorCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationIntrinsicBalanceFactorAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readIntrinsicBalanceFactorAttribute(
                      (ChipClusters.BallastConfigurationCluster
                              .IntrinsicBalanceFactorAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationIntrinsicBalanceFactorCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readIntrinsicBalanceFactorAttribute",
        readBallastConfigurationIntrinsicBalanceFactorAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationBallastFactorAdjustmentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationBallastFactorAdjustmentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readBallastFactorAdjustmentAttribute(
                      (ChipClusters.BallastConfigurationCluster
                              .BallastFactorAdjustmentAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationBallastFactorAdjustmentCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readBallastFactorAdjustmentAttribute",
        readBallastConfigurationBallastFactorAdjustmentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationLampQuantityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationLampQuantityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readLampQuantityAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationLampQuantityCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readLampQuantityAttribute", readBallastConfigurationLampQuantityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationLampTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationLampTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readLampTypeAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBallastConfigurationLampTypeCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readLampTypeAttribute", readBallastConfigurationLampTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationLampManufacturerCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationLampManufacturerAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readLampManufacturerAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readBallastConfigurationLampManufacturerCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readLampManufacturerAttribute",
        readBallastConfigurationLampManufacturerAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationLampRatedHoursCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationLampRatedHoursAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readLampRatedHoursAttribute(
                      (ChipClusters.BallastConfigurationCluster.LampRatedHoursAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBallastConfigurationLampRatedHoursCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readLampRatedHoursAttribute",
        readBallastConfigurationLampRatedHoursAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationLampBurnHoursCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationLampBurnHoursAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readLampBurnHoursAttribute(
                      (ChipClusters.BallastConfigurationCluster.LampBurnHoursAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBallastConfigurationLampBurnHoursCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readLampBurnHoursAttribute",
        readBallastConfigurationLampBurnHoursAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationLampAlarmModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationLampAlarmModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readLampAlarmModeAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationLampAlarmModeCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readLampAlarmModeAttribute",
        readBallastConfigurationLampAlarmModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationLampBurnHoursTripPointCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationLampBurnHoursTripPointAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readLampBurnHoursTripPointAttribute(
                      (ChipClusters.BallastConfigurationCluster
                              .LampBurnHoursTripPointAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBallastConfigurationLampBurnHoursTripPointCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readLampBurnHoursTripPointAttribute",
        readBallastConfigurationLampBurnHoursTripPointAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.BallastConfigurationCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBallastConfigurationClusterGeneratedCommandListAttributeCallback(),
            readBallastConfigurationGeneratedCommandListCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readBallastConfigurationGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.BallastConfigurationCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBallastConfigurationClusterAcceptedCommandListAttributeCallback(),
            readBallastConfigurationAcceptedCommandListCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readBallastConfigurationAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.BallastConfigurationCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedBallastConfigurationClusterAttributeListAttributeCallback(),
            readBallastConfigurationAttributeListCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readAttributeListAttribute",
        readBallastConfigurationAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readBallastConfigurationFeatureMapCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readFeatureMapAttribute", readBallastConfigurationFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readBallastConfigurationClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readBallastConfigurationClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readBallastConfigurationClusterRevisionCommandParams);
    readBallastConfigurationInteractionInfo.put(
        "readClusterRevisionAttribute",
        readBallastConfigurationClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("ballastConfiguration", readBallastConfigurationInteractionInfo);
    Map<String, InteractionInfo> readIlluminanceMeasurementInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readIlluminanceMeasurementMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readMeasuredValueAttribute(
                      (ChipClusters.IlluminanceMeasurementCluster.MeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIlluminanceMeasurementMeasuredValueCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readMeasuredValueAttribute",
        readIlluminanceMeasurementMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementMinMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementMinMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readMinMeasuredValueAttribute(
                      (ChipClusters.IlluminanceMeasurementCluster.MinMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIlluminanceMeasurementMinMeasuredValueCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readMinMeasuredValueAttribute",
        readIlluminanceMeasurementMinMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementMaxMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementMaxMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readMaxMeasuredValueAttribute(
                      (ChipClusters.IlluminanceMeasurementCluster.MaxMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIlluminanceMeasurementMaxMeasuredValueCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readMaxMeasuredValueAttribute",
        readIlluminanceMeasurementMaxMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementToleranceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementToleranceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readToleranceAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIlluminanceMeasurementToleranceCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readToleranceAttribute", readIlluminanceMeasurementToleranceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementLightSensorTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementLightSensorTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readLightSensorTypeAttribute(
                      (ChipClusters.IlluminanceMeasurementCluster.LightSensorTypeAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIlluminanceMeasurementLightSensorTypeCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readLightSensorTypeAttribute",
        readIlluminanceMeasurementLightSensorTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.IlluminanceMeasurementCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedIlluminanceMeasurementClusterGeneratedCommandListAttributeCallback(),
            readIlluminanceMeasurementGeneratedCommandListCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readIlluminanceMeasurementGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.IlluminanceMeasurementCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedIlluminanceMeasurementClusterAcceptedCommandListAttributeCallback(),
            readIlluminanceMeasurementAcceptedCommandListCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readIlluminanceMeasurementAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.IlluminanceMeasurementCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedIlluminanceMeasurementClusterAttributeListAttributeCallback(),
            readIlluminanceMeasurementAttributeListCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readAttributeListAttribute",
        readIlluminanceMeasurementAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readIlluminanceMeasurementFeatureMapCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readFeatureMapAttribute", readIlluminanceMeasurementFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readIlluminanceMeasurementClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readIlluminanceMeasurementClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IlluminanceMeasurementCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readIlluminanceMeasurementClusterRevisionCommandParams);
    readIlluminanceMeasurementInteractionInfo.put(
        "readClusterRevisionAttribute",
        readIlluminanceMeasurementClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("illuminanceMeasurement", readIlluminanceMeasurementInteractionInfo);
    Map<String, InteractionInfo> readTemperatureMeasurementInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readTemperatureMeasurementMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTemperatureMeasurementMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TemperatureMeasurementCluster) cluster)
                  .readMeasuredValueAttribute(
                      (ChipClusters.TemperatureMeasurementCluster.MeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTemperatureMeasurementMeasuredValueCommandParams);
    readTemperatureMeasurementInteractionInfo.put(
        "readMeasuredValueAttribute",
        readTemperatureMeasurementMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTemperatureMeasurementMinMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTemperatureMeasurementMinMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TemperatureMeasurementCluster) cluster)
                  .readMinMeasuredValueAttribute(
                      (ChipClusters.TemperatureMeasurementCluster.MinMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTemperatureMeasurementMinMeasuredValueCommandParams);
    readTemperatureMeasurementInteractionInfo.put(
        "readMinMeasuredValueAttribute",
        readTemperatureMeasurementMinMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTemperatureMeasurementMaxMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTemperatureMeasurementMaxMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TemperatureMeasurementCluster) cluster)
                  .readMaxMeasuredValueAttribute(
                      (ChipClusters.TemperatureMeasurementCluster.MaxMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTemperatureMeasurementMaxMeasuredValueCommandParams);
    readTemperatureMeasurementInteractionInfo.put(
        "readMaxMeasuredValueAttribute",
        readTemperatureMeasurementMaxMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTemperatureMeasurementToleranceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTemperatureMeasurementToleranceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TemperatureMeasurementCluster) cluster)
                  .readToleranceAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTemperatureMeasurementToleranceCommandParams);
    readTemperatureMeasurementInteractionInfo.put(
        "readToleranceAttribute", readTemperatureMeasurementToleranceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTemperatureMeasurementAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTemperatureMeasurementAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TemperatureMeasurementCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.TemperatureMeasurementCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTemperatureMeasurementClusterAttributeListAttributeCallback(),
            readTemperatureMeasurementAttributeListCommandParams);
    readTemperatureMeasurementInteractionInfo.put(
        "readAttributeListAttribute",
        readTemperatureMeasurementAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTemperatureMeasurementFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTemperatureMeasurementFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TemperatureMeasurementCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTemperatureMeasurementFeatureMapCommandParams);
    readTemperatureMeasurementInteractionInfo.put(
        "readFeatureMapAttribute", readTemperatureMeasurementFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTemperatureMeasurementClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTemperatureMeasurementClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TemperatureMeasurementCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTemperatureMeasurementClusterRevisionCommandParams);
    readTemperatureMeasurementInteractionInfo.put(
        "readClusterRevisionAttribute",
        readTemperatureMeasurementClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("temperatureMeasurement", readTemperatureMeasurementInteractionInfo);
    Map<String, InteractionInfo> readPressureMeasurementInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readPressureMeasurementMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readMeasuredValueAttribute(
                      (ChipClusters.PressureMeasurementCluster.MeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementMeasuredValueCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readMeasuredValueAttribute", readPressureMeasurementMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementMinMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementMinMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readMinMeasuredValueAttribute(
                      (ChipClusters.PressureMeasurementCluster.MinMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementMinMeasuredValueCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readMinMeasuredValueAttribute",
        readPressureMeasurementMinMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementMaxMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementMaxMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readMaxMeasuredValueAttribute(
                      (ChipClusters.PressureMeasurementCluster.MaxMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementMaxMeasuredValueCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readMaxMeasuredValueAttribute",
        readPressureMeasurementMaxMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementToleranceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementToleranceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readToleranceAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementToleranceCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readToleranceAttribute", readPressureMeasurementToleranceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementScaledValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementScaledValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readScaledValueAttribute(
                      (ChipClusters.PressureMeasurementCluster.ScaledValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementScaledValueCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readScaledValueAttribute", readPressureMeasurementScaledValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementMinScaledValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementMinScaledValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readMinScaledValueAttribute(
                      (ChipClusters.PressureMeasurementCluster.MinScaledValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementMinScaledValueCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readMinScaledValueAttribute",
        readPressureMeasurementMinScaledValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementMaxScaledValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementMaxScaledValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readMaxScaledValueAttribute(
                      (ChipClusters.PressureMeasurementCluster.MaxScaledValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementMaxScaledValueCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readMaxScaledValueAttribute",
        readPressureMeasurementMaxScaledValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementScaledToleranceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementScaledToleranceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readScaledToleranceAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementScaledToleranceCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readScaledToleranceAttribute",
        readPressureMeasurementScaledToleranceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementScaleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementScaleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readScaleAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementScaleCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readScaleAttribute", readPressureMeasurementScaleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.PressureMeasurementCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedPressureMeasurementClusterAttributeListAttributeCallback(),
            readPressureMeasurementAttributeListCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readAttributeListAttribute", readPressureMeasurementAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readPressureMeasurementFeatureMapCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readFeatureMapAttribute", readPressureMeasurementFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readPressureMeasurementClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readPressureMeasurementClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PressureMeasurementCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readPressureMeasurementClusterRevisionCommandParams);
    readPressureMeasurementInteractionInfo.put(
        "readClusterRevisionAttribute",
        readPressureMeasurementClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("pressureMeasurement", readPressureMeasurementInteractionInfo);
    Map<String, InteractionInfo> readFlowMeasurementInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readFlowMeasurementMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readMeasuredValueAttribute(
                      (ChipClusters.FlowMeasurementCluster.MeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFlowMeasurementMeasuredValueCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readMeasuredValueAttribute", readFlowMeasurementMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementMinMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementMinMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readMinMeasuredValueAttribute(
                      (ChipClusters.FlowMeasurementCluster.MinMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFlowMeasurementMinMeasuredValueCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readMinMeasuredValueAttribute",
        readFlowMeasurementMinMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementMaxMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementMaxMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readMaxMeasuredValueAttribute(
                      (ChipClusters.FlowMeasurementCluster.MaxMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFlowMeasurementMaxMeasuredValueCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readMaxMeasuredValueAttribute",
        readFlowMeasurementMaxMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementToleranceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementToleranceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readToleranceAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFlowMeasurementToleranceCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readToleranceAttribute", readFlowMeasurementToleranceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.FlowMeasurementCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedFlowMeasurementClusterGeneratedCommandListAttributeCallback(),
            readFlowMeasurementGeneratedCommandListCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readFlowMeasurementGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.FlowMeasurementCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedFlowMeasurementClusterAcceptedCommandListAttributeCallback(),
            readFlowMeasurementAcceptedCommandListCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readFlowMeasurementAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.FlowMeasurementCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedFlowMeasurementClusterAttributeListAttributeCallback(),
            readFlowMeasurementAttributeListCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readAttributeListAttribute", readFlowMeasurementAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readFlowMeasurementFeatureMapCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readFeatureMapAttribute", readFlowMeasurementFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readFlowMeasurementClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readFlowMeasurementClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FlowMeasurementCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readFlowMeasurementClusterRevisionCommandParams);
    readFlowMeasurementInteractionInfo.put(
        "readClusterRevisionAttribute", readFlowMeasurementClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("flowMeasurement", readFlowMeasurementInteractionInfo);
    Map<String, InteractionInfo> readRelativeHumidityMeasurementInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readRelativeHumidityMeasurementMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readMeasuredValueAttribute(
                      (ChipClusters.RelativeHumidityMeasurementCluster
                              .MeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readRelativeHumidityMeasurementMeasuredValueCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readMeasuredValueAttribute",
        readRelativeHumidityMeasurementMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readRelativeHumidityMeasurementMinMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementMinMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readMinMeasuredValueAttribute(
                      (ChipClusters.RelativeHumidityMeasurementCluster
                              .MinMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readRelativeHumidityMeasurementMinMeasuredValueCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readMinMeasuredValueAttribute",
        readRelativeHumidityMeasurementMinMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readRelativeHumidityMeasurementMaxMeasuredValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementMaxMeasuredValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readMaxMeasuredValueAttribute(
                      (ChipClusters.RelativeHumidityMeasurementCluster
                              .MaxMeasuredValueAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readRelativeHumidityMeasurementMaxMeasuredValueCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readMaxMeasuredValueAttribute",
        readRelativeHumidityMeasurementMaxMeasuredValueAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readRelativeHumidityMeasurementToleranceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementToleranceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readToleranceAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readRelativeHumidityMeasurementToleranceCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readToleranceAttribute", readRelativeHumidityMeasurementToleranceAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readRelativeHumidityMeasurementGeneratedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.RelativeHumidityMeasurementCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedRelativeHumidityMeasurementClusterGeneratedCommandListAttributeCallback(),
            readRelativeHumidityMeasurementGeneratedCommandListCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readRelativeHumidityMeasurementGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        readRelativeHumidityMeasurementAcceptedCommandListCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.RelativeHumidityMeasurementCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedRelativeHumidityMeasurementClusterAcceptedCommandListAttributeCallback(),
            readRelativeHumidityMeasurementAcceptedCommandListCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readRelativeHumidityMeasurementAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readRelativeHumidityMeasurementAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.RelativeHumidityMeasurementCluster
                              .AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedRelativeHumidityMeasurementClusterAttributeListAttributeCallback(),
            readRelativeHumidityMeasurementAttributeListCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readAttributeListAttribute",
        readRelativeHumidityMeasurementAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readRelativeHumidityMeasurementFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readRelativeHumidityMeasurementFeatureMapCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readFeatureMapAttribute",
        readRelativeHumidityMeasurementFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readRelativeHumidityMeasurementClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readRelativeHumidityMeasurementClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.RelativeHumidityMeasurementCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readRelativeHumidityMeasurementClusterRevisionCommandParams);
    readRelativeHumidityMeasurementInteractionInfo.put(
        "readClusterRevisionAttribute",
        readRelativeHumidityMeasurementClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put(
        "relativeHumidityMeasurement", readRelativeHumidityMeasurementInteractionInfo);
    Map<String, InteractionInfo> readOccupancySensingInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readOccupancySensingOccupancyCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingOccupancyAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readOccupancyAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOccupancySensingOccupancyCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readOccupancyAttribute", readOccupancySensingOccupancyAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOccupancySensingOccupancySensorTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingOccupancySensorTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readOccupancySensorTypeAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOccupancySensingOccupancySensorTypeCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readOccupancySensorTypeAttribute",
        readOccupancySensingOccupancySensorTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOccupancySensingOccupancySensorTypeBitmapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingOccupancySensorTypeBitmapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readOccupancySensorTypeBitmapAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOccupancySensingOccupancySensorTypeBitmapCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readOccupancySensorTypeBitmapAttribute",
        readOccupancySensingOccupancySensorTypeBitmapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOccupancySensingGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.OccupancySensingCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOccupancySensingClusterGeneratedCommandListAttributeCallback(),
            readOccupancySensingGeneratedCommandListCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readOccupancySensingGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOccupancySensingAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.OccupancySensingCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOccupancySensingClusterAcceptedCommandListAttributeCallback(),
            readOccupancySensingAcceptedCommandListCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readOccupancySensingAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOccupancySensingAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.OccupancySensingCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedOccupancySensingClusterAttributeListAttributeCallback(),
            readOccupancySensingAttributeListCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readAttributeListAttribute", readOccupancySensingAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOccupancySensingFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readOccupancySensingFeatureMapCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readFeatureMapAttribute", readOccupancySensingFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readOccupancySensingClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readOccupancySensingClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OccupancySensingCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readOccupancySensingClusterRevisionCommandParams);
    readOccupancySensingInteractionInfo.put(
        "readClusterRevisionAttribute",
        readOccupancySensingClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("occupancySensing", readOccupancySensingInteractionInfo);
    Map<String, InteractionInfo> readWakeOnLanInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readWakeOnLanMACAddressCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWakeOnLanMACAddressAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WakeOnLanCluster) cluster)
                  .readMACAddressAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readWakeOnLanMACAddressCommandParams);
    readWakeOnLanInteractionInfo.put(
        "readMACAddressAttribute", readWakeOnLanMACAddressAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWakeOnLanGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWakeOnLanGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WakeOnLanCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.WakeOnLanCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWakeOnLanClusterGeneratedCommandListAttributeCallback(),
            readWakeOnLanGeneratedCommandListCommandParams);
    readWakeOnLanInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readWakeOnLanGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWakeOnLanAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWakeOnLanAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WakeOnLanCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.WakeOnLanCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedWakeOnLanClusterAcceptedCommandListAttributeCallback(),
            readWakeOnLanAcceptedCommandListCommandParams);
    readWakeOnLanInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readWakeOnLanAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWakeOnLanAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWakeOnLanAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WakeOnLanCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.WakeOnLanCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedWakeOnLanClusterAttributeListAttributeCallback(),
            readWakeOnLanAttributeListCommandParams);
    readWakeOnLanInteractionInfo.put(
        "readAttributeListAttribute", readWakeOnLanAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWakeOnLanFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWakeOnLanFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WakeOnLanCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readWakeOnLanFeatureMapCommandParams);
    readWakeOnLanInteractionInfo.put(
        "readFeatureMapAttribute", readWakeOnLanFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readWakeOnLanClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readWakeOnLanClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WakeOnLanCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readWakeOnLanClusterRevisionCommandParams);
    readWakeOnLanInteractionInfo.put(
        "readClusterRevisionAttribute", readWakeOnLanClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("wakeOnLan", readWakeOnLanInteractionInfo);
    Map<String, InteractionInfo> readChannelInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readChannelChannelListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readChannelChannelListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ChannelCluster) cluster)
                  .readChannelListAttribute(
                      (ChipClusters.ChannelCluster.ChannelListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedChannelClusterChannelListAttributeCallback(),
            readChannelChannelListCommandParams);
    readChannelInteractionInfo.put(
        "readChannelListAttribute", readChannelChannelListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readChannelGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readChannelGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ChannelCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ChannelCluster.GeneratedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedChannelClusterGeneratedCommandListAttributeCallback(),
            readChannelGeneratedCommandListCommandParams);
    readChannelInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readChannelGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readChannelAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readChannelAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ChannelCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ChannelCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedChannelClusterAcceptedCommandListAttributeCallback(),
            readChannelAcceptedCommandListCommandParams);
    readChannelInteractionInfo.put(
        "readAcceptedCommandListAttribute", readChannelAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readChannelAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readChannelAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ChannelCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ChannelCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedChannelClusterAttributeListAttributeCallback(),
            readChannelAttributeListCommandParams);
    readChannelInteractionInfo.put(
        "readAttributeListAttribute", readChannelAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readChannelFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readChannelFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ChannelCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readChannelFeatureMapCommandParams);
    readChannelInteractionInfo.put(
        "readFeatureMapAttribute", readChannelFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readChannelClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readChannelClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ChannelCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readChannelClusterRevisionCommandParams);
    readChannelInteractionInfo.put(
        "readClusterRevisionAttribute", readChannelClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("channel", readChannelInteractionInfo);
    Map<String, InteractionInfo> readTargetNavigatorInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readTargetNavigatorTargetListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTargetNavigatorTargetListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TargetNavigatorCluster) cluster)
                  .readTargetListAttribute(
                      (ChipClusters.TargetNavigatorCluster.TargetListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedTargetNavigatorClusterTargetListAttributeCallback(),
            readTargetNavigatorTargetListCommandParams);
    readTargetNavigatorInteractionInfo.put(
        "readTargetListAttribute", readTargetNavigatorTargetListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTargetNavigatorCurrentTargetCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTargetNavigatorCurrentTargetAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TargetNavigatorCluster) cluster)
                  .readCurrentTargetAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTargetNavigatorCurrentTargetCommandParams);
    readTargetNavigatorInteractionInfo.put(
        "readCurrentTargetAttribute", readTargetNavigatorCurrentTargetAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTargetNavigatorGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTargetNavigatorGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TargetNavigatorCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.TargetNavigatorCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTargetNavigatorClusterGeneratedCommandListAttributeCallback(),
            readTargetNavigatorGeneratedCommandListCommandParams);
    readTargetNavigatorInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readTargetNavigatorGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTargetNavigatorAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTargetNavigatorAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TargetNavigatorCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.TargetNavigatorCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTargetNavigatorClusterAcceptedCommandListAttributeCallback(),
            readTargetNavigatorAcceptedCommandListCommandParams);
    readTargetNavigatorInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readTargetNavigatorAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTargetNavigatorAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTargetNavigatorAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TargetNavigatorCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.TargetNavigatorCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTargetNavigatorClusterAttributeListAttributeCallback(),
            readTargetNavigatorAttributeListCommandParams);
    readTargetNavigatorInteractionInfo.put(
        "readAttributeListAttribute", readTargetNavigatorAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTargetNavigatorFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTargetNavigatorFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TargetNavigatorCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTargetNavigatorFeatureMapCommandParams);
    readTargetNavigatorInteractionInfo.put(
        "readFeatureMapAttribute", readTargetNavigatorFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTargetNavigatorClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTargetNavigatorClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TargetNavigatorCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTargetNavigatorClusterRevisionCommandParams);
    readTargetNavigatorInteractionInfo.put(
        "readClusterRevisionAttribute", readTargetNavigatorClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("targetNavigator", readTargetNavigatorInteractionInfo);
    Map<String, InteractionInfo> readMediaPlaybackInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readMediaPlaybackCurrentStateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackCurrentStateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readCurrentStateAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readMediaPlaybackCurrentStateCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readCurrentStateAttribute", readMediaPlaybackCurrentStateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackStartTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackStartTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readStartTimeAttribute(
                      (ChipClusters.MediaPlaybackCluster.StartTimeAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readMediaPlaybackStartTimeCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readStartTimeAttribute", readMediaPlaybackStartTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackDurationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackDurationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readDurationAttribute(
                      (ChipClusters.MediaPlaybackCluster.DurationAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readMediaPlaybackDurationCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readDurationAttribute", readMediaPlaybackDurationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackPlaybackSpeedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackPlaybackSpeedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readPlaybackSpeedAttribute((ChipClusters.FloatAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedFloatAttributeCallback(),
            readMediaPlaybackPlaybackSpeedCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readPlaybackSpeedAttribute", readMediaPlaybackPlaybackSpeedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackSeekRangeEndCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackSeekRangeEndAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readSeekRangeEndAttribute(
                      (ChipClusters.MediaPlaybackCluster.SeekRangeEndAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readMediaPlaybackSeekRangeEndCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readSeekRangeEndAttribute", readMediaPlaybackSeekRangeEndAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackSeekRangeStartCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackSeekRangeStartAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readSeekRangeStartAttribute(
                      (ChipClusters.MediaPlaybackCluster.SeekRangeStartAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readMediaPlaybackSeekRangeStartCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readSeekRangeStartAttribute", readMediaPlaybackSeekRangeStartAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.MediaPlaybackCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedMediaPlaybackClusterGeneratedCommandListAttributeCallback(),
            readMediaPlaybackGeneratedCommandListCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readMediaPlaybackGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.MediaPlaybackCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedMediaPlaybackClusterAcceptedCommandListAttributeCallback(),
            readMediaPlaybackAcceptedCommandListCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readMediaPlaybackAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.MediaPlaybackCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedMediaPlaybackClusterAttributeListAttributeCallback(),
            readMediaPlaybackAttributeListCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readAttributeListAttribute", readMediaPlaybackAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readMediaPlaybackFeatureMapCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readFeatureMapAttribute", readMediaPlaybackFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaPlaybackClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaPlaybackClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaPlaybackCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readMediaPlaybackClusterRevisionCommandParams);
    readMediaPlaybackInteractionInfo.put(
        "readClusterRevisionAttribute", readMediaPlaybackClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("mediaPlayback", readMediaPlaybackInteractionInfo);
    Map<String, InteractionInfo> readMediaInputInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readMediaInputInputListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaInputInputListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaInputCluster) cluster)
                  .readInputListAttribute(
                      (ChipClusters.MediaInputCluster.InputListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedMediaInputClusterInputListAttributeCallback(),
            readMediaInputInputListCommandParams);
    readMediaInputInteractionInfo.put(
        "readInputListAttribute", readMediaInputInputListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaInputCurrentInputCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaInputCurrentInputAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaInputCluster) cluster)
                  .readCurrentInputAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readMediaInputCurrentInputCommandParams);
    readMediaInputInteractionInfo.put(
        "readCurrentInputAttribute", readMediaInputCurrentInputAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaInputGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaInputGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaInputCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.MediaInputCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedMediaInputClusterGeneratedCommandListAttributeCallback(),
            readMediaInputGeneratedCommandListCommandParams);
    readMediaInputInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readMediaInputGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaInputAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaInputAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaInputCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.MediaInputCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedMediaInputClusterAcceptedCommandListAttributeCallback(),
            readMediaInputAcceptedCommandListCommandParams);
    readMediaInputInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readMediaInputAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaInputAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaInputAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaInputCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.MediaInputCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedMediaInputClusterAttributeListAttributeCallback(),
            readMediaInputAttributeListCommandParams);
    readMediaInputInteractionInfo.put(
        "readAttributeListAttribute", readMediaInputAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaInputFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaInputFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaInputCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readMediaInputFeatureMapCommandParams);
    readMediaInputInteractionInfo.put(
        "readFeatureMapAttribute", readMediaInputFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readMediaInputClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readMediaInputClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.MediaInputCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readMediaInputClusterRevisionCommandParams);
    readMediaInputInteractionInfo.put(
        "readClusterRevisionAttribute", readMediaInputClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("mediaInput", readMediaInputInteractionInfo);
    Map<String, InteractionInfo> readLowPowerInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readLowPowerGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLowPowerGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LowPowerCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.LowPowerCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedLowPowerClusterGeneratedCommandListAttributeCallback(),
            readLowPowerGeneratedCommandListCommandParams);
    readLowPowerInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readLowPowerGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLowPowerAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLowPowerAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LowPowerCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.LowPowerCluster.AcceptedCommandListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedLowPowerClusterAcceptedCommandListAttributeCallback(),
            readLowPowerAcceptedCommandListCommandParams);
    readLowPowerInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readLowPowerAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLowPowerAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLowPowerAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LowPowerCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.LowPowerCluster.AttributeListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLowPowerClusterAttributeListAttributeCallback(),
            readLowPowerAttributeListCommandParams);
    readLowPowerInteractionInfo.put(
        "readAttributeListAttribute", readLowPowerAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLowPowerFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLowPowerFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LowPowerCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readLowPowerFeatureMapCommandParams);
    readLowPowerInteractionInfo.put(
        "readFeatureMapAttribute", readLowPowerFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readLowPowerClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readLowPowerClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LowPowerCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readLowPowerClusterRevisionCommandParams);
    readLowPowerInteractionInfo.put(
        "readClusterRevisionAttribute", readLowPowerClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("lowPower", readLowPowerInteractionInfo);
    Map<String, InteractionInfo> readKeypadInputInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readKeypadInputGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readKeypadInputGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.KeypadInputCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.KeypadInputCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedKeypadInputClusterGeneratedCommandListAttributeCallback(),
            readKeypadInputGeneratedCommandListCommandParams);
    readKeypadInputInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readKeypadInputGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readKeypadInputAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readKeypadInputAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.KeypadInputCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.KeypadInputCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedKeypadInputClusterAcceptedCommandListAttributeCallback(),
            readKeypadInputAcceptedCommandListCommandParams);
    readKeypadInputInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readKeypadInputAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readKeypadInputAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readKeypadInputAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.KeypadInputCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.KeypadInputCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedKeypadInputClusterAttributeListAttributeCallback(),
            readKeypadInputAttributeListCommandParams);
    readKeypadInputInteractionInfo.put(
        "readAttributeListAttribute", readKeypadInputAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readKeypadInputFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readKeypadInputFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.KeypadInputCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readKeypadInputFeatureMapCommandParams);
    readKeypadInputInteractionInfo.put(
        "readFeatureMapAttribute", readKeypadInputFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readKeypadInputClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readKeypadInputClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.KeypadInputCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readKeypadInputClusterRevisionCommandParams);
    readKeypadInputInteractionInfo.put(
        "readClusterRevisionAttribute", readKeypadInputClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("keypadInput", readKeypadInputInteractionInfo);
    Map<String, InteractionInfo> readContentLauncherInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readContentLauncherAcceptHeaderCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readContentLauncherAcceptHeaderAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .readAcceptHeaderAttribute(
                      (ChipClusters.ContentLauncherCluster.AcceptHeaderAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedContentLauncherClusterAcceptHeaderAttributeCallback(),
            readContentLauncherAcceptHeaderCommandParams);
    readContentLauncherInteractionInfo.put(
        "readAcceptHeaderAttribute", readContentLauncherAcceptHeaderAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readContentLauncherSupportedStreamingProtocolsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readContentLauncherSupportedStreamingProtocolsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .readSupportedStreamingProtocolsAttribute(
                      (ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readContentLauncherSupportedStreamingProtocolsCommandParams);
    readContentLauncherInteractionInfo.put(
        "readSupportedStreamingProtocolsAttribute",
        readContentLauncherSupportedStreamingProtocolsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readContentLauncherGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readContentLauncherGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ContentLauncherCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedContentLauncherClusterGeneratedCommandListAttributeCallback(),
            readContentLauncherGeneratedCommandListCommandParams);
    readContentLauncherInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readContentLauncherGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readContentLauncherAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readContentLauncherAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ContentLauncherCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedContentLauncherClusterAcceptedCommandListAttributeCallback(),
            readContentLauncherAcceptedCommandListCommandParams);
    readContentLauncherInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readContentLauncherAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readContentLauncherAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readContentLauncherAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ContentLauncherCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedContentLauncherClusterAttributeListAttributeCallback(),
            readContentLauncherAttributeListCommandParams);
    readContentLauncherInteractionInfo.put(
        "readAttributeListAttribute", readContentLauncherAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readContentLauncherFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readContentLauncherFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readContentLauncherFeatureMapCommandParams);
    readContentLauncherInteractionInfo.put(
        "readFeatureMapAttribute", readContentLauncherFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readContentLauncherClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readContentLauncherClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readContentLauncherClusterRevisionCommandParams);
    readContentLauncherInteractionInfo.put(
        "readClusterRevisionAttribute", readContentLauncherClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("contentLauncher", readContentLauncherInteractionInfo);
    Map<String, InteractionInfo> readAudioOutputInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readAudioOutputOutputListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAudioOutputOutputListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AudioOutputCluster) cluster)
                  .readOutputListAttribute(
                      (ChipClusters.AudioOutputCluster.OutputListAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedAudioOutputClusterOutputListAttributeCallback(),
            readAudioOutputOutputListCommandParams);
    readAudioOutputInteractionInfo.put(
        "readOutputListAttribute", readAudioOutputOutputListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAudioOutputCurrentOutputCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAudioOutputCurrentOutputAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AudioOutputCluster) cluster)
                  .readCurrentOutputAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAudioOutputCurrentOutputCommandParams);
    readAudioOutputInteractionInfo.put(
        "readCurrentOutputAttribute", readAudioOutputCurrentOutputAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAudioOutputGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAudioOutputGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AudioOutputCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.AudioOutputCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAudioOutputClusterGeneratedCommandListAttributeCallback(),
            readAudioOutputGeneratedCommandListCommandParams);
    readAudioOutputInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readAudioOutputGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAudioOutputAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAudioOutputAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AudioOutputCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.AudioOutputCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAudioOutputClusterAcceptedCommandListAttributeCallback(),
            readAudioOutputAcceptedCommandListCommandParams);
    readAudioOutputInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readAudioOutputAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAudioOutputAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAudioOutputAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AudioOutputCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.AudioOutputCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedAudioOutputClusterAttributeListAttributeCallback(),
            readAudioOutputAttributeListCommandParams);
    readAudioOutputInteractionInfo.put(
        "readAttributeListAttribute", readAudioOutputAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAudioOutputFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAudioOutputFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AudioOutputCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readAudioOutputFeatureMapCommandParams);
    readAudioOutputInteractionInfo.put(
        "readFeatureMapAttribute", readAudioOutputFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAudioOutputClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAudioOutputClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AudioOutputCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAudioOutputClusterRevisionCommandParams);
    readAudioOutputInteractionInfo.put(
        "readClusterRevisionAttribute", readAudioOutputClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("audioOutput", readAudioOutputInteractionInfo);
    Map<String, InteractionInfo> readApplicationLauncherInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readApplicationLauncherCatalogListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationLauncherCatalogListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationLauncherCluster) cluster)
                  .readCatalogListAttribute(
                      (ChipClusters.ApplicationLauncherCluster.CatalogListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationLauncherClusterCatalogListAttributeCallback(),
            readApplicationLauncherCatalogListCommandParams);
    readApplicationLauncherInteractionInfo.put(
        "readCatalogListAttribute", readApplicationLauncherCatalogListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationLauncherGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationLauncherGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationLauncherCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ApplicationLauncherCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationLauncherClusterGeneratedCommandListAttributeCallback(),
            readApplicationLauncherGeneratedCommandListCommandParams);
    readApplicationLauncherInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readApplicationLauncherGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationLauncherAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationLauncherAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationLauncherCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ApplicationLauncherCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationLauncherClusterAcceptedCommandListAttributeCallback(),
            readApplicationLauncherAcceptedCommandListCommandParams);
    readApplicationLauncherInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readApplicationLauncherAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationLauncherAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationLauncherAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationLauncherCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ApplicationLauncherCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationLauncherClusterAttributeListAttributeCallback(),
            readApplicationLauncherAttributeListCommandParams);
    readApplicationLauncherInteractionInfo.put(
        "readAttributeListAttribute", readApplicationLauncherAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationLauncherFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationLauncherFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationLauncherCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readApplicationLauncherFeatureMapCommandParams);
    readApplicationLauncherInteractionInfo.put(
        "readFeatureMapAttribute", readApplicationLauncherFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationLauncherClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationLauncherClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationLauncherCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readApplicationLauncherClusterRevisionCommandParams);
    readApplicationLauncherInteractionInfo.put(
        "readClusterRevisionAttribute",
        readApplicationLauncherClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("applicationLauncher", readApplicationLauncherInteractionInfo);
    Map<String, InteractionInfo> readApplicationBasicInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readApplicationBasicVendorNameCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicVendorNameAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readVendorNameAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readApplicationBasicVendorNameCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readVendorNameAttribute", readApplicationBasicVendorNameAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicVendorIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicVendorIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readVendorIDAttribute(
                      (ChipClusters.ApplicationBasicCluster.VendorIDAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readApplicationBasicVendorIDCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readVendorIDAttribute", readApplicationBasicVendorIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicApplicationNameCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicApplicationNameAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readApplicationNameAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readApplicationBasicApplicationNameCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readApplicationNameAttribute",
        readApplicationBasicApplicationNameAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicProductIDCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicProductIDAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readProductIDAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readApplicationBasicProductIDCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readProductIDAttribute", readApplicationBasicProductIDAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicStatusCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicStatusAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readStatusAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readApplicationBasicStatusCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readStatusAttribute", readApplicationBasicStatusAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicApplicationVersionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicApplicationVersionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readApplicationVersionAttribute(
                      (ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readApplicationBasicApplicationVersionCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readApplicationVersionAttribute",
        readApplicationBasicApplicationVersionAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicAllowedVendorListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicAllowedVendorListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readAllowedVendorListAttribute(
                      (ChipClusters.ApplicationBasicCluster.AllowedVendorListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationBasicClusterAllowedVendorListAttributeCallback(),
            readApplicationBasicAllowedVendorListCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readAllowedVendorListAttribute",
        readApplicationBasicAllowedVendorListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ApplicationBasicCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationBasicClusterGeneratedCommandListAttributeCallback(),
            readApplicationBasicGeneratedCommandListCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readApplicationBasicGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ApplicationBasicCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationBasicClusterAcceptedCommandListAttributeCallback(),
            readApplicationBasicAcceptedCommandListCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readApplicationBasicAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ApplicationBasicCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedApplicationBasicClusterAttributeListAttributeCallback(),
            readApplicationBasicAttributeListCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readAttributeListAttribute", readApplicationBasicAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readApplicationBasicFeatureMapCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readFeatureMapAttribute", readApplicationBasicFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readApplicationBasicClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readApplicationBasicClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ApplicationBasicCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readApplicationBasicClusterRevisionCommandParams);
    readApplicationBasicInteractionInfo.put(
        "readClusterRevisionAttribute",
        readApplicationBasicClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("applicationBasic", readApplicationBasicInteractionInfo);
    Map<String, InteractionInfo> readAccountLoginInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readAccountLoginGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccountLoginGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccountLoginCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.AccountLoginCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAccountLoginClusterGeneratedCommandListAttributeCallback(),
            readAccountLoginGeneratedCommandListCommandParams);
    readAccountLoginInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readAccountLoginGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccountLoginAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccountLoginAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccountLoginCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.AccountLoginCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedAccountLoginClusterAcceptedCommandListAttributeCallback(),
            readAccountLoginAcceptedCommandListCommandParams);
    readAccountLoginInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readAccountLoginAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccountLoginAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccountLoginAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccountLoginCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.AccountLoginCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedAccountLoginClusterAttributeListAttributeCallback(),
            readAccountLoginAttributeListCommandParams);
    readAccountLoginInteractionInfo.put(
        "readAttributeListAttribute", readAccountLoginAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccountLoginFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccountLoginFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccountLoginCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readAccountLoginFeatureMapCommandParams);
    readAccountLoginInteractionInfo.put(
        "readFeatureMapAttribute", readAccountLoginFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readAccountLoginClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readAccountLoginClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.AccountLoginCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readAccountLoginClusterRevisionCommandParams);
    readAccountLoginInteractionInfo.put(
        "readClusterRevisionAttribute", readAccountLoginClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("accountLogin", readAccountLoginInteractionInfo);
    Map<String, InteractionInfo> readElectricalMeasurementInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readElectricalMeasurementMeasurementTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementMeasurementTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readMeasurementTypeAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readElectricalMeasurementMeasurementTypeCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readMeasurementTypeAttribute",
        readElectricalMeasurementMeasurementTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementTotalActivePowerCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementTotalActivePowerAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readTotalActivePowerAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readElectricalMeasurementTotalActivePowerCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readTotalActivePowerAttribute",
        readElectricalMeasurementTotalActivePowerAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementRmsVoltageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementRmsVoltageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readRmsVoltageAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementRmsVoltageCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readRmsVoltageAttribute", readElectricalMeasurementRmsVoltageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementRmsVoltageMinCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementRmsVoltageMinAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readRmsVoltageMinAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementRmsVoltageMinCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readRmsVoltageMinAttribute",
        readElectricalMeasurementRmsVoltageMinAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementRmsVoltageMaxCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementRmsVoltageMaxAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readRmsVoltageMaxAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementRmsVoltageMaxCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readRmsVoltageMaxAttribute",
        readElectricalMeasurementRmsVoltageMaxAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementRmsCurrentCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementRmsCurrentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readRmsCurrentAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementRmsCurrentCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readRmsCurrentAttribute", readElectricalMeasurementRmsCurrentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementRmsCurrentMinCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementRmsCurrentMinAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readRmsCurrentMinAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementRmsCurrentMinCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readRmsCurrentMinAttribute",
        readElectricalMeasurementRmsCurrentMinAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementRmsCurrentMaxCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementRmsCurrentMaxAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readRmsCurrentMaxAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementRmsCurrentMaxCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readRmsCurrentMaxAttribute",
        readElectricalMeasurementRmsCurrentMaxAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementActivePowerCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementActivePowerAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readActivePowerAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementActivePowerCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readActivePowerAttribute", readElectricalMeasurementActivePowerAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementActivePowerMinCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementActivePowerMinAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readActivePowerMinAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementActivePowerMinCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readActivePowerMinAttribute",
        readElectricalMeasurementActivePowerMinAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementActivePowerMaxCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementActivePowerMaxAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readActivePowerMaxAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementActivePowerMaxCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readActivePowerMaxAttribute",
        readElectricalMeasurementActivePowerMaxAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.ElectricalMeasurementCluster
                              .GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedElectricalMeasurementClusterGeneratedCommandListAttributeCallback(),
            readElectricalMeasurementGeneratedCommandListCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readElectricalMeasurementGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.ElectricalMeasurementCluster
                              .AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedElectricalMeasurementClusterAcceptedCommandListAttributeCallback(),
            readElectricalMeasurementAcceptedCommandListCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readElectricalMeasurementAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.ElectricalMeasurementCluster.AttributeListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedElectricalMeasurementClusterAttributeListAttributeCallback(),
            readElectricalMeasurementAttributeListCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readAttributeListAttribute",
        readElectricalMeasurementAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readElectricalMeasurementFeatureMapCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readFeatureMapAttribute", readElectricalMeasurementFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readElectricalMeasurementClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readElectricalMeasurementClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ElectricalMeasurementCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readElectricalMeasurementClusterRevisionCommandParams);
    readElectricalMeasurementInteractionInfo.put(
        "readClusterRevisionAttribute",
        readElectricalMeasurementClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("electricalMeasurement", readElectricalMeasurementInteractionInfo);
    Map<String, InteractionInfo> readTestClusterInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> readTestClusterBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readBooleanAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readTestClusterBooleanCommandParams);
    readTestClusterInteractionInfo.put(
        "readBooleanAttribute", readTestClusterBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterBitmap8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterBitmap8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readBitmap8Attribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterBitmap8CommandParams);
    readTestClusterInteractionInfo.put(
        "readBitmap8Attribute", readTestClusterBitmap8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterBitmap16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterBitmap16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readBitmap16Attribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterBitmap16CommandParams);
    readTestClusterInteractionInfo.put(
        "readBitmap16Attribute", readTestClusterBitmap16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterBitmap32CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterBitmap32AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readBitmap32Attribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterBitmap32CommandParams);
    readTestClusterInteractionInfo.put(
        "readBitmap32Attribute", readTestClusterBitmap32AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterBitmap64CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterBitmap64AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readBitmap64Attribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterBitmap64CommandParams);
    readTestClusterInteractionInfo.put(
        "readBitmap64Attribute", readTestClusterBitmap64AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt8uAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterInt8uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt8uAttribute", readTestClusterInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt16uAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterInt16uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt16uAttribute", readTestClusterInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt24uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt24uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt24uAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt24uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt24uAttribute", readTestClusterInt24uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt32uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt32uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt32uAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt32uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt32uAttribute", readTestClusterInt32uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt40uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt40uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt40uAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt40uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt40uAttribute", readTestClusterInt40uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt48uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt48uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt48uAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt48uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt48uAttribute", readTestClusterInt48uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt56uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt56uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt56uAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt56uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt56uAttribute", readTestClusterInt56uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt64uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt64uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt64uAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt64uCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt64uAttribute", readTestClusterInt64uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt8sAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterInt8sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt8sAttribute", readTestClusterInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt16sAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterInt16sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt16sAttribute", readTestClusterInt16sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt24sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt24sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt24sAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt24sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt24sAttribute", readTestClusterInt24sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt32sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt32sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt32sAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt32sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt32sAttribute", readTestClusterInt32sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt40sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt40sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt40sAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt40sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt40sAttribute", readTestClusterInt40sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt48sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt48sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt48sAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt48sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt48sAttribute", readTestClusterInt48sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt56sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt56sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt56sAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt56sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt56sAttribute", readTestClusterInt56sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterInt64sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterInt64sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readInt64sAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterInt64sCommandParams);
    readTestClusterInteractionInfo.put(
        "readInt64sAttribute", readTestClusterInt64sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterEnum8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterEnum8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readEnum8Attribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterEnum8CommandParams);
    readTestClusterInteractionInfo.put(
        "readEnum8Attribute", readTestClusterEnum8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterEnum16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterEnum16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readEnum16Attribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterEnum16CommandParams);
    readTestClusterInteractionInfo.put(
        "readEnum16Attribute", readTestClusterEnum16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterFloatSingleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterFloatSingleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readFloatSingleAttribute((ChipClusters.FloatAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedFloatAttributeCallback(),
            readTestClusterFloatSingleCommandParams);
    readTestClusterInteractionInfo.put(
        "readFloatSingleAttribute", readTestClusterFloatSingleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterFloatDoubleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterFloatDoubleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readFloatDoubleAttribute((ChipClusters.DoubleAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedDoubleAttributeCallback(),
            readTestClusterFloatDoubleCommandParams);
    readTestClusterInteractionInfo.put(
        "readFloatDoubleAttribute", readTestClusterFloatDoubleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readOctetStringAttribute((ChipClusters.OctetStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedOctetStringAttributeCallback(),
            readTestClusterOctetStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readOctetStringAttribute", readTestClusterOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterListInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterListInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readListInt8uAttribute(
                      (ChipClusters.TestClusterCluster.ListInt8uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedTestClusterClusterListInt8uAttributeCallback(),
            readTestClusterListInt8uCommandParams);
    readTestClusterInteractionInfo.put(
        "readListInt8uAttribute", readTestClusterListInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterListOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterListOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readListOctetStringAttribute(
                      (ChipClusters.TestClusterCluster.ListOctetStringAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTestClusterClusterListOctetStringAttributeCallback(),
            readTestClusterListOctetStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readListOctetStringAttribute", readTestClusterListOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterListStructOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterListStructOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readListStructOctetStringAttribute(
                      (ChipClusters.TestClusterCluster.ListStructOctetStringAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTestClusterClusterListStructOctetStringAttributeCallback(),
            readTestClusterListStructOctetStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readListStructOctetStringAttribute",
        readTestClusterListStructOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterLongOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterLongOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readLongOctetStringAttribute(
                      (ChipClusters.OctetStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedOctetStringAttributeCallback(),
            readTestClusterLongOctetStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readLongOctetStringAttribute", readTestClusterLongOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterCharStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterCharStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readCharStringAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readTestClusterCharStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readCharStringAttribute", readTestClusterCharStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterLongCharStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterLongCharStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readLongCharStringAttribute((ChipClusters.CharStringAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readTestClusterLongCharStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readLongCharStringAttribute", readTestClusterLongCharStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterEpochUsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterEpochUsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readEpochUsAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterEpochUsCommandParams);
    readTestClusterInteractionInfo.put(
        "readEpochUsAttribute", readTestClusterEpochUsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterEpochSCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterEpochSAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readEpochSAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterEpochSCommandParams);
    readTestClusterInteractionInfo.put(
        "readEpochSAttribute", readTestClusterEpochSAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterVendorIdCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterVendorIdAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readVendorIdAttribute(
                      (ChipClusters.TestClusterCluster.VendorIdAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterVendorIdCommandParams);
    readTestClusterInteractionInfo.put(
        "readVendorIdAttribute", readTestClusterVendorIdAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterListNullablesAndOptionalsStructCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterListNullablesAndOptionalsStructAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readListNullablesAndOptionalsStructAttribute(
                      (ChipClusters.TestClusterCluster
                              .ListNullablesAndOptionalsStructAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTestClusterClusterListNullablesAndOptionalsStructAttributeCallback(),
            readTestClusterListNullablesAndOptionalsStructCommandParams);
    readTestClusterInteractionInfo.put(
        "readListNullablesAndOptionalsStructAttribute",
        readTestClusterListNullablesAndOptionalsStructAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterEnumAttrCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterEnumAttrAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readEnumAttrAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterEnumAttrCommandParams);
    readTestClusterInteractionInfo.put(
        "readEnumAttrAttribute", readTestClusterEnumAttrAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterRangeRestrictedInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterRangeRestrictedInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readRangeRestrictedInt8uAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterRangeRestrictedInt8uCommandParams);
    readTestClusterInteractionInfo.put(
        "readRangeRestrictedInt8uAttribute",
        readTestClusterRangeRestrictedInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterRangeRestrictedInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterRangeRestrictedInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readRangeRestrictedInt8sAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterRangeRestrictedInt8sCommandParams);
    readTestClusterInteractionInfo.put(
        "readRangeRestrictedInt8sAttribute",
        readTestClusterRangeRestrictedInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterRangeRestrictedInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterRangeRestrictedInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readRangeRestrictedInt16uAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterRangeRestrictedInt16uCommandParams);
    readTestClusterInteractionInfo.put(
        "readRangeRestrictedInt16uAttribute",
        readTestClusterRangeRestrictedInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterRangeRestrictedInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterRangeRestrictedInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readRangeRestrictedInt16sAttribute(
                      (ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterRangeRestrictedInt16sCommandParams);
    readTestClusterInteractionInfo.put(
        "readRangeRestrictedInt16sAttribute",
        readTestClusterRangeRestrictedInt16sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterListLongOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterListLongOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readListLongOctetStringAttribute(
                      (ChipClusters.TestClusterCluster.ListLongOctetStringAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTestClusterClusterListLongOctetStringAttributeCallback(),
            readTestClusterListLongOctetStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readListLongOctetStringAttribute",
        readTestClusterListLongOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterListFabricScopedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterListFabricScopedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readListFabricScopedAttribute(
                      (ChipClusters.TestClusterCluster.ListFabricScopedAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTestClusterClusterListFabricScopedAttributeCallback(),
            readTestClusterListFabricScopedCommandParams);
    readTestClusterInteractionInfo.put(
        "readListFabricScopedAttribute", readTestClusterListFabricScopedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterTimedWriteBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterTimedWriteBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readTimedWriteBooleanAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readTestClusterTimedWriteBooleanCommandParams);
    readTestClusterInteractionInfo.put(
        "readTimedWriteBooleanAttribute", readTestClusterTimedWriteBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterGeneralErrorBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterGeneralErrorBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readGeneralErrorBooleanAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readTestClusterGeneralErrorBooleanCommandParams);
    readTestClusterInteractionInfo.put(
        "readGeneralErrorBooleanAttribute",
        readTestClusterGeneralErrorBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterClusterErrorBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterClusterErrorBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readClusterErrorBooleanAttribute(
                      (ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readTestClusterClusterErrorBooleanCommandParams);
    readTestClusterInteractionInfo.put(
        "readClusterErrorBooleanAttribute",
        readTestClusterClusterErrorBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterUnsupportedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterUnsupportedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readUnsupportedAttribute((ChipClusters.BooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readTestClusterUnsupportedCommandParams);
    readTestClusterInteractionInfo.put(
        "readUnsupportedAttribute", readTestClusterUnsupportedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableBooleanAttribute(
                      (ChipClusters.TestClusterCluster.NullableBooleanAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedBooleanAttributeCallback(),
            readTestClusterNullableBooleanCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableBooleanAttribute", readTestClusterNullableBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableBitmap8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableBitmap8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableBitmap8Attribute(
                      (ChipClusters.TestClusterCluster.NullableBitmap8AttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableBitmap8CommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableBitmap8Attribute", readTestClusterNullableBitmap8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableBitmap16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableBitmap16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableBitmap16Attribute(
                      (ChipClusters.TestClusterCluster.NullableBitmap16AttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableBitmap16CommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableBitmap16Attribute", readTestClusterNullableBitmap16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableBitmap32CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableBitmap32AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableBitmap32Attribute(
                      (ChipClusters.TestClusterCluster.NullableBitmap32AttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableBitmap32CommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableBitmap32Attribute", readTestClusterNullableBitmap32AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableBitmap64CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableBitmap64AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableBitmap64Attribute(
                      (ChipClusters.TestClusterCluster.NullableBitmap64AttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableBitmap64CommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableBitmap64Attribute", readTestClusterNullableBitmap64AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt8uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt8uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableInt8uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt8uAttribute", readTestClusterNullableInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt16uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt16uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableInt16uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt16uAttribute", readTestClusterNullableInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt24uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt24uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt24uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt24uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt24uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt24uAttribute", readTestClusterNullableInt24uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt32uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt32uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt32uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt32uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt32uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt32uAttribute", readTestClusterNullableInt32uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt40uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt40uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt40uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt40uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt40uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt40uAttribute", readTestClusterNullableInt40uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt48uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt48uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt48uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt48uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt48uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt48uAttribute", readTestClusterNullableInt48uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt56uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt56uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt56uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt56uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt56uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt56uAttribute", readTestClusterNullableInt56uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt64uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt64uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt64uAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt64uAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt64uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt64uAttribute", readTestClusterNullableInt64uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt8sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt8sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableInt8sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt8sAttribute", readTestClusterNullableInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt16sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt16sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableInt16sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt16sAttribute", readTestClusterNullableInt16sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt24sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt24sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt24sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt24sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt24sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt24sAttribute", readTestClusterNullableInt24sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt32sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt32sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt32sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt32sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt32sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt32sAttribute", readTestClusterNullableInt32sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt40sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt40sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt40sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt40sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt40sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt40sAttribute", readTestClusterNullableInt40sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt48sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt48sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt48sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt48sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt48sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt48sAttribute", readTestClusterNullableInt48sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt56sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt56sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt56sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt56sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt56sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt56sAttribute", readTestClusterNullableInt56sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableInt64sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableInt64sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableInt64sAttribute(
                      (ChipClusters.TestClusterCluster.NullableInt64sAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterNullableInt64sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableInt64sAttribute", readTestClusterNullableInt64sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableEnum8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableEnum8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableEnum8Attribute(
                      (ChipClusters.TestClusterCluster.NullableEnum8AttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableEnum8CommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableEnum8Attribute", readTestClusterNullableEnum8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableEnum16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableEnum16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableEnum16Attribute(
                      (ChipClusters.TestClusterCluster.NullableEnum16AttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableEnum16CommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableEnum16Attribute", readTestClusterNullableEnum16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableFloatSingleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableFloatSingleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableFloatSingleAttribute(
                      (ChipClusters.TestClusterCluster.NullableFloatSingleAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedFloatAttributeCallback(),
            readTestClusterNullableFloatSingleCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableFloatSingleAttribute",
        readTestClusterNullableFloatSingleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableFloatDoubleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableFloatDoubleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableFloatDoubleAttribute(
                      (ChipClusters.TestClusterCluster.NullableFloatDoubleAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedDoubleAttributeCallback(),
            readTestClusterNullableFloatDoubleCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableFloatDoubleAttribute",
        readTestClusterNullableFloatDoubleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableOctetStringAttribute(
                      (ChipClusters.TestClusterCluster.NullableOctetStringAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedOctetStringAttributeCallback(),
            readTestClusterNullableOctetStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableOctetStringAttribute",
        readTestClusterNullableOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableCharStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableCharStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableCharStringAttribute(
                      (ChipClusters.TestClusterCluster.NullableCharStringAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedCharStringAttributeCallback(),
            readTestClusterNullableCharStringCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableCharStringAttribute",
        readTestClusterNullableCharStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableEnumAttrCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableEnumAttrAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableEnumAttrAttribute(
                      (ChipClusters.TestClusterCluster.NullableEnumAttrAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableEnumAttrCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableEnumAttrAttribute", readTestClusterNullableEnumAttrAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableRangeRestrictedInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableRangeRestrictedInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableRangeRestrictedInt8uAttribute(
                      (ChipClusters.TestClusterCluster
                              .NullableRangeRestrictedInt8uAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableRangeRestrictedInt8uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableRangeRestrictedInt8uAttribute",
        readTestClusterNullableRangeRestrictedInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableRangeRestrictedInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableRangeRestrictedInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableRangeRestrictedInt8sAttribute(
                      (ChipClusters.TestClusterCluster
                              .NullableRangeRestrictedInt8sAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableRangeRestrictedInt8sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableRangeRestrictedInt8sAttribute",
        readTestClusterNullableRangeRestrictedInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableRangeRestrictedInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableRangeRestrictedInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableRangeRestrictedInt16uAttribute(
                      (ChipClusters.TestClusterCluster
                              .NullableRangeRestrictedInt16uAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableRangeRestrictedInt16uCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableRangeRestrictedInt16uAttribute",
        readTestClusterNullableRangeRestrictedInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterNullableRangeRestrictedInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterNullableRangeRestrictedInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readNullableRangeRestrictedInt16sAttribute(
                      (ChipClusters.TestClusterCluster
                              .NullableRangeRestrictedInt16sAttributeCallback)
                          callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterNullableRangeRestrictedInt16sCommandParams);
    readTestClusterInteractionInfo.put(
        "readNullableRangeRestrictedInt16sAttribute",
        readTestClusterNullableRangeRestrictedInt16sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterGeneratedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterGeneratedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readGeneratedCommandListAttribute(
                      (ChipClusters.TestClusterCluster.GeneratedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTestClusterClusterGeneratedCommandListAttributeCallback(),
            readTestClusterGeneratedCommandListCommandParams);
    readTestClusterInteractionInfo.put(
        "readGeneratedCommandListAttribute",
        readTestClusterGeneratedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterAcceptedCommandListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterAcceptedCommandListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readAcceptedCommandListAttribute(
                      (ChipClusters.TestClusterCluster.AcceptedCommandListAttributeCallback)
                          callback);
            },
            () ->
                new ClusterInfoMapping
                    .DelegatedTestClusterClusterAcceptedCommandListAttributeCallback(),
            readTestClusterAcceptedCommandListCommandParams);
    readTestClusterInteractionInfo.put(
        "readAcceptedCommandListAttribute",
        readTestClusterAcceptedCommandListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterAttributeListCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterAttributeListAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readAttributeListAttribute(
                      (ChipClusters.TestClusterCluster.AttributeListAttributeCallback) callback);
            },
            () ->
                new ClusterInfoMapping.DelegatedTestClusterClusterAttributeListAttributeCallback(),
            readTestClusterAttributeListCommandParams);
    readTestClusterInteractionInfo.put(
        "readAttributeListAttribute", readTestClusterAttributeListAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterFeatureMapCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterFeatureMapAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readFeatureMapAttribute((ChipClusters.LongAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedLongAttributeCallback(),
            readTestClusterFeatureMapCommandParams);
    readTestClusterInteractionInfo.put(
        "readFeatureMapAttribute", readTestClusterFeatureMapAttributeInteractionInfo);
    Map<String, CommandParameterInfo> readTestClusterClusterRevisionCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    InteractionInfo readTestClusterClusterRevisionAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .readClusterRevisionAttribute((ChipClusters.IntegerAttributeCallback) callback);
            },
            () -> new ClusterInfoMapping.DelegatedIntegerAttributeCallback(),
            readTestClusterClusterRevisionCommandParams);
    readTestClusterInteractionInfo.put(
        "readClusterRevisionAttribute", readTestClusterClusterRevisionAttributeInteractionInfo);
    readAttributeMap.put("testCluster", readTestClusterInteractionInfo);
    return readAttributeMap;
  }
}
