/*
 *
 *    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 chip.devicecontroller.ChipClusters.DefaultClusterCallback;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class ClusterWriteMapping {
  public Map<String, Map<String, InteractionInfo>> getWriteAttributeMap() {
    Map<String, Map<String, InteractionInfo>> writeAttributeMap = new HashMap<>();
    Map<String, InteractionInfo> writeIdentifyInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeIdentifyIdentifyTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo identifyidentifyTimeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeIdentifyIdentifyTimeCommandParams.put("value", identifyidentifyTimeCommandParameterInfo);
    InteractionInfo writeIdentifyIdentifyTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.IdentifyCluster) cluster)
                  .writeIdentifyTimeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeIdentifyIdentifyTimeCommandParams);
    writeIdentifyInteractionInfo.put(
        "writeIdentifyTimeAttribute", writeIdentifyIdentifyTimeAttributeInteractionInfo);
    writeAttributeMap.put("identify", writeIdentifyInteractionInfo);
    Map<String, InteractionInfo> writeGroupsInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("groups", writeGroupsInteractionInfo);
    Map<String, InteractionInfo> writeScenesInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("scenes", writeScenesInteractionInfo);
    Map<String, InteractionInfo> writeOnOffInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeOnOffOnTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo onOffonTimeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeOnOffOnTimeCommandParams.put("value", onOffonTimeCommandParameterInfo);
    InteractionInfo writeOnOffOnTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .writeOnTimeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeOnOffOnTimeCommandParams);
    writeOnOffInteractionInfo.put("writeOnTimeAttribute", writeOnOffOnTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeOnOffOffWaitTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo onOffoffWaitTimeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeOnOffOffWaitTimeCommandParams.put("value", onOffoffWaitTimeCommandParameterInfo);
    InteractionInfo writeOnOffOffWaitTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .writeOffWaitTimeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeOnOffOffWaitTimeCommandParams);
    writeOnOffInteractionInfo.put(
        "writeOffWaitTimeAttribute", writeOnOffOffWaitTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeOnOffStartUpOnOffCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo onOffstartUpOnOffCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeOnOffStartUpOnOffCommandParams.put("value", onOffstartUpOnOffCommandParameterInfo);
    InteractionInfo writeOnOffStartUpOnOffAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffCluster) cluster)
                  .writeStartUpOnOffAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeOnOffStartUpOnOffCommandParams);
    writeOnOffInteractionInfo.put(
        "writeStartUpOnOffAttribute", writeOnOffStartUpOnOffAttributeInteractionInfo);
    writeAttributeMap.put("onOff", writeOnOffInteractionInfo);
    Map<String, InteractionInfo> writeOnOffSwitchConfigurationInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeOnOffSwitchConfigurationSwitchActionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo onOffSwitchConfigurationswitchActionsCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeOnOffSwitchConfigurationSwitchActionsCommandParams.put(
        "value", onOffSwitchConfigurationswitchActionsCommandParameterInfo);
    InteractionInfo writeOnOffSwitchConfigurationSwitchActionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.OnOffSwitchConfigurationCluster) cluster)
                  .writeSwitchActionsAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeOnOffSwitchConfigurationSwitchActionsCommandParams);
    writeOnOffSwitchConfigurationInteractionInfo.put(
        "writeSwitchActionsAttribute",
        writeOnOffSwitchConfigurationSwitchActionsAttributeInteractionInfo);
    writeAttributeMap.put("onOffSwitchConfiguration", writeOnOffSwitchConfigurationInteractionInfo);
    Map<String, InteractionInfo> writeLevelControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeLevelControlOptionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo levelControloptionsCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeLevelControlOptionsCommandParams.put("value", levelControloptionsCommandParameterInfo);
    InteractionInfo writeLevelControlOptionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .writeOptionsAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLevelControlOptionsCommandParams);
    writeLevelControlInteractionInfo.put(
        "writeOptionsAttribute", writeLevelControlOptionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeLevelControlOnOffTransitionTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo levelControlonOffTransitionTimeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeLevelControlOnOffTransitionTimeCommandParams.put(
        "value", levelControlonOffTransitionTimeCommandParameterInfo);
    InteractionInfo writeLevelControlOnOffTransitionTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .writeOnOffTransitionTimeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLevelControlOnOffTransitionTimeCommandParams);
    writeLevelControlInteractionInfo.put(
        "writeOnOffTransitionTimeAttribute",
        writeLevelControlOnOffTransitionTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeLevelControlOnLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo levelControlonLevelCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeLevelControlOnLevelCommandParams.put("value", levelControlonLevelCommandParameterInfo);
    InteractionInfo writeLevelControlOnLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .writeOnLevelAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLevelControlOnLevelCommandParams);
    writeLevelControlInteractionInfo.put(
        "writeOnLevelAttribute", writeLevelControlOnLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeLevelControlOnTransitionTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo levelControlonTransitionTimeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeLevelControlOnTransitionTimeCommandParams.put(
        "value", levelControlonTransitionTimeCommandParameterInfo);
    InteractionInfo writeLevelControlOnTransitionTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .writeOnTransitionTimeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLevelControlOnTransitionTimeCommandParams);
    writeLevelControlInteractionInfo.put(
        "writeOnTransitionTimeAttribute",
        writeLevelControlOnTransitionTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeLevelControlOffTransitionTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo levelControloffTransitionTimeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeLevelControlOffTransitionTimeCommandParams.put(
        "value", levelControloffTransitionTimeCommandParameterInfo);
    InteractionInfo writeLevelControlOffTransitionTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .writeOffTransitionTimeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLevelControlOffTransitionTimeCommandParams);
    writeLevelControlInteractionInfo.put(
        "writeOffTransitionTimeAttribute",
        writeLevelControlOffTransitionTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeLevelControlDefaultMoveRateCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo levelControldefaultMoveRateCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeLevelControlDefaultMoveRateCommandParams.put(
        "value", levelControldefaultMoveRateCommandParameterInfo);
    InteractionInfo writeLevelControlDefaultMoveRateAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .writeDefaultMoveRateAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLevelControlDefaultMoveRateCommandParams);
    writeLevelControlInteractionInfo.put(
        "writeDefaultMoveRateAttribute", writeLevelControlDefaultMoveRateAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeLevelControlStartUpCurrentLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo levelControlstartUpCurrentLevelCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeLevelControlStartUpCurrentLevelCommandParams.put(
        "value", levelControlstartUpCurrentLevelCommandParameterInfo);
    InteractionInfo writeLevelControlStartUpCurrentLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LevelControlCluster) cluster)
                  .writeStartUpCurrentLevelAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLevelControlStartUpCurrentLevelCommandParams);
    writeLevelControlInteractionInfo.put(
        "writeStartUpCurrentLevelAttribute",
        writeLevelControlStartUpCurrentLevelAttributeInteractionInfo);
    writeAttributeMap.put("levelControl", writeLevelControlInteractionInfo);
    Map<String, InteractionInfo> writeBinaryInputBasicInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeBinaryInputBasicOutOfServiceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo binaryInputBasicoutOfServiceCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeBinaryInputBasicOutOfServiceCommandParams.put(
        "value", binaryInputBasicoutOfServiceCommandParameterInfo);
    InteractionInfo writeBinaryInputBasicOutOfServiceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .writeOutOfServiceAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBinaryInputBasicOutOfServiceCommandParams);
    writeBinaryInputBasicInteractionInfo.put(
        "writeOutOfServiceAttribute", writeBinaryInputBasicOutOfServiceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBinaryInputBasicPresentValueCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo binaryInputBasicpresentValueCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeBinaryInputBasicPresentValueCommandParams.put(
        "value", binaryInputBasicpresentValueCommandParameterInfo);
    InteractionInfo writeBinaryInputBasicPresentValueAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BinaryInputBasicCluster) cluster)
                  .writePresentValueAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBinaryInputBasicPresentValueCommandParams);
    writeBinaryInputBasicInteractionInfo.put(
        "writePresentValueAttribute", writeBinaryInputBasicPresentValueAttributeInteractionInfo);
    writeAttributeMap.put("binaryInputBasic", writeBinaryInputBasicInteractionInfo);
    Map<String, InteractionInfo> writeDescriptorInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("descriptor", writeDescriptorInteractionInfo);
    Map<String, InteractionInfo> writeBindingInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("binding", writeBindingInteractionInfo);
    Map<String, InteractionInfo> writeAccessControlInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("accessControl", writeAccessControlInteractionInfo);
    Map<String, InteractionInfo> writeActionsInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("actions", writeActionsInteractionInfo);
    Map<String, InteractionInfo> writeBasicInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeBasicNodeLabelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo basicnodeLabelCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeBasicNodeLabelCommandParams.put("value", basicnodeLabelCommandParameterInfo);
    InteractionInfo writeBasicNodeLabelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .writeNodeLabelAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBasicNodeLabelCommandParams);
    writeBasicInteractionInfo.put(
        "writeNodeLabelAttribute", writeBasicNodeLabelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBasicLocationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo basiclocationCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeBasicLocationCommandParams.put("value", basiclocationCommandParameterInfo);
    InteractionInfo writeBasicLocationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .writeLocationAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBasicLocationCommandParams);
    writeBasicInteractionInfo.put(
        "writeLocationAttribute", writeBasicLocationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBasicLocalConfigDisabledCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo basiclocalConfigDisabledCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeBasicLocalConfigDisabledCommandParams.put(
        "value", basiclocalConfigDisabledCommandParameterInfo);
    InteractionInfo writeBasicLocalConfigDisabledAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BasicCluster) cluster)
                  .writeLocalConfigDisabledAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBasicLocalConfigDisabledCommandParams);
    writeBasicInteractionInfo.put(
        "writeLocalConfigDisabledAttribute", writeBasicLocalConfigDisabledAttributeInteractionInfo);
    writeAttributeMap.put("basic", writeBasicInteractionInfo);
    Map<String, InteractionInfo> writeOtaSoftwareUpdateProviderInteractionInfo =
        new LinkedHashMap<>();
    writeAttributeMap.put(
        "otaSoftwareUpdateProvider", writeOtaSoftwareUpdateProviderInteractionInfo);
    Map<String, InteractionInfo> writeOtaSoftwareUpdateRequestorInteractionInfo =
        new LinkedHashMap<>();
    writeAttributeMap.put(
        "otaSoftwareUpdateRequestor", writeOtaSoftwareUpdateRequestorInteractionInfo);
    Map<String, InteractionInfo> writeLocalizationConfigurationInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeLocalizationConfigurationActiveLocaleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo localizationConfigurationactiveLocaleCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeLocalizationConfigurationActiveLocaleCommandParams.put(
        "value", localizationConfigurationactiveLocaleCommandParameterInfo);
    InteractionInfo writeLocalizationConfigurationActiveLocaleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.LocalizationConfigurationCluster) cluster)
                  .writeActiveLocaleAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeLocalizationConfigurationActiveLocaleCommandParams);
    writeLocalizationConfigurationInteractionInfo.put(
        "writeActiveLocaleAttribute",
        writeLocalizationConfigurationActiveLocaleAttributeInteractionInfo);
    writeAttributeMap.put(
        "localizationConfiguration", writeLocalizationConfigurationInteractionInfo);
    Map<String, InteractionInfo> writeTimeFormatLocalizationInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeTimeFormatLocalizationHourFormatCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo timeFormatLocalizationhourFormatCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTimeFormatLocalizationHourFormatCommandParams.put(
        "value", timeFormatLocalizationhourFormatCommandParameterInfo);
    InteractionInfo writeTimeFormatLocalizationHourFormatAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .writeHourFormatAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTimeFormatLocalizationHourFormatCommandParams);
    writeTimeFormatLocalizationInteractionInfo.put(
        "writeHourFormatAttribute", writeTimeFormatLocalizationHourFormatAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTimeFormatLocalizationActiveCalendarTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo timeFormatLocalizationactiveCalendarTypeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTimeFormatLocalizationActiveCalendarTypeCommandParams.put(
        "value", timeFormatLocalizationactiveCalendarTypeCommandParameterInfo);
    InteractionInfo writeTimeFormatLocalizationActiveCalendarTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TimeFormatLocalizationCluster) cluster)
                  .writeActiveCalendarTypeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTimeFormatLocalizationActiveCalendarTypeCommandParams);
    writeTimeFormatLocalizationInteractionInfo.put(
        "writeActiveCalendarTypeAttribute",
        writeTimeFormatLocalizationActiveCalendarTypeAttributeInteractionInfo);
    writeAttributeMap.put("timeFormatLocalization", writeTimeFormatLocalizationInteractionInfo);
    Map<String, InteractionInfo> writeUnitLocalizationInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeUnitLocalizationTemperatureUnitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo unitLocalizationtemperatureUnitCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeUnitLocalizationTemperatureUnitCommandParams.put(
        "value", unitLocalizationtemperatureUnitCommandParameterInfo);
    InteractionInfo writeUnitLocalizationTemperatureUnitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.UnitLocalizationCluster) cluster)
                  .writeTemperatureUnitAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeUnitLocalizationTemperatureUnitCommandParams);
    writeUnitLocalizationInteractionInfo.put(
        "writeTemperatureUnitAttribute",
        writeUnitLocalizationTemperatureUnitAttributeInteractionInfo);
    writeAttributeMap.put("unitLocalization", writeUnitLocalizationInteractionInfo);
    Map<String, InteractionInfo> writePowerSourceConfigurationInteractionInfo =
        new LinkedHashMap<>();
    writeAttributeMap.put("powerSourceConfiguration", writePowerSourceConfigurationInteractionInfo);
    Map<String, InteractionInfo> writePowerSourceInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("powerSource", writePowerSourceInteractionInfo);
    Map<String, InteractionInfo> writeGeneralCommissioningInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeGeneralCommissioningBreadcrumbCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo generalCommissioningbreadcrumbCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeGeneralCommissioningBreadcrumbCommandParams.put(
        "value", generalCommissioningbreadcrumbCommandParameterInfo);
    InteractionInfo writeGeneralCommissioningBreadcrumbAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.GeneralCommissioningCluster) cluster)
                  .writeBreadcrumbAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeGeneralCommissioningBreadcrumbCommandParams);
    writeGeneralCommissioningInteractionInfo.put(
        "writeBreadcrumbAttribute", writeGeneralCommissioningBreadcrumbAttributeInteractionInfo);
    writeAttributeMap.put("generalCommissioning", writeGeneralCommissioningInteractionInfo);
    Map<String, InteractionInfo> writeNetworkCommissioningInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeNetworkCommissioningInterfaceEnabledCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo networkCommissioninginterfaceEnabledCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeNetworkCommissioningInterfaceEnabledCommandParams.put(
        "value", networkCommissioninginterfaceEnabledCommandParameterInfo);
    InteractionInfo writeNetworkCommissioningInterfaceEnabledAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.NetworkCommissioningCluster) cluster)
                  .writeInterfaceEnabledAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeNetworkCommissioningInterfaceEnabledCommandParams);
    writeNetworkCommissioningInteractionInfo.put(
        "writeInterfaceEnabledAttribute",
        writeNetworkCommissioningInterfaceEnabledAttributeInteractionInfo);
    writeAttributeMap.put("networkCommissioning", writeNetworkCommissioningInteractionInfo);
    Map<String, InteractionInfo> writeDiagnosticLogsInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("diagnosticLogs", writeDiagnosticLogsInteractionInfo);
    Map<String, InteractionInfo> writeGeneralDiagnosticsInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("generalDiagnostics", writeGeneralDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> writeSoftwareDiagnosticsInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("softwareDiagnostics", writeSoftwareDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> writeThreadNetworkDiagnosticsInteractionInfo =
        new LinkedHashMap<>();
    writeAttributeMap.put("threadNetworkDiagnostics", writeThreadNetworkDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> writeWiFiNetworkDiagnosticsInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("wiFiNetworkDiagnostics", writeWiFiNetworkDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> writeEthernetNetworkDiagnosticsInteractionInfo =
        new LinkedHashMap<>();
    writeAttributeMap.put(
        "ethernetNetworkDiagnostics", writeEthernetNetworkDiagnosticsInteractionInfo);
    Map<String, InteractionInfo> writeBridgedDeviceBasicInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeBridgedDeviceBasicNodeLabelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo bridgedDeviceBasicnodeLabelCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeBridgedDeviceBasicNodeLabelCommandParams.put(
        "value", bridgedDeviceBasicnodeLabelCommandParameterInfo);
    InteractionInfo writeBridgedDeviceBasicNodeLabelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BridgedDeviceBasicCluster) cluster)
                  .writeNodeLabelAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBridgedDeviceBasicNodeLabelCommandParams);
    writeBridgedDeviceBasicInteractionInfo.put(
        "writeNodeLabelAttribute", writeBridgedDeviceBasicNodeLabelAttributeInteractionInfo);
    writeAttributeMap.put("bridgedDeviceBasic", writeBridgedDeviceBasicInteractionInfo);
    Map<String, InteractionInfo> writeSwitchInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("switch", writeSwitchInteractionInfo);
    Map<String, InteractionInfo> writeAdministratorCommissioningInteractionInfo =
        new LinkedHashMap<>();
    writeAttributeMap.put(
        "administratorCommissioning", writeAdministratorCommissioningInteractionInfo);
    Map<String, InteractionInfo> writeOperationalCredentialsInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("operationalCredentials", writeOperationalCredentialsInteractionInfo);
    Map<String, InteractionInfo> writeGroupKeyManagementInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("groupKeyManagement", writeGroupKeyManagementInteractionInfo);
    Map<String, InteractionInfo> writeFixedLabelInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("fixedLabel", writeFixedLabelInteractionInfo);
    Map<String, InteractionInfo> writeUserLabelInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("userLabel", writeUserLabelInteractionInfo);
    Map<String, InteractionInfo> writeBooleanStateInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("booleanState", writeBooleanStateInteractionInfo);
    Map<String, InteractionInfo> writeModeSelectInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeModeSelectStartUpModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo modeSelectstartUpModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeModeSelectStartUpModeCommandParams.put("value", modeSelectstartUpModeCommandParameterInfo);
    InteractionInfo writeModeSelectStartUpModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .writeStartUpModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeModeSelectStartUpModeCommandParams);
    writeModeSelectInteractionInfo.put(
        "writeStartUpModeAttribute", writeModeSelectStartUpModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeModeSelectOnModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo modeSelectonModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeModeSelectOnModeCommandParams.put("value", modeSelectonModeCommandParameterInfo);
    InteractionInfo writeModeSelectOnModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ModeSelectCluster) cluster)
                  .writeOnModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeModeSelectOnModeCommandParams);
    writeModeSelectInteractionInfo.put(
        "writeOnModeAttribute", writeModeSelectOnModeAttributeInteractionInfo);
    writeAttributeMap.put("modeSelect", writeModeSelectInteractionInfo);
    Map<String, InteractionInfo> writeDoorLockInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeDoorLockLanguageCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLocklanguageCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeDoorLockLanguageCommandParams.put("value", doorLocklanguageCommandParameterInfo);
    InteractionInfo writeDoorLockLanguageAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeLanguageAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockLanguageCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeLanguageAttribute", writeDoorLockLanguageAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockAutoRelockTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLockautoRelockTimeCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeDoorLockAutoRelockTimeCommandParams.put(
        "value", doorLockautoRelockTimeCommandParameterInfo);
    InteractionInfo writeDoorLockAutoRelockTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeAutoRelockTimeAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockAutoRelockTimeCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeAutoRelockTimeAttribute", writeDoorLockAutoRelockTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockSoundVolumeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLocksoundVolumeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeDoorLockSoundVolumeCommandParams.put("value", doorLocksoundVolumeCommandParameterInfo);
    InteractionInfo writeDoorLockSoundVolumeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeSoundVolumeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockSoundVolumeCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeSoundVolumeAttribute", writeDoorLockSoundVolumeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockOperatingModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLockoperatingModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeDoorLockOperatingModeCommandParams.put("value", doorLockoperatingModeCommandParameterInfo);
    InteractionInfo writeDoorLockOperatingModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeOperatingModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockOperatingModeCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeOperatingModeAttribute", writeDoorLockOperatingModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockEnableOneTouchLockingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLockenableOneTouchLockingCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeDoorLockEnableOneTouchLockingCommandParams.put(
        "value", doorLockenableOneTouchLockingCommandParameterInfo);
    InteractionInfo writeDoorLockEnableOneTouchLockingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeEnableOneTouchLockingAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockEnableOneTouchLockingCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeEnableOneTouchLockingAttribute",
        writeDoorLockEnableOneTouchLockingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockEnablePrivacyModeButtonCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLockenablePrivacyModeButtonCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeDoorLockEnablePrivacyModeButtonCommandParams.put(
        "value", doorLockenablePrivacyModeButtonCommandParameterInfo);
    InteractionInfo writeDoorLockEnablePrivacyModeButtonAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeEnablePrivacyModeButtonAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockEnablePrivacyModeButtonCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeEnablePrivacyModeButtonAttribute",
        writeDoorLockEnablePrivacyModeButtonAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockWrongCodeEntryLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLockwrongCodeEntryLimitCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeDoorLockWrongCodeEntryLimitCommandParams.put(
        "value", doorLockwrongCodeEntryLimitCommandParameterInfo);
    InteractionInfo writeDoorLockWrongCodeEntryLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeWrongCodeEntryLimitAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockWrongCodeEntryLimitCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeWrongCodeEntryLimitAttribute",
        writeDoorLockWrongCodeEntryLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockUserCodeTemporaryDisableTimeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLockuserCodeTemporaryDisableTimeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeDoorLockUserCodeTemporaryDisableTimeCommandParams.put(
        "value", doorLockuserCodeTemporaryDisableTimeCommandParameterInfo);
    InteractionInfo writeDoorLockUserCodeTemporaryDisableTimeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeUserCodeTemporaryDisableTimeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockUserCodeTemporaryDisableTimeCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeUserCodeTemporaryDisableTimeAttribute",
        writeDoorLockUserCodeTemporaryDisableTimeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeDoorLockRequirePINforRemoteOperationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo doorLockrequirePINforRemoteOperationCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeDoorLockRequirePINforRemoteOperationCommandParams.put(
        "value", doorLockrequirePINforRemoteOperationCommandParameterInfo);
    InteractionInfo writeDoorLockRequirePINforRemoteOperationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.DoorLockCluster) cluster)
                  .writeRequirePINforRemoteOperationAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeDoorLockRequirePINforRemoteOperationCommandParams);
    writeDoorLockInteractionInfo.put(
        "writeRequirePINforRemoteOperationAttribute",
        writeDoorLockRequirePINforRemoteOperationAttributeInteractionInfo);
    writeAttributeMap.put("doorLock", writeDoorLockInteractionInfo);
    Map<String, InteractionInfo> writeWindowCoveringInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeWindowCoveringModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo windowCoveringmodeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeWindowCoveringModeCommandParams.put("value", windowCoveringmodeCommandParameterInfo);
    InteractionInfo writeWindowCoveringModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.WindowCoveringCluster) cluster)
                  .writeModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeWindowCoveringModeCommandParams);
    writeWindowCoveringInteractionInfo.put(
        "writeModeAttribute", writeWindowCoveringModeAttributeInteractionInfo);
    writeAttributeMap.put("windowCovering", writeWindowCoveringInteractionInfo);
    Map<String, InteractionInfo> writeBarrierControlInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("barrierControl", writeBarrierControlInteractionInfo);
    Map<String, InteractionInfo> writePumpConfigurationAndControlInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo>
        writePumpConfigurationAndControlLifetimeRunningHoursCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo pumpConfigurationAndControllifetimeRunningHoursCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writePumpConfigurationAndControlLifetimeRunningHoursCommandParams.put(
        "value", pumpConfigurationAndControllifetimeRunningHoursCommandParameterInfo);
    InteractionInfo writePumpConfigurationAndControlLifetimeRunningHoursAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .writeLifetimeRunningHoursAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writePumpConfigurationAndControlLifetimeRunningHoursCommandParams);
    writePumpConfigurationAndControlInteractionInfo.put(
        "writeLifetimeRunningHoursAttribute",
        writePumpConfigurationAndControlLifetimeRunningHoursAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        writePumpConfigurationAndControlLifetimeEnergyConsumedCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo pumpConfigurationAndControllifetimeEnergyConsumedCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writePumpConfigurationAndControlLifetimeEnergyConsumedCommandParams.put(
        "value", pumpConfigurationAndControllifetimeEnergyConsumedCommandParameterInfo);
    InteractionInfo writePumpConfigurationAndControlLifetimeEnergyConsumedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .writeLifetimeEnergyConsumedAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writePumpConfigurationAndControlLifetimeEnergyConsumedCommandParams);
    writePumpConfigurationAndControlInteractionInfo.put(
        "writeLifetimeEnergyConsumedAttribute",
        writePumpConfigurationAndControlLifetimeEnergyConsumedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writePumpConfigurationAndControlOperationModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo pumpConfigurationAndControloperationModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writePumpConfigurationAndControlOperationModeCommandParams.put(
        "value", pumpConfigurationAndControloperationModeCommandParameterInfo);
    InteractionInfo writePumpConfigurationAndControlOperationModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .writeOperationModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writePumpConfigurationAndControlOperationModeCommandParams);
    writePumpConfigurationAndControlInteractionInfo.put(
        "writeOperationModeAttribute",
        writePumpConfigurationAndControlOperationModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writePumpConfigurationAndControlControlModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo pumpConfigurationAndControlcontrolModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writePumpConfigurationAndControlControlModeCommandParams.put(
        "value", pumpConfigurationAndControlcontrolModeCommandParameterInfo);
    InteractionInfo writePumpConfigurationAndControlControlModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.PumpConfigurationAndControlCluster) cluster)
                  .writeControlModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writePumpConfigurationAndControlControlModeCommandParams);
    writePumpConfigurationAndControlInteractionInfo.put(
        "writeControlModeAttribute",
        writePumpConfigurationAndControlControlModeAttributeInteractionInfo);
    writeAttributeMap.put(
        "pumpConfigurationAndControl", writePumpConfigurationAndControlInteractionInfo);
    Map<String, InteractionInfo> writeThermostatInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeThermostatOccupiedCoolingSetpointCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatoccupiedCoolingSetpointCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatOccupiedCoolingSetpointCommandParams.put(
        "value", thermostatoccupiedCoolingSetpointCommandParameterInfo);
    InteractionInfo writeThermostatOccupiedCoolingSetpointAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeOccupiedCoolingSetpointAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatOccupiedCoolingSetpointCommandParams);
    writeThermostatInteractionInfo.put(
        "writeOccupiedCoolingSetpointAttribute",
        writeThermostatOccupiedCoolingSetpointAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatOccupiedHeatingSetpointCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatoccupiedHeatingSetpointCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatOccupiedHeatingSetpointCommandParams.put(
        "value", thermostatoccupiedHeatingSetpointCommandParameterInfo);
    InteractionInfo writeThermostatOccupiedHeatingSetpointAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeOccupiedHeatingSetpointAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatOccupiedHeatingSetpointCommandParams);
    writeThermostatInteractionInfo.put(
        "writeOccupiedHeatingSetpointAttribute",
        writeThermostatOccupiedHeatingSetpointAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatMinHeatSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatminHeatSetpointLimitCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatMinHeatSetpointLimitCommandParams.put(
        "value", thermostatminHeatSetpointLimitCommandParameterInfo);
    InteractionInfo writeThermostatMinHeatSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeMinHeatSetpointLimitAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatMinHeatSetpointLimitCommandParams);
    writeThermostatInteractionInfo.put(
        "writeMinHeatSetpointLimitAttribute",
        writeThermostatMinHeatSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatMaxHeatSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatmaxHeatSetpointLimitCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatMaxHeatSetpointLimitCommandParams.put(
        "value", thermostatmaxHeatSetpointLimitCommandParameterInfo);
    InteractionInfo writeThermostatMaxHeatSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeMaxHeatSetpointLimitAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatMaxHeatSetpointLimitCommandParams);
    writeThermostatInteractionInfo.put(
        "writeMaxHeatSetpointLimitAttribute",
        writeThermostatMaxHeatSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatMinCoolSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatminCoolSetpointLimitCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatMinCoolSetpointLimitCommandParams.put(
        "value", thermostatminCoolSetpointLimitCommandParameterInfo);
    InteractionInfo writeThermostatMinCoolSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeMinCoolSetpointLimitAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatMinCoolSetpointLimitCommandParams);
    writeThermostatInteractionInfo.put(
        "writeMinCoolSetpointLimitAttribute",
        writeThermostatMinCoolSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatMaxCoolSetpointLimitCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatmaxCoolSetpointLimitCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatMaxCoolSetpointLimitCommandParams.put(
        "value", thermostatmaxCoolSetpointLimitCommandParameterInfo);
    InteractionInfo writeThermostatMaxCoolSetpointLimitAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeMaxCoolSetpointLimitAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatMaxCoolSetpointLimitCommandParams);
    writeThermostatInteractionInfo.put(
        "writeMaxCoolSetpointLimitAttribute",
        writeThermostatMaxCoolSetpointLimitAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatMinSetpointDeadBandCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatminSetpointDeadBandCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatMinSetpointDeadBandCommandParams.put(
        "value", thermostatminSetpointDeadBandCommandParameterInfo);
    InteractionInfo writeThermostatMinSetpointDeadBandAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeMinSetpointDeadBandAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatMinSetpointDeadBandCommandParams);
    writeThermostatInteractionInfo.put(
        "writeMinSetpointDeadBandAttribute",
        writeThermostatMinSetpointDeadBandAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatControlSequenceOfOperationCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatcontrolSequenceOfOperationCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatControlSequenceOfOperationCommandParams.put(
        "value", thermostatcontrolSequenceOfOperationCommandParameterInfo);
    InteractionInfo writeThermostatControlSequenceOfOperationAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeControlSequenceOfOperationAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatControlSequenceOfOperationCommandParams);
    writeThermostatInteractionInfo.put(
        "writeControlSequenceOfOperationAttribute",
        writeThermostatControlSequenceOfOperationAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeThermostatSystemModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatsystemModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatSystemModeCommandParams.put("value", thermostatsystemModeCommandParameterInfo);
    InteractionInfo writeThermostatSystemModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatCluster) cluster)
                  .writeSystemModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatSystemModeCommandParams);
    writeThermostatInteractionInfo.put(
        "writeSystemModeAttribute", writeThermostatSystemModeAttributeInteractionInfo);
    writeAttributeMap.put("thermostat", writeThermostatInteractionInfo);
    Map<String, InteractionInfo> writeFanControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeFanControlFanModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo fanControlfanModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeFanControlFanModeCommandParams.put("value", fanControlfanModeCommandParameterInfo);
    InteractionInfo writeFanControlFanModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .writeFanModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeFanControlFanModeCommandParams);
    writeFanControlInteractionInfo.put(
        "writeFanModeAttribute", writeFanControlFanModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeFanControlFanModeSequenceCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo fanControlfanModeSequenceCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeFanControlFanModeSequenceCommandParams.put(
        "value", fanControlfanModeSequenceCommandParameterInfo);
    InteractionInfo writeFanControlFanModeSequenceAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .writeFanModeSequenceAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeFanControlFanModeSequenceCommandParams);
    writeFanControlInteractionInfo.put(
        "writeFanModeSequenceAttribute", writeFanControlFanModeSequenceAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeFanControlPercentSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo fanControlpercentSettingCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeFanControlPercentSettingCommandParams.put(
        "value", fanControlpercentSettingCommandParameterInfo);
    InteractionInfo writeFanControlPercentSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .writePercentSettingAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeFanControlPercentSettingCommandParams);
    writeFanControlInteractionInfo.put(
        "writePercentSettingAttribute", writeFanControlPercentSettingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeFanControlSpeedSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo fanControlspeedSettingCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeFanControlSpeedSettingCommandParams.put(
        "value", fanControlspeedSettingCommandParameterInfo);
    InteractionInfo writeFanControlSpeedSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .writeSpeedSettingAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeFanControlSpeedSettingCommandParams);
    writeFanControlInteractionInfo.put(
        "writeSpeedSettingAttribute", writeFanControlSpeedSettingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeFanControlRockSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo fanControlrockSettingCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeFanControlRockSettingCommandParams.put("value", fanControlrockSettingCommandParameterInfo);
    InteractionInfo writeFanControlRockSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .writeRockSettingAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeFanControlRockSettingCommandParams);
    writeFanControlInteractionInfo.put(
        "writeRockSettingAttribute", writeFanControlRockSettingAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeFanControlWindSettingCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo fanControlwindSettingCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeFanControlWindSettingCommandParams.put("value", fanControlwindSettingCommandParameterInfo);
    InteractionInfo writeFanControlWindSettingAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.FanControlCluster) cluster)
                  .writeWindSettingAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeFanControlWindSettingCommandParams);
    writeFanControlInteractionInfo.put(
        "writeWindSettingAttribute", writeFanControlWindSettingAttributeInteractionInfo);
    writeAttributeMap.put("fanControl", writeFanControlInteractionInfo);
    Map<String, InteractionInfo> writeThermostatUserInterfaceConfigurationInteractionInfo =
        new LinkedHashMap<>();
    Map<String, CommandParameterInfo>
        writeThermostatUserInterfaceConfigurationTemperatureDisplayModeCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo
        thermostatUserInterfaceConfigurationtemperatureDisplayModeCommandParameterInfo =
            new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatUserInterfaceConfigurationTemperatureDisplayModeCommandParams.put(
        "value", thermostatUserInterfaceConfigurationtemperatureDisplayModeCommandParameterInfo);
    InteractionInfo
        writeThermostatUserInterfaceConfigurationTemperatureDisplayModeAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                      .writeTemperatureDisplayModeAttribute(
                          (DefaultClusterCallback) callback,
                          (Integer) commandArguments.get("value"));
                },
                () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
                writeThermostatUserInterfaceConfigurationTemperatureDisplayModeCommandParams);
    writeThermostatUserInterfaceConfigurationInteractionInfo.put(
        "writeTemperatureDisplayModeAttribute",
        writeThermostatUserInterfaceConfigurationTemperatureDisplayModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        writeThermostatUserInterfaceConfigurationKeypadLockoutCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo thermostatUserInterfaceConfigurationkeypadLockoutCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatUserInterfaceConfigurationKeypadLockoutCommandParams.put(
        "value", thermostatUserInterfaceConfigurationkeypadLockoutCommandParameterInfo);
    InteractionInfo writeThermostatUserInterfaceConfigurationKeypadLockoutAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                  .writeKeypadLockoutAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeThermostatUserInterfaceConfigurationKeypadLockoutCommandParams);
    writeThermostatUserInterfaceConfigurationInteractionInfo.put(
        "writeKeypadLockoutAttribute",
        writeThermostatUserInterfaceConfigurationKeypadLockoutAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        writeThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo
        thermostatUserInterfaceConfigurationscheduleProgrammingVisibilityCommandParameterInfo =
            new CommandParameterInfo("value", Integer.class, Integer.class);
    writeThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityCommandParams.put(
        "value",
        thermostatUserInterfaceConfigurationscheduleProgrammingVisibilityCommandParameterInfo);
    InteractionInfo
        writeThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityAttributeInteractionInfo =
            new InteractionInfo(
                (cluster, callback, commandArguments) -> {
                  ((ChipClusters.ThermostatUserInterfaceConfigurationCluster) cluster)
                      .writeScheduleProgrammingVisibilityAttribute(
                          (DefaultClusterCallback) callback,
                          (Integer) commandArguments.get("value"));
                },
                () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
                writeThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityCommandParams);
    writeThermostatUserInterfaceConfigurationInteractionInfo.put(
        "writeScheduleProgrammingVisibilityAttribute",
        writeThermostatUserInterfaceConfigurationScheduleProgrammingVisibilityAttributeInteractionInfo);
    writeAttributeMap.put(
        "thermostatUserInterfaceConfiguration",
        writeThermostatUserInterfaceConfigurationInteractionInfo);
    Map<String, InteractionInfo> writeColorControlInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeColorControlOptionsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControloptionsCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlOptionsCommandParams.put("value", colorControloptionsCommandParameterInfo);
    InteractionInfo writeColorControlOptionsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeOptionsAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlOptionsCommandParams);
    writeColorControlInteractionInfo.put(
        "writeOptionsAttribute", writeColorControlOptionsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlWhitePointXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlwhitePointXCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlWhitePointXCommandParams.put(
        "value", colorControlwhitePointXCommandParameterInfo);
    InteractionInfo writeColorControlWhitePointXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeWhitePointXAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlWhitePointXCommandParams);
    writeColorControlInteractionInfo.put(
        "writeWhitePointXAttribute", writeColorControlWhitePointXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlWhitePointYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlwhitePointYCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlWhitePointYCommandParams.put(
        "value", colorControlwhitePointYCommandParameterInfo);
    InteractionInfo writeColorControlWhitePointYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeWhitePointYAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlWhitePointYCommandParams);
    writeColorControlInteractionInfo.put(
        "writeWhitePointYAttribute", writeColorControlWhitePointYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointRXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointRXCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointRXCommandParams.put(
        "value", colorControlcolorPointRXCommandParameterInfo);
    InteractionInfo writeColorControlColorPointRXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointRXAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointRXCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointRXAttribute", writeColorControlColorPointRXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointRYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointRYCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointRYCommandParams.put(
        "value", colorControlcolorPointRYCommandParameterInfo);
    InteractionInfo writeColorControlColorPointRYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointRYAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointRYCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointRYAttribute", writeColorControlColorPointRYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointRIntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointRIntensityCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointRIntensityCommandParams.put(
        "value", colorControlcolorPointRIntensityCommandParameterInfo);
    InteractionInfo writeColorControlColorPointRIntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointRIntensityAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointRIntensityCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointRIntensityAttribute",
        writeColorControlColorPointRIntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointGXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointGXCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointGXCommandParams.put(
        "value", colorControlcolorPointGXCommandParameterInfo);
    InteractionInfo writeColorControlColorPointGXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointGXAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointGXCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointGXAttribute", writeColorControlColorPointGXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointGYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointGYCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointGYCommandParams.put(
        "value", colorControlcolorPointGYCommandParameterInfo);
    InteractionInfo writeColorControlColorPointGYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointGYAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointGYCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointGYAttribute", writeColorControlColorPointGYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointGIntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointGIntensityCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointGIntensityCommandParams.put(
        "value", colorControlcolorPointGIntensityCommandParameterInfo);
    InteractionInfo writeColorControlColorPointGIntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointGIntensityAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointGIntensityCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointGIntensityAttribute",
        writeColorControlColorPointGIntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointBXCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointBXCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointBXCommandParams.put(
        "value", colorControlcolorPointBXCommandParameterInfo);
    InteractionInfo writeColorControlColorPointBXAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointBXAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointBXCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointBXAttribute", writeColorControlColorPointBXAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointBYCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointBYCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointBYCommandParams.put(
        "value", colorControlcolorPointBYCommandParameterInfo);
    InteractionInfo writeColorControlColorPointBYAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointBYAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointBYCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointBYAttribute", writeColorControlColorPointBYAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlColorPointBIntensityCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlcolorPointBIntensityCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlColorPointBIntensityCommandParams.put(
        "value", colorControlcolorPointBIntensityCommandParameterInfo);
    InteractionInfo writeColorControlColorPointBIntensityAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeColorPointBIntensityAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlColorPointBIntensityCommandParams);
    writeColorControlInteractionInfo.put(
        "writeColorPointBIntensityAttribute",
        writeColorControlColorPointBIntensityAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeColorControlStartUpColorTemperatureMiredsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo colorControlstartUpColorTemperatureMiredsCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeColorControlStartUpColorTemperatureMiredsCommandParams.put(
        "value", colorControlstartUpColorTemperatureMiredsCommandParameterInfo);
    InteractionInfo writeColorControlStartUpColorTemperatureMiredsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ColorControlCluster) cluster)
                  .writeStartUpColorTemperatureMiredsAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeColorControlStartUpColorTemperatureMiredsCommandParams);
    writeColorControlInteractionInfo.put(
        "writeStartUpColorTemperatureMiredsAttribute",
        writeColorControlStartUpColorTemperatureMiredsAttributeInteractionInfo);
    writeAttributeMap.put("colorControl", writeColorControlInteractionInfo);
    Map<String, InteractionInfo> writeBallastConfigurationInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeBallastConfigurationMinLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationminLevelCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeBallastConfigurationMinLevelCommandParams.put(
        "value", ballastConfigurationminLevelCommandParameterInfo);
    InteractionInfo writeBallastConfigurationMinLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeMinLevelAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationMinLevelCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeMinLevelAttribute", writeBallastConfigurationMinLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationMaxLevelCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationmaxLevelCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeBallastConfigurationMaxLevelCommandParams.put(
        "value", ballastConfigurationmaxLevelCommandParameterInfo);
    InteractionInfo writeBallastConfigurationMaxLevelAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeMaxLevelAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationMaxLevelCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeMaxLevelAttribute", writeBallastConfigurationMaxLevelAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationIntrinsicBalanceFactorCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationintrinsicBalanceFactorCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeBallastConfigurationIntrinsicBalanceFactorCommandParams.put(
        "value", ballastConfigurationintrinsicBalanceFactorCommandParameterInfo);
    InteractionInfo writeBallastConfigurationIntrinsicBalanceFactorAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeIntrinsicBalanceFactorAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationIntrinsicBalanceFactorCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeIntrinsicBalanceFactorAttribute",
        writeBallastConfigurationIntrinsicBalanceFactorAttributeInteractionInfo);
    Map<String, CommandParameterInfo>
        writeBallastConfigurationBallastFactorAdjustmentCommandParams =
            new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationballastFactorAdjustmentCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeBallastConfigurationBallastFactorAdjustmentCommandParams.put(
        "value", ballastConfigurationballastFactorAdjustmentCommandParameterInfo);
    InteractionInfo writeBallastConfigurationBallastFactorAdjustmentAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeBallastFactorAdjustmentAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationBallastFactorAdjustmentCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeBallastFactorAdjustmentAttribute",
        writeBallastConfigurationBallastFactorAdjustmentAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationLampTypeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationlampTypeCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeBallastConfigurationLampTypeCommandParams.put(
        "value", ballastConfigurationlampTypeCommandParameterInfo);
    InteractionInfo writeBallastConfigurationLampTypeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeLampTypeAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationLampTypeCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeLampTypeAttribute", writeBallastConfigurationLampTypeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationLampManufacturerCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationlampManufacturerCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeBallastConfigurationLampManufacturerCommandParams.put(
        "value", ballastConfigurationlampManufacturerCommandParameterInfo);
    InteractionInfo writeBallastConfigurationLampManufacturerAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeLampManufacturerAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationLampManufacturerCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeLampManufacturerAttribute",
        writeBallastConfigurationLampManufacturerAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationLampRatedHoursCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationlampRatedHoursCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeBallastConfigurationLampRatedHoursCommandParams.put(
        "value", ballastConfigurationlampRatedHoursCommandParameterInfo);
    InteractionInfo writeBallastConfigurationLampRatedHoursAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeLampRatedHoursAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationLampRatedHoursCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeLampRatedHoursAttribute",
        writeBallastConfigurationLampRatedHoursAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationLampBurnHoursCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationlampBurnHoursCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeBallastConfigurationLampBurnHoursCommandParams.put(
        "value", ballastConfigurationlampBurnHoursCommandParameterInfo);
    InteractionInfo writeBallastConfigurationLampBurnHoursAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeLampBurnHoursAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationLampBurnHoursCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeLampBurnHoursAttribute",
        writeBallastConfigurationLampBurnHoursAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationLampAlarmModeCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationlampAlarmModeCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeBallastConfigurationLampAlarmModeCommandParams.put(
        "value", ballastConfigurationlampAlarmModeCommandParameterInfo);
    InteractionInfo writeBallastConfigurationLampAlarmModeAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeLampAlarmModeAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationLampAlarmModeCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeLampAlarmModeAttribute",
        writeBallastConfigurationLampAlarmModeAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeBallastConfigurationLampBurnHoursTripPointCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo ballastConfigurationlampBurnHoursTripPointCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeBallastConfigurationLampBurnHoursTripPointCommandParams.put(
        "value", ballastConfigurationlampBurnHoursTripPointCommandParameterInfo);
    InteractionInfo writeBallastConfigurationLampBurnHoursTripPointAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.BallastConfigurationCluster) cluster)
                  .writeLampBurnHoursTripPointAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeBallastConfigurationLampBurnHoursTripPointCommandParams);
    writeBallastConfigurationInteractionInfo.put(
        "writeLampBurnHoursTripPointAttribute",
        writeBallastConfigurationLampBurnHoursTripPointAttributeInteractionInfo);
    writeAttributeMap.put("ballastConfiguration", writeBallastConfigurationInteractionInfo);
    Map<String, InteractionInfo> writeIlluminanceMeasurementInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("illuminanceMeasurement", writeIlluminanceMeasurementInteractionInfo);
    Map<String, InteractionInfo> writeTemperatureMeasurementInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("temperatureMeasurement", writeTemperatureMeasurementInteractionInfo);
    Map<String, InteractionInfo> writePressureMeasurementInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("pressureMeasurement", writePressureMeasurementInteractionInfo);
    Map<String, InteractionInfo> writeFlowMeasurementInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("flowMeasurement", writeFlowMeasurementInteractionInfo);
    Map<String, InteractionInfo> writeRelativeHumidityMeasurementInteractionInfo =
        new LinkedHashMap<>();
    writeAttributeMap.put(
        "relativeHumidityMeasurement", writeRelativeHumidityMeasurementInteractionInfo);
    Map<String, InteractionInfo> writeOccupancySensingInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("occupancySensing", writeOccupancySensingInteractionInfo);
    Map<String, InteractionInfo> writeWakeOnLanInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("wakeOnLan", writeWakeOnLanInteractionInfo);
    Map<String, InteractionInfo> writeChannelInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("channel", writeChannelInteractionInfo);
    Map<String, InteractionInfo> writeTargetNavigatorInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("targetNavigator", writeTargetNavigatorInteractionInfo);
    Map<String, InteractionInfo> writeMediaPlaybackInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("mediaPlayback", writeMediaPlaybackInteractionInfo);
    Map<String, InteractionInfo> writeMediaInputInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("mediaInput", writeMediaInputInteractionInfo);
    Map<String, InteractionInfo> writeLowPowerInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("lowPower", writeLowPowerInteractionInfo);
    Map<String, InteractionInfo> writeKeypadInputInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("keypadInput", writeKeypadInputInteractionInfo);
    Map<String, InteractionInfo> writeContentLauncherInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeContentLauncherSupportedStreamingProtocolsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo contentLaunchersupportedStreamingProtocolsCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeContentLauncherSupportedStreamingProtocolsCommandParams.put(
        "value", contentLaunchersupportedStreamingProtocolsCommandParameterInfo);
    InteractionInfo writeContentLauncherSupportedStreamingProtocolsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.ContentLauncherCluster) cluster)
                  .writeSupportedStreamingProtocolsAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeContentLauncherSupportedStreamingProtocolsCommandParams);
    writeContentLauncherInteractionInfo.put(
        "writeSupportedStreamingProtocolsAttribute",
        writeContentLauncherSupportedStreamingProtocolsAttributeInteractionInfo);
    writeAttributeMap.put("contentLauncher", writeContentLauncherInteractionInfo);
    Map<String, InteractionInfo> writeAudioOutputInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("audioOutput", writeAudioOutputInteractionInfo);
    Map<String, InteractionInfo> writeApplicationLauncherInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("applicationLauncher", writeApplicationLauncherInteractionInfo);
    Map<String, InteractionInfo> writeApplicationBasicInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("applicationBasic", writeApplicationBasicInteractionInfo);
    Map<String, InteractionInfo> writeAccountLoginInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("accountLogin", writeAccountLoginInteractionInfo);
    Map<String, InteractionInfo> writeElectricalMeasurementInteractionInfo = new LinkedHashMap<>();
    writeAttributeMap.put("electricalMeasurement", writeElectricalMeasurementInteractionInfo);
    Map<String, InteractionInfo> writeTestClusterInteractionInfo = new LinkedHashMap<>();
    Map<String, CommandParameterInfo> writeTestClusterBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterbooleanCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeTestClusterBooleanCommandParams.put("value", testClusterbooleanCommandParameterInfo);
    InteractionInfo writeTestClusterBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeBooleanAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterBooleanCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeBooleanAttribute", writeTestClusterBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterBitmap8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterbitmap8CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterBitmap8CommandParams.put("value", testClusterbitmap8CommandParameterInfo);
    InteractionInfo writeTestClusterBitmap8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeBitmap8Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterBitmap8CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeBitmap8Attribute", writeTestClusterBitmap8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterBitmap16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterbitmap16CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterBitmap16CommandParams.put("value", testClusterbitmap16CommandParameterInfo);
    InteractionInfo writeTestClusterBitmap16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeBitmap16Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterBitmap16CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeBitmap16Attribute", writeTestClusterBitmap16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterBitmap32CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterbitmap32CommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterBitmap32CommandParams.put("value", testClusterbitmap32CommandParameterInfo);
    InteractionInfo writeTestClusterBitmap32AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeBitmap32Attribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterBitmap32CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeBitmap32Attribute", writeTestClusterBitmap32AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterBitmap64CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterbitmap64CommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterBitmap64CommandParams.put("value", testClusterbitmap64CommandParameterInfo);
    InteractionInfo writeTestClusterBitmap64AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeBitmap64Attribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterBitmap64CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeBitmap64Attribute", writeTestClusterBitmap64AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint8uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterInt8uCommandParams.put("value", testClusterint8uCommandParameterInfo);
    InteractionInfo writeTestClusterInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt8uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt8uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt8uAttribute", writeTestClusterInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint16uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterInt16uCommandParams.put("value", testClusterint16uCommandParameterInfo);
    InteractionInfo writeTestClusterInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt16uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt16uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt16uAttribute", writeTestClusterInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt24uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint24uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt24uCommandParams.put("value", testClusterint24uCommandParameterInfo);
    InteractionInfo writeTestClusterInt24uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt24uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt24uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt24uAttribute", writeTestClusterInt24uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt32uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint32uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt32uCommandParams.put("value", testClusterint32uCommandParameterInfo);
    InteractionInfo writeTestClusterInt32uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt32uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt32uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt32uAttribute", writeTestClusterInt32uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt40uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint40uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt40uCommandParams.put("value", testClusterint40uCommandParameterInfo);
    InteractionInfo writeTestClusterInt40uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt40uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt40uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt40uAttribute", writeTestClusterInt40uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt48uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint48uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt48uCommandParams.put("value", testClusterint48uCommandParameterInfo);
    InteractionInfo writeTestClusterInt48uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt48uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt48uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt48uAttribute", writeTestClusterInt48uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt56uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint56uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt56uCommandParams.put("value", testClusterint56uCommandParameterInfo);
    InteractionInfo writeTestClusterInt56uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt56uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt56uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt56uAttribute", writeTestClusterInt56uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt64uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint64uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt64uCommandParams.put("value", testClusterint64uCommandParameterInfo);
    InteractionInfo writeTestClusterInt64uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt64uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt64uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt64uAttribute", writeTestClusterInt64uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint8sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterInt8sCommandParams.put("value", testClusterint8sCommandParameterInfo);
    InteractionInfo writeTestClusterInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt8sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt8sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt8sAttribute", writeTestClusterInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint16sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterInt16sCommandParams.put("value", testClusterint16sCommandParameterInfo);
    InteractionInfo writeTestClusterInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt16sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt16sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt16sAttribute", writeTestClusterInt16sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt24sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint24sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt24sCommandParams.put("value", testClusterint24sCommandParameterInfo);
    InteractionInfo writeTestClusterInt24sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt24sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt24sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt24sAttribute", writeTestClusterInt24sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt32sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint32sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt32sCommandParams.put("value", testClusterint32sCommandParameterInfo);
    InteractionInfo writeTestClusterInt32sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt32sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt32sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt32sAttribute", writeTestClusterInt32sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt40sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint40sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt40sCommandParams.put("value", testClusterint40sCommandParameterInfo);
    InteractionInfo writeTestClusterInt40sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt40sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt40sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt40sAttribute", writeTestClusterInt40sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt48sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint48sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt48sCommandParams.put("value", testClusterint48sCommandParameterInfo);
    InteractionInfo writeTestClusterInt48sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt48sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt48sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt48sAttribute", writeTestClusterInt48sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt56sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint56sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt56sCommandParams.put("value", testClusterint56sCommandParameterInfo);
    InteractionInfo writeTestClusterInt56sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt56sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt56sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt56sAttribute", writeTestClusterInt56sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterInt64sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterint64sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterInt64sCommandParams.put("value", testClusterint64sCommandParameterInfo);
    InteractionInfo writeTestClusterInt64sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeInt64sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterInt64sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeInt64sAttribute", writeTestClusterInt64sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterEnum8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterenum8CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterEnum8CommandParams.put("value", testClusterenum8CommandParameterInfo);
    InteractionInfo writeTestClusterEnum8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeEnum8Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterEnum8CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeEnum8Attribute", writeTestClusterEnum8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterEnum16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterenum16CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterEnum16CommandParams.put("value", testClusterenum16CommandParameterInfo);
    InteractionInfo writeTestClusterEnum16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeEnum16Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterEnum16CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeEnum16Attribute", writeTestClusterEnum16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterFloatSingleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterfloatSingleCommandParameterInfo =
        new CommandParameterInfo("value", Float.class, Float.class);
    writeTestClusterFloatSingleCommandParams.put(
        "value", testClusterfloatSingleCommandParameterInfo);
    InteractionInfo writeTestClusterFloatSingleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeFloatSingleAttribute(
                      (DefaultClusterCallback) callback, (Float) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterFloatSingleCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeFloatSingleAttribute", writeTestClusterFloatSingleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterFloatDoubleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterfloatDoubleCommandParameterInfo =
        new CommandParameterInfo("value", Double.class, Double.class);
    writeTestClusterFloatDoubleCommandParams.put(
        "value", testClusterfloatDoubleCommandParameterInfo);
    InteractionInfo writeTestClusterFloatDoubleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeFloatDoubleAttribute(
                      (DefaultClusterCallback) callback, (Double) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterFloatDoubleCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeFloatDoubleAttribute", writeTestClusterFloatDoubleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusteroctetStringCommandParameterInfo =
        new CommandParameterInfo("value", byte[].class, byte[].class);
    writeTestClusterOctetStringCommandParams.put(
        "value", testClusteroctetStringCommandParameterInfo);
    InteractionInfo writeTestClusterOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeOctetStringAttribute(
                      (DefaultClusterCallback) callback, (byte[]) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterOctetStringCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeOctetStringAttribute", writeTestClusterOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterLongOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterlongOctetStringCommandParameterInfo =
        new CommandParameterInfo("value", byte[].class, byte[].class);
    writeTestClusterLongOctetStringCommandParams.put(
        "value", testClusterlongOctetStringCommandParameterInfo);
    InteractionInfo writeTestClusterLongOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeLongOctetStringAttribute(
                      (DefaultClusterCallback) callback, (byte[]) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterLongOctetStringCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeLongOctetStringAttribute", writeTestClusterLongOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterCharStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClustercharStringCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeTestClusterCharStringCommandParams.put("value", testClustercharStringCommandParameterInfo);
    InteractionInfo writeTestClusterCharStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeCharStringAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterCharStringCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeCharStringAttribute", writeTestClusterCharStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterLongCharStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterlongCharStringCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeTestClusterLongCharStringCommandParams.put(
        "value", testClusterlongCharStringCommandParameterInfo);
    InteractionInfo writeTestClusterLongCharStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeLongCharStringAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterLongCharStringCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeLongCharStringAttribute", writeTestClusterLongCharStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterEpochUsCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterepochUsCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterEpochUsCommandParams.put("value", testClusterepochUsCommandParameterInfo);
    InteractionInfo writeTestClusterEpochUsAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeEpochUsAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterEpochUsCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeEpochUsAttribute", writeTestClusterEpochUsAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterEpochSCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterepochSCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterEpochSCommandParams.put("value", testClusterepochSCommandParameterInfo);
    InteractionInfo writeTestClusterEpochSAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeEpochSAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterEpochSCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeEpochSAttribute", writeTestClusterEpochSAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterVendorIdCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClustervendorIdCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterVendorIdCommandParams.put("value", testClustervendorIdCommandParameterInfo);
    InteractionInfo writeTestClusterVendorIdAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeVendorIdAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterVendorIdCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeVendorIdAttribute", writeTestClusterVendorIdAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterEnumAttrCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterenumAttrCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterEnumAttrCommandParams.put("value", testClusterenumAttrCommandParameterInfo);
    InteractionInfo writeTestClusterEnumAttrAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeEnumAttrAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterEnumAttrCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeEnumAttrAttribute", writeTestClusterEnumAttrAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterRangeRestrictedInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterrangeRestrictedInt8uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterRangeRestrictedInt8uCommandParams.put(
        "value", testClusterrangeRestrictedInt8uCommandParameterInfo);
    InteractionInfo writeTestClusterRangeRestrictedInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeRangeRestrictedInt8uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterRangeRestrictedInt8uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeRangeRestrictedInt8uAttribute",
        writeTestClusterRangeRestrictedInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterRangeRestrictedInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterrangeRestrictedInt8sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterRangeRestrictedInt8sCommandParams.put(
        "value", testClusterrangeRestrictedInt8sCommandParameterInfo);
    InteractionInfo writeTestClusterRangeRestrictedInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeRangeRestrictedInt8sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterRangeRestrictedInt8sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeRangeRestrictedInt8sAttribute",
        writeTestClusterRangeRestrictedInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterRangeRestrictedInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterrangeRestrictedInt16uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterRangeRestrictedInt16uCommandParams.put(
        "value", testClusterrangeRestrictedInt16uCommandParameterInfo);
    InteractionInfo writeTestClusterRangeRestrictedInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeRangeRestrictedInt16uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterRangeRestrictedInt16uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeRangeRestrictedInt16uAttribute",
        writeTestClusterRangeRestrictedInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterRangeRestrictedInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterrangeRestrictedInt16sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterRangeRestrictedInt16sCommandParams.put(
        "value", testClusterrangeRestrictedInt16sCommandParameterInfo);
    InteractionInfo writeTestClusterRangeRestrictedInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeRangeRestrictedInt16sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterRangeRestrictedInt16sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeRangeRestrictedInt16sAttribute",
        writeTestClusterRangeRestrictedInt16sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterTimedWriteBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClustertimedWriteBooleanCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeTestClusterTimedWriteBooleanCommandParams.put(
        "value", testClustertimedWriteBooleanCommandParameterInfo);
    InteractionInfo writeTestClusterTimedWriteBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeTimedWriteBooleanAttribute(
                      (DefaultClusterCallback) callback,
                      (Boolean) commandArguments.get("value"),
                      10000);
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterTimedWriteBooleanCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeTimedWriteBooleanAttribute",
        writeTestClusterTimedWriteBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterGeneralErrorBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClustergeneralErrorBooleanCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeTestClusterGeneralErrorBooleanCommandParams.put(
        "value", testClustergeneralErrorBooleanCommandParameterInfo);
    InteractionInfo writeTestClusterGeneralErrorBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeGeneralErrorBooleanAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterGeneralErrorBooleanCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeGeneralErrorBooleanAttribute",
        writeTestClusterGeneralErrorBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterClusterErrorBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterclusterErrorBooleanCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeTestClusterClusterErrorBooleanCommandParams.put(
        "value", testClusterclusterErrorBooleanCommandParameterInfo);
    InteractionInfo writeTestClusterClusterErrorBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeClusterErrorBooleanAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterClusterErrorBooleanCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeClusterErrorBooleanAttribute",
        writeTestClusterClusterErrorBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterUnsupportedCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusterunsupportedCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeTestClusterUnsupportedCommandParams.put(
        "value", testClusterunsupportedCommandParameterInfo);
    InteractionInfo writeTestClusterUnsupportedAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeUnsupportedAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterUnsupportedCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeUnsupportedAttribute", writeTestClusterUnsupportedAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableBooleanCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableBooleanCommandParameterInfo =
        new CommandParameterInfo("value", Boolean.class, Boolean.class);
    writeTestClusterNullableBooleanCommandParams.put(
        "value", testClusternullableBooleanCommandParameterInfo);
    InteractionInfo writeTestClusterNullableBooleanAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableBooleanAttribute(
                      (DefaultClusterCallback) callback, (Boolean) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableBooleanCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableBooleanAttribute", writeTestClusterNullableBooleanAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableBitmap8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableBitmap8CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableBitmap8CommandParams.put(
        "value", testClusternullableBitmap8CommandParameterInfo);
    InteractionInfo writeTestClusterNullableBitmap8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableBitmap8Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableBitmap8CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableBitmap8Attribute", writeTestClusterNullableBitmap8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableBitmap16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableBitmap16CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableBitmap16CommandParams.put(
        "value", testClusternullableBitmap16CommandParameterInfo);
    InteractionInfo writeTestClusterNullableBitmap16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableBitmap16Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableBitmap16CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableBitmap16Attribute", writeTestClusterNullableBitmap16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableBitmap32CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableBitmap32CommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableBitmap32CommandParams.put(
        "value", testClusternullableBitmap32CommandParameterInfo);
    InteractionInfo writeTestClusterNullableBitmap32AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableBitmap32Attribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableBitmap32CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableBitmap32Attribute", writeTestClusterNullableBitmap32AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableBitmap64CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableBitmap64CommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableBitmap64CommandParams.put(
        "value", testClusternullableBitmap64CommandParameterInfo);
    InteractionInfo writeTestClusterNullableBitmap64AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableBitmap64Attribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableBitmap64CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableBitmap64Attribute", writeTestClusterNullableBitmap64AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt8uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableInt8uCommandParams.put(
        "value", testClusternullableInt8uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt8uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt8uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt8uAttribute", writeTestClusterNullableInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt16uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableInt16uCommandParams.put(
        "value", testClusternullableInt16uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt16uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt16uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt16uAttribute", writeTestClusterNullableInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt24uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt24uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt24uCommandParams.put(
        "value", testClusternullableInt24uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt24uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt24uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt24uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt24uAttribute", writeTestClusterNullableInt24uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt32uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt32uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt32uCommandParams.put(
        "value", testClusternullableInt32uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt32uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt32uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt32uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt32uAttribute", writeTestClusterNullableInt32uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt40uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt40uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt40uCommandParams.put(
        "value", testClusternullableInt40uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt40uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt40uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt40uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt40uAttribute", writeTestClusterNullableInt40uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt48uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt48uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt48uCommandParams.put(
        "value", testClusternullableInt48uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt48uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt48uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt48uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt48uAttribute", writeTestClusterNullableInt48uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt56uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt56uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt56uCommandParams.put(
        "value", testClusternullableInt56uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt56uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt56uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt56uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt56uAttribute", writeTestClusterNullableInt56uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt64uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt64uCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt64uCommandParams.put(
        "value", testClusternullableInt64uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt64uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt64uAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt64uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt64uAttribute", writeTestClusterNullableInt64uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt8sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableInt8sCommandParams.put(
        "value", testClusternullableInt8sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt8sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt8sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt8sAttribute", writeTestClusterNullableInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt16sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableInt16sCommandParams.put(
        "value", testClusternullableInt16sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt16sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt16sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt16sAttribute", writeTestClusterNullableInt16sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt24sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt24sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt24sCommandParams.put(
        "value", testClusternullableInt24sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt24sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt24sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt24sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt24sAttribute", writeTestClusterNullableInt24sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt32sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt32sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt32sCommandParams.put(
        "value", testClusternullableInt32sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt32sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt32sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt32sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt32sAttribute", writeTestClusterNullableInt32sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt40sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt40sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt40sCommandParams.put(
        "value", testClusternullableInt40sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt40sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt40sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt40sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt40sAttribute", writeTestClusterNullableInt40sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt48sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt48sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt48sCommandParams.put(
        "value", testClusternullableInt48sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt48sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt48sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt48sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt48sAttribute", writeTestClusterNullableInt48sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt56sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt56sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt56sCommandParams.put(
        "value", testClusternullableInt56sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt56sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt56sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt56sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt56sAttribute", writeTestClusterNullableInt56sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableInt64sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableInt64sCommandParameterInfo =
        new CommandParameterInfo("value", Long.class, Long.class);
    writeTestClusterNullableInt64sCommandParams.put(
        "value", testClusternullableInt64sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableInt64sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableInt64sAttribute(
                      (DefaultClusterCallback) callback, (Long) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableInt64sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableInt64sAttribute", writeTestClusterNullableInt64sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableEnum8CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableEnum8CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableEnum8CommandParams.put(
        "value", testClusternullableEnum8CommandParameterInfo);
    InteractionInfo writeTestClusterNullableEnum8AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableEnum8Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableEnum8CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableEnum8Attribute", writeTestClusterNullableEnum8AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableEnum16CommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableEnum16CommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableEnum16CommandParams.put(
        "value", testClusternullableEnum16CommandParameterInfo);
    InteractionInfo writeTestClusterNullableEnum16AttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableEnum16Attribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableEnum16CommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableEnum16Attribute", writeTestClusterNullableEnum16AttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableFloatSingleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableFloatSingleCommandParameterInfo =
        new CommandParameterInfo("value", Float.class, Float.class);
    writeTestClusterNullableFloatSingleCommandParams.put(
        "value", testClusternullableFloatSingleCommandParameterInfo);
    InteractionInfo writeTestClusterNullableFloatSingleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableFloatSingleAttribute(
                      (DefaultClusterCallback) callback, (Float) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableFloatSingleCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableFloatSingleAttribute",
        writeTestClusterNullableFloatSingleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableFloatDoubleCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableFloatDoubleCommandParameterInfo =
        new CommandParameterInfo("value", Double.class, Double.class);
    writeTestClusterNullableFloatDoubleCommandParams.put(
        "value", testClusternullableFloatDoubleCommandParameterInfo);
    InteractionInfo writeTestClusterNullableFloatDoubleAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableFloatDoubleAttribute(
                      (DefaultClusterCallback) callback, (Double) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableFloatDoubleCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableFloatDoubleAttribute",
        writeTestClusterNullableFloatDoubleAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableOctetStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableOctetStringCommandParameterInfo =
        new CommandParameterInfo("value", byte[].class, byte[].class);
    writeTestClusterNullableOctetStringCommandParams.put(
        "value", testClusternullableOctetStringCommandParameterInfo);
    InteractionInfo writeTestClusterNullableOctetStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableOctetStringAttribute(
                      (DefaultClusterCallback) callback, (byte[]) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableOctetStringCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableOctetStringAttribute",
        writeTestClusterNullableOctetStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableCharStringCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableCharStringCommandParameterInfo =
        new CommandParameterInfo("value", String.class, String.class);
    writeTestClusterNullableCharStringCommandParams.put(
        "value", testClusternullableCharStringCommandParameterInfo);
    InteractionInfo writeTestClusterNullableCharStringAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableCharStringAttribute(
                      (DefaultClusterCallback) callback, (String) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableCharStringCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableCharStringAttribute",
        writeTestClusterNullableCharStringAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableEnumAttrCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableEnumAttrCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableEnumAttrCommandParams.put(
        "value", testClusternullableEnumAttrCommandParameterInfo);
    InteractionInfo writeTestClusterNullableEnumAttrAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableEnumAttrAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableEnumAttrCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableEnumAttrAttribute", writeTestClusterNullableEnumAttrAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableRangeRestrictedInt8uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableRangeRestrictedInt8uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableRangeRestrictedInt8uCommandParams.put(
        "value", testClusternullableRangeRestrictedInt8uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableRangeRestrictedInt8uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableRangeRestrictedInt8uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableRangeRestrictedInt8uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableRangeRestrictedInt8uAttribute",
        writeTestClusterNullableRangeRestrictedInt8uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableRangeRestrictedInt8sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableRangeRestrictedInt8sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableRangeRestrictedInt8sCommandParams.put(
        "value", testClusternullableRangeRestrictedInt8sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableRangeRestrictedInt8sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableRangeRestrictedInt8sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableRangeRestrictedInt8sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableRangeRestrictedInt8sAttribute",
        writeTestClusterNullableRangeRestrictedInt8sAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableRangeRestrictedInt16uCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableRangeRestrictedInt16uCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableRangeRestrictedInt16uCommandParams.put(
        "value", testClusternullableRangeRestrictedInt16uCommandParameterInfo);
    InteractionInfo writeTestClusterNullableRangeRestrictedInt16uAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableRangeRestrictedInt16uAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableRangeRestrictedInt16uCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableRangeRestrictedInt16uAttribute",
        writeTestClusterNullableRangeRestrictedInt16uAttributeInteractionInfo);
    Map<String, CommandParameterInfo> writeTestClusterNullableRangeRestrictedInt16sCommandParams =
        new LinkedHashMap<String, CommandParameterInfo>();
    CommandParameterInfo testClusternullableRangeRestrictedInt16sCommandParameterInfo =
        new CommandParameterInfo("value", Integer.class, Integer.class);
    writeTestClusterNullableRangeRestrictedInt16sCommandParams.put(
        "value", testClusternullableRangeRestrictedInt16sCommandParameterInfo);
    InteractionInfo writeTestClusterNullableRangeRestrictedInt16sAttributeInteractionInfo =
        new InteractionInfo(
            (cluster, callback, commandArguments) -> {
              ((ChipClusters.TestClusterCluster) cluster)
                  .writeNullableRangeRestrictedInt16sAttribute(
                      (DefaultClusterCallback) callback, (Integer) commandArguments.get("value"));
            },
            () -> new ClusterInfoMapping.DelegatedDefaultClusterCallback(),
            writeTestClusterNullableRangeRestrictedInt16sCommandParams);
    writeTestClusterInteractionInfo.put(
        "writeNullableRangeRestrictedInt16sAttribute",
        writeTestClusterNullableRangeRestrictedInt16sAttributeInteractionInfo);
    writeAttributeMap.put("testCluster", writeTestClusterInteractionInfo);
    return writeAttributeMap;
  }
}
